远程执行含sudo任务的Bash脚本问题求助
解决远程SSH执行带sudo的Bash脚本异常问题
我明白你现在遇到的麻烦:本地跑脚本完全正常,但通过C++调用ssh user@pc 'bash -s' < /home/user/myScript.sh远程执行时,带sudo的命令就出问题,还不想用cron方案。这大概率是sudo的交互要求、tty分配或者权限配置导致的,下面给你几个靠谱的解决办法:
1. 给脚本里的特定命令配置免密sudo(最核心的一步)
sudo默认需要交互式输入密码,远程非交互执行时肯定会卡在这里。我们可以给脚本里用到的sudo命令单独配置免密权限,既解决问题又保证安全:
- 登录目标机器,执行
sudo visudo(一定要用visudo,避免语法错误锁死sudo) - 在文件末尾添加一行(替换成你的用户名和命令绝对路径):
👉 先确认命令的绝对路径:比如用your_username ALL=(ALL) NOPASSWD: /bin/chmod, /usr/sbin/ntpdate, /usr/bin/gpiowhich chmod、which ntpdate查,确保路径正确 - 保存退出后,先在目标机器本地测试
sudo /bin/chmod ...,看是否不需要密码就能执行
2. 给SSH命令强制分配伪终端
有些系统的sudo配置要求必须在有tty的环境下执行,远程SSH默认非交互模式不会分配tty,这时候要加-t参数:
把你的C++里的系统调用命令改成:
ssh -t user@pc 'bash -s' < /home/user/myScript.sh
👉 如果一次-t不行,可以试试-tt(强制分配,即使本地没有tty)
3. 脚本里的sudo命令用绝对路径
远程执行时环境变量可能和本地登录不一样,用相对路径可能找不到命令,所以脚本里的sudo调用要写绝对路径:
比如把脚本里的:
sudo chmod 755 /some/path sudo ntpdate pool.ntp.org sudo gpio write 1 1
改成:
sudo /bin/chmod 755 /some/path sudo /usr/sbin/ntpdate pool.ntp.org sudo /usr/bin/gpio write 1 1
4. 先手动测试远程执行
在本地终端先手动执行修改后的SSH命令,确认脚本能正常跑,再放到C的系统调用里,这样能排除C代码本身的问题。
安全提醒
- 不要给用户配置
NOPASSWD: ALL,只给脚本里用到的具体命令,最小化权限风险 - 如果目标机器是生产环境,建议给sudo命令加上参数限制(比如指定只能修改某个特定文件的权限),进一步提升安全性
内容的提问来源于stack exchange,提问作者 Mark
相关产品推荐
相关产品推荐

