![](/img/trans.png)
[英]How to run SSH commands on remote system through java program (followup)
[英]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.