You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过本地脚本在远程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免密(推荐)

这是更稳妥的解决方案,既能避免明文密码,又能一劳永逸解决免交互问题。步骤如下:

  1. 先远程登录到你的Lubuntu 22.04系统:
ssh myuser@192.168.1.1
  1. 编辑sudoers文件一定要用visudo命令,防止语法错误导致sudo功能失效:
sudo visudo
  1. 在文件末尾添加一行,给你的用户myuser授权免密执行指定的cp命令(遵循最小权限原则,只给需要的权限更安全):
myuser ALL=(ALL) NOPASSWD: /bin/cp /home/myuser/file1 /etc/sub/folder/

如果是测试环境,想让myuser免密执行所有sudo命令,可以写:

myuser ALL=(ALL) NOPASSWD: ALL
  1. 保存退出(在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 09:25:34