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

How do I Remotely shutdown another computer using java

我在虚拟盒子里连接了两台机器。我知道机器已连接,因为我能够检测到目标 windows 机器

的 os

目标:使用一台机器关闭目标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. 相对路径在 runtime.exec 中通常不是一个好主意。您几乎无法控制路径;一个更好的选择是通过 System.getenv 获取 windows 主目录并创建你自己的到 C:\Windows\System32 或任何 'shutdown.exe' 所在的路径。

  2. 通常这需要管理员访问权限,因此您想要的可能无法实现,或者可能需要以管理员权限启动 java。

  3. 一般不用exec,用ProcessBuilder。试图了解 args 的拆分方式与基本的 exec.

    相当混乱
  4. 中的java,字符串中的\为转义单。 "\" 是一个包含 只有一个反斜杠的字符串 ,但是你想在这里向 windows 发送 2 个反斜杠,所以,在 java 中,你会写 "\\" + ip.

  5. exec returns 一个 Process 对象,你告诉它合并输出和错误,然后你可以获取输出和错误流。这有很大帮助:在这种情况下,毫无疑问 shutdown.exe 告诉您另一台计算机的规格是错误的(实际上是由于缺少反斜杠),但您从未阅读过此数据。网络搜索 'ProcessBuilder java example read output' 可能会为您提供多个深入的帖子。