如何使用java远程关闭另一台计算机



我已经在虚拟箱中连接了两台机器。我知道机器是连接的,因为我能够检测到目标窗口机器的操作系统

目标:使用一台机器使用接受用户输入的java程序关闭目标windows机器: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. 相对路径在runtime.exec中通常是个坏主意。你几乎无法控制这条路;一个更好的选择是通过System.getenv获取windows主目录,并制定自己的路径到C:\windows\System32,或"shutdown.exe"所在的位置。

  2. 通常这需要管理员访问权限,所以您想要的可能是不可能的,或者可能需要使用管理员权限启动java。

  3. 一般来说,不要使用exec,而是使用ProcessBuilder。尝试导航args的拆分方式与基本的exec相当混淆。

  4. 在java中,字符串中的是转义单。"\"是一个仅包含一个反斜杠的字符串,但您希望在此处向窗口发送两个反斜杠,因此,在java中,您应该编写"\\" + ip

  5. exec返回一个Process对象,您告诉它将输出和错误组合起来,然后您可以获取输出和错误流。这有很大帮助:在这种情况下,毫无疑问,shutdown.exe告诉您另一台计算机的规范是错误的(实际上是由于缺少反斜杠(,但您从未读取过这些数据。在网上搜索"ProcessBuilderjava示例读取输出"可能会得到多篇深入的帖子。

最新更新