我需要使用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
任何帮助?
答案 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()
)中,您忽略了所有这些。而且,过去的投掷时态并没有通过。