如何通过本地脚本在远程Lubuntu 22.04系统免交互执行需sudo权限的命令?
如何通过本地脚本在远程Lubuntu 22.04系统免交互执行需sudo权限的命令?
嗨,我懂你现在的困扰——想在本地脚本里远程执行需要sudo权限的命令,结果被卡在输密码那一步动不了对吧?咱们一步步来解决这个问题。
首先说说你之前尝试的命令为啥失败:当你在本地用ssh传递带管道的命令时,引号的解析逻辑会出问题,远程shell没法正确把密码传给sudo。咱们可以通过调整命令的转义方式,或者用更安全的配置方案来解决。
方法一:修正命令的转义问题
你可以调整引号的使用,确保整个命令链能被远程shell正确解析。试试这个命令:
MYPASSWORD='mypassword' sshpass -p "$MYPASSWORD" ssh myuser@192.168.1.1 "echo '$MYPASSWORD' | sudo -S cp /home/myuser/file1 /etc/sub/folder/"
这里把echo的密码用单引号包裹,既能避免本地shell解析密码里的特殊字符(比如$、!),又能让远程shell正确把密码传递给sudo的-S选项(这个选项就是让sudo从标准输入读取密码)。
不过要注意:这种方式会把密码明文写在脚本里,有一定安全风险——如果别人能访问你的脚本,就能直接拿到密码,所以更推荐下面的长期安全方案。
方法二:配置远程系统的sudo免密(推荐)
这是更稳妥的解决方案,既能避免明文密码,又能一劳永逸解决免交互问题。步骤如下:
- 先远程登录到你的Lubuntu 22.04系统:
ssh myuser@192.168.1.1
- 编辑sudoers文件一定要用
visudo命令,防止语法错误导致sudo功能失效:
sudo visudo
- 在文件末尾添加一行,给你的用户
myuser授权免密执行指定的cp命令(遵循最小权限原则,只给需要的权限更安全):
myuser ALL=(ALL) NOPASSWD: /bin/cp /home/myuser/file1 /etc/sub/folder/
如果是测试环境,想让myuser免密执行所有sudo命令,可以写:
myuser ALL=(ALL) NOPASSWD: ALL
- 保存退出(在visudo里按
Ctrl+O保存,Ctrl+X退出)。
配置完成后,你的本地脚本就可以简化成:
MYPASSWORD='mypassword' sshpass -p "$MYPASSWORD" ssh myuser@192.168.1.1 "cp /home/myuser/file1 /path/to/dest/" sshpass -p "$MYPASSWORD" ssh myuser@192.168.1.1 "sudo cp /home/myuser/file1 /etc/sub/folder/"
这样执行sudo命令时就不会再要求输入密码了,也避免了明文密码的安全隐患。
额外提醒
- 如果用方法一,记得把脚本权限设置成只有你自己能读写(
chmod 700 your_script.sh),防止密码泄露。 - 方法二的最小权限原则很重要,尽量只给用户需要的命令免密权限,不要随便开放所有权限,降低安全风险。
备注:内容来源于stack exchange,提问作者User051209
相关产品推荐
相关产品推荐

