如何使用Java ProcessBuilder以指定用户身份执行脚本
关于密码验证的问题
你从root用户启动Java进程,和你手动执行su - myuser的执行身份完全一致,所以通过ProcessBuilder调用su命令同样不需要输入密码。
具体解决方案
你只需要把原来的执行命令调整为通过su调用目标脚本即可,使用su的-c参数指定切换用户后要执行的命令即可。更推荐使用ProcessBuilder的列表参数形式构造命令,可以避免路径含空格、特殊字符时的转义问题,改后代码示例如下:
// 拼接脚本完整路径 String fullScriptPath = script.getScriptPath() + "/" + script.getScriptName(); // 按su的参数格式构造命令列表 ProcessBuilder pb = new ProcessBuilder("su", "-", "myuser", "-c", fullScriptPath); // 如果需要合并错误流避免缓冲区阻塞可以加这行 // pb.redirectErrorStream(true); Process p = pb.start(); // 原有逻辑保持不变 p.waitFor(); exitCode = p.exitValue();
额外注意事项
- 请提前确认myuser用户对目标脚本拥有执行权限,同时对脚本运行依赖的其他文件、目录拥有对应读写/执行权限
- 如果你的脚本需要传入参数,直接拼接在
fullScriptPath后面即可,参数包含空格的话需要给对应参数用单引号包裹 - 如果需要获取脚本的输出内容,建议主动读取进程的输入流,避免缓冲区满导致进程永久阻塞
内容的提问来源于stack exchange,提问作者Helpthisamatuerprogrammer
相关产品推荐
相关产品推荐

