如何从Java ProcessBuilder执行这样的命令(使用sudo)? (我不需要包含密码,因为普通用户有权以root身份运行myscript.log而无需密码。)
sudo bash /home/me/path/myscript.sh arg1 arg2 arg3 >> /var/log/path/myscript.log 2>&1
我的问题是这个命令的元素如何传递到Java ProcessBuilder
的构造函数中?
例如,“sudo”是ProcessBuilder
ctor,最后一个或其他地方的第一个参数吗?你怎么知道他们去哪里以及命令的哪些元素成为ProcessBuilder
的参数?
答案 0 :(得分:4)
这里的问题是重定向不会在你正在调用的bash命令中执行。
尝试使用传递命令以字符串形式执行,使用bash的-c选项:
sudo bash -c "/home/me/path/myscript.sh arg1 arg2 arg3 >> /var/log/path/myscript.log 2>&1"
为了在这个命令中使用java ProcessBuilder,我会尝试像这样构造它:
new ProcessBuilder("sudo", "bash", "-c", "/home/me/path/myscript.sh arg1 arg2 arg3 >> /var/log/path/myscript.log 2>&1");
通过使用ProcessBuilder,您基本上要求它执行命令sudo并为其提供3个参数。作为回报,sudo将调用您的命令:bash -c "..."
。
当进程提示输入sudo密码时,您可能仍会遇到问题。