使用Java远程运行命令

时间:2017-10-07 00:36:56

标签: java ssh

我需要使用java远程运行命令。如果我在命令行中运行它,但在java中不运行该命令。

命令

import java.io.*;

public class JavaKillScriptCommand {
   public static void main(String args[]) {

   String node = "1.2.3.4";
   try{
     Process p = Runtime.getRuntime().exec("ssh " + node + " -t 'pkill script.sh'");
   } catch (IOException e){
     System.out.print("'pkill script.sh' command through an exception");
     }
  }
}

Java代码

git rev-list --objects --all \
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \
| awk '/^blob/ {print substr($0,6)}' \
| sort --numeric-sort --key=2 \
| cut --complement --characters=13-40 \
| numfmt --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest

任何帮助?

1 个答案:

答案 0 :(得分:0)

添加:neardupe Why does Runtime.exec(String) work for some but not all commands?
Java Runtime.getRuntime().exec(cmd) command contain single quote

Single<Post.List> postsRecent = getRecentPosts() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); Single<Post.List> postsPopular = getPopularPosts() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); 与向shell输入命令不同。它不会像shell那样解释引号,而是在所有空格中标记,“引用”或不引用。 (它也不处理重定向,管道,所有类型的多个命令,参数(也称为变量),进程替换,内置函数,函数和别名。)通常,要获得特定的标记化,您应该使用其中一个重载{{ 1}}或(通常更好)Runtime.exec(String)

但在这种情况下String[]不要求远程命令是单个参数;它接受多个参数,所以

ProcessBuilder
只要名称ssh不包含shell特有的任何字符,

就可以工作。 (显然假设你能够自动地例如publickey在你的默认=相同或ssh配置的id下对目标进行身份验证,并且该id有权终止任何相关的script.sh进程。)

只有启动指定的程序(此处为ssh)才会抛出Java异常;在程序执行期间发生的任何错误 - 例如连接到目标或运行命令时遇到的错误ssh - 都会在stderr或stdout( Runtime.exec ("ssh " + node + " -t pkill script.sh"); script.sh)上报告和/或或者在流程'退出状态(.getErrorStream())中,您忽略了所有这些。而且,过去的投掷时态并没有通过。