簡體   English   中英

如何通過Java在SSH中運行多個命令?

[英]How do I run multiple commands in SSH through Java?

如何使用Java運行時在SSH中運行多個命令?

命令: ssh user@127.0.0.1'export MYVAR = this / dir / is / cool; / run / my / script / myscript; 回聲$ MYVAR'

@Test
  public void testSSHcmd() throws Exception
  {
    StringBuilder cmd = new StringBuilder();

    cmd.append("ssh ");
    cmd.append("user@127.0.0.1 ");
    cmd.append("'export ");
    cmd.append("MYVAR=this/dir/is/cool; ");
    cmd.append("/run/my/script/myScript; ");
    cmd.append("echo $MYVAR'");

    Process p = Runtime.getRuntime().exec(cmd.toString());
  }

該命令本身可以運行,但在嘗試從Java運行時執行時卻無效。 有什么建議或建議嗎?

使用更新的ProcessBuilder類而不是Runtime.exec 您可以通過指定程序及其參數列表來構造一個,如下面的代碼所示。 您無需在命令周圍使用單引號。 您還應該閱讀stdout和stderr流以及waitFor以完成該過程。

ProcessBuilder pb = new ProcessBuilder("ssh", 
                                       "user@127.0.0.1", 
                                       "export MYVAR=this/dir/is/cool; /run/my/script/myScript; echo $MYVAR");
pb.redirectErrorStream(); //redirect stderr to stdout
Process process = pb.start();
InputStream inputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line = null;
while((line = reader.readLine())!= null) {
    System.out.println(line);
}
process.waitFor();

您正在調用的Runtime.exec將命令字符串分成幾個令牌,然后將這些令牌傳遞給ssh。 您需要的是可以提供字符串數組的變體之一。 將完整的遠程部分放入一個參數中,同時去除外部引號。

Runtime.exec(new String[]{ 
    "ssh", 
    "user@127.0.0.1", 
    "export MYVAR=this/dir/is/cool; /run/my/script/myScript; echo $MYVAR"
});

而已。

如果Process剛剛掛起,我懷疑/run/my/script/myScript某些/run/my/script/myScript輸出到stderr 您需要處理該輸出以及stdout

public static void main(String[] args) throws Exception {
    String[] cmd = {"ssh", "root@localhost", "'ls asd; ls'" };
    final Process p = Runtime.getRuntime().exec(cmd);

    // ignore all errors (print to std err)
    new Thread() {
        @Override
        public void run() {
            try {
                BufferedReader err = new BufferedReader(
                        new InputStreamReader(p.getErrorStream()));
                String in;
                while((in = err.readLine()) != null)
                    System.err.println(in);
                err.close();
            } catch (IOException e) {}
        }
    }.start();

    // handle std out
    InputStreamReader isr = new InputStreamReader(p.getInputStream());
    BufferedReader reader = new BufferedReader(isr);

    StringBuilder ret = new StringBuilder();
    char[] data = new char[1024];
    int read;
    while ((read = reader.read(data)) != -1)
        ret.append(data, 0, read);
    reader.close();

    // wait for the exit code
    int exitCode = p.waitFor();
}

這是正確的方法:

Runtime rt=Runtime.getRuntime();
rt.exec("cmd.exe /c start <full path>");

例如:

Runtime rt=Runtime.getRuntime();
rt.exec("cmd.exe /c start C:/aa.txt");

如果您正在使用https://github.com/shikhar/sshj/中的 SSHJ

public static void main(String[] args) throws IOException {
    final SSHClient ssh = new SSHClient();
    ssh.loadKnownHosts();

    ssh.connect("10.x.x.x");
    try {
        //ssh.authPublickey(System.getProperty("root"));
        ssh.authPassword("user", "xxxx");
        final Session session = ssh.startSession();

        try {
            final Command cmd = session.exec("cd /backup; ls; ./backup.sh");
            System.out.println(IOUtils.readFully(cmd.getInputStream()).toString());
            cmd.join(5, TimeUnit.SECONDS);
            System.out.println("\n** exit status: " + cmd.getExitStatus());
        } finally {
            session.close();
        }
    } finally {
        ssh.disconnect();
    }
}

您可能想看一下JSch庫。 它允許您使用遠程主機執行各種SSH事情,包括執行命令和腳本。

他們在此處列出了示例: http : //www.jcraft.com/jsch/examples/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM