SUDO_ASKPASS配置失效,SSH远程执行sudo命令报错求助
SUDO_ASKPASS配置失效,SSH远程执行sudo命令报错求助
看起来你遇到的问题是在通过SSH远程执行sudo命令时,明明配置了SUDO_ASKPASS环境变量,却还是被提示需要终端输入密码。我来帮你分析下可能的原因和对应的解决办法:
1. 先确认你的.pass_file.sh脚本是否正确
这个ASKPASS辅助脚本的核心作用是直接输出sudo的密码,所以它的内容必须是类似这样的:
#!/bin/bash echo "你的sudo用户密码"
另外,要确保这个脚本在远程主机上有可执行权限——你当前脚本里是用sudo chmod +x来设置,但如果sudo本身就需要密码的话,这一步就会先报错!所以建议在复制文件后,先在普通用户权限下设置好权限:
sshpass -f .pass_file ssh dvadmin@$apc 'chmod +x ${HOME}/.pass_file.sh'
2. 解决SSH远程执行时的环境变量传递问题
当你用ssh user@host 'command'执行命令时,默认启动的是非交互式shell,这时候export的环境变量可能无法被sudo正确识别。你可以通过两种方式解决:
方式一:用bash -c包裹命令,确保环境变量生效
把远程执行的命令放在bash -c里,让bash加载完整的环境上下文:
sshpass -f .pass_file ssh dvadmin@$apc 'bash -c "export SUDO_ASKPASS=${HOME}/.pass_file.sh; sudo -A chmod +x ./.filius_update.sh && ./.filius_update.sh"'
方式二:直接在sudo命令前指定环境变量
把SUDO_ASKPASS的定义直接绑定到sudo命令上,避免环境变量丢失:
sshpass -f .pass_file ssh dvadmin@$apc 'SUDO_ASKPASS=${HOME}/.pass_file.sh sudo -A chmod +x ./.filius_update.sh && ./.filius_update.sh'
3. 检查远程主机的sudoers配置
有些系统的sudo默认会清除大部分环境变量,导致SUDO_ASKPASS被过滤掉。你需要在远程主机上修改sudoers配置(一定要用visudo命令编辑,避免语法错误导致sudo失效),添加一行:
Defaults env_keep += "SUDO_ASKPASS"
这行配置会让sudo保留SUDO_ASKPASS环境变量,确保它能被正确识别。
4. 替代方案:使用sudo -S从标准输入传密码
如果上面的方法都无法解决,你可以改用sudo -S参数,直接把密码通过管道传给sudo(注意:这种方式密码可能会出现在命令历史里,安全性略低,仅作为备选):
sshpass -f .pass_file ssh dvadmin@$apc 'echo "你的sudo密码" | sudo -S chmod +x ./.filius_update.sh && ./.filius_update.sh'
修改后的完整脚本示例
这里给你调整后的脚本,优化了权限设置和环境变量传递的问题:
#!/bin/bash echo "Welcher Rechner?" read nummer echo "Verbinde zu APC "$nummer apc=apc$nummer.local # 复制所需文件 sshpass -f .pass_file scp $HOME/autoconfig/.filius_update.sh dvadmin@$apc:$HOME/ sshpass -f .pass_file scp $HOME/autoconfig/filiusurl dvadmin@$apc:$HOME/ sshpass -f .pass_file scp $HOME/autoconfig/.pass_file.sh dvadmin@$apc:$HOME/ # 先设置ASKPASS脚本的可执行权限(普通用户权限即可) sshpass -f .pass_file ssh dvadmin@$apc 'chmod +x ${HOME}/.pass_file.sh' # 执行更新脚本,用bash -c确保环境变量生效 sshpass -f .pass_file ssh dvadmin@$apc 'bash -c "export SUDO_ASKPASS=${HOME}/.pass_file.sh; sudo -A ./.filius_update.sh"' # 清理文件 sshpass -f .pass_file ssh dvadmin@$apc 'bash -c "export SUDO_ASKPASS=${HOME}/.pass_file.sh; sudo -A rm ./.pass_file.sh filius.deb filiusurl .filius_update.sh"'
备注:内容来源于stack exchange,提问作者DonPIZI
相关产品推荐
相关产品推荐

