【发布时间】:2016-11-03 14:25:48
【问题描述】:
我正在使用 bash 脚本。
此 bash 脚本必须使用 sudo -u (B) cmd 运行命令。
我使用用户 A 执行此脚本。
在我的/etc/sudoers 中,我声明了所有命令。
当我使用终端执行它时,一切都很好。
当我在 tomcat 服务器中使用 java 程序执行它时,我出错了。
我如何从我的 java 程序中执行我的脚本:
command = "/path/my-script.sh arg1"
private String executeCommand(String command) {
StringBuffer output = new StringBuffer();
Process p;
try {
p = Runtime.getRuntime().exec(command);
p.waitFor();
BufferedReader reader =
new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine())!= null) {
output.append(line + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
return output.toString();
}
在这两种情况下(终端或 Java 程序)我都执行这些命令:
user=$(whoami)
echo "[INFO]: user = $user"
结果:[INFO]: user = A
mkdircmd=$(sudo -u B mkdir -p $project_path)
return_mkdircmd=$?
echo "[INFO]: mkdircmd: $mkdircmd / return mkdircmd: $return_mkdircmd"
cpcmd=$(sudo -u B cp $file_path $project_path)
return_cpcmd=$?
echo "[INFO]: cpcmd: $cpcmd / return cpcmd: $return_cpcmd"
结果:
使用Tomcat服务器执行脚本
[INFO]: mkdircmd: / return mkdircmd: 1
[INFO]: cpcmd: / return cpcmd: 1
使用终端执行脚本 (./myscript)
[INFO]: mkdircmd: / return mkdircmd: 0
[INFO]: cpcmd: / return cpcmd: 0
有人可以帮我找出我的问题在哪里?
谢谢
【问题讨论】:
-
您的 tomcat 服务器是否使用用户 ID A 运行?如果它以其他用户身份运行,您的 sudoers 文件可能不允许它执行无密码 sudo。只是一个想法。
-
是的,确实如此,因为我正在运行 whoami 命令,结果是 A
-
用户
A是否有在尝试呼叫sudo时必须输入的密码?也许它在命令行上运行,因为您已经提供了密码并且它已为该会话缓存。尝试打开一个新的 shell 会话并使用sudo运行相同的脚本(或执行sudo -k并重新运行您的脚本)。