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