Как удаленно выключить другой компьютер с помощью java

#java #network-programming

Вопрос:

Я подключил две машины в виртуальном ящике. Я знаю, что машины подключены, потому что мне удалось определить операционную систему целевой машины Windows

Цель: Используйте одну машину для выключения целевой машины Windows с помощью программы java, которая принимает пользовательский ввод: ip

Проблема : Когда программа выполняется, она пропускает

 runtime.exec("shutdown /m /t0 \"  ip);
 

Поэтому он не выключает целевой компьютер.

Вопрос: Почему это происходит и как я могу решить проблему?

 import java.io.IOException;
import java.util.Scanner;
public class RemoteShutdown
{


    /*Shutdown user's computer*/
    public void shutdown(String ip )
    {
        Runtime runtime = Runtime.getRuntime();
      
            try
            {
                runtime.exec("shutdown /s  /m \"  ip);
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }

       
    }

    public static void main(String[] args) throws Exception
    {
        Scanner scanner = new Scanner(System.in);
        RemoteShutdown shutDown = new RemoteShutdown();

        System.out.print("Enter computer IP: ");
        String IP = scanner.next().trim();

        shutDown.shutdown(IP);

    }

}
 

Комментарии:

1. Вам нужны четыре обратные косые черты: две для компилятора и две для команды.

Ответ №1:

  1. относительные пути обычно являются плохой идеей runtime.exec . У вас мало контроля над путем; лучшим вариантом было бы получить каталог Windows home через System.getenv и создать свой собственный маршрут к C:WindowsSystem32, или где бы то ни было ‘shutdown.exe — жизни.
  2. Обычно для этого требуется доступ администратора, поэтому то, что вы хотите, может оказаться невозможным или может потребовать запуска java с правами администратора.
  3. Как правило, не используйте exec, а используйте ProcessBuilder . Попытка сориентироваться в том, как разделяются аргументы, довольно запутана только с базовыми exec .
  4. В java в строке находится escape-сингл. "\" это строка, содержащая только одну обратную косую черту, но вы хотите отправить 2 обратные косые черты в Windows здесь, поэтому на java вы бы написали "\\" ip .
  5. exec возвращает объект процесса, и вы указываете ему объединить вывод и ошибку, а затем вы можете получить потоки вывода и ошибок. Это очень помогает: в данном случае, без сомнения shutdown.exe , говорит вам, что спецификация другого компьютера ошибочна (по сути, из-за отсутствия обратной косой черты), но вы никогда не читали эти данные. Поиск в Интернете по запросу «Вывод для чтения примера java ProcessBuilder», вероятно, даст вам несколько подробных сообщений.