gpt4 book ai didi

java - 使用 Java (Unix) 中的 Process Builder 在一行中执行 shell 脚本多个命令

转载 作者:行者123 更新时间:2023-11-30 05:24:07 27 4
gpt4 key购买 nike

我有一个 shell 脚本,我想从 java 执行它。

sudo su - username -c "ssh -t remote_hostname df -k"

当您从命令提示符运行时,此 shell 脚本工作正常。但是,当我使用流程生成器时,它不会返回任何内容。如果我执行以下操作:sudo su - 用户名 -c ssh -t 远程主机名;df -k

那么该命令将在我的本地计算机上运行,​​而不是在远程计算机上运行。

感谢任何反馈。

<小时/>

java代码

Process p;

ExecutorService es = null;
try {

p = Runtime.getRuntime().exec(test1.sh);

StreamGobbler sg = new StreamGobbler(p.getInputStream(), System.out::println());

es = Executors.newSingleThreadExecutor();

es.submt(sg);

int exitCode = p.waitfor();

assert exitCode == 0;

es.shutdown();


} catch (....) {
}

最佳答案

Runtime.exec(String) 不是 shell,特别是不能像 shell 那样解析和处理引号。骗子:
Why does Runtime.exec(String) work for some but not all commands?
Whitespace in bash path with java
Keytool command does not work when invoked with Java

做类似的事情

String[] cmd = { "sudo", "su", "-", "username", "-c", "ssh -t remote_hostname df -k" };
// note the last element is a single Java String that does not _contain_
// any quote characters (which would be backslashed in Java source)
... Runtime.getRuntime().exec(cmd) ...

此外,在远程处理 df -k 时,您不应该需要 -t ——它不执行任何特殊的输出处理。 (尽管它没有什么坏处,而且几乎是免费的。)

关于java - 使用 Java (Unix) 中的 Process Builder 在一行中执行 shell 脚本多个命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59002993/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com