我正在尝试开发一个脚本来升级本地网络上的虚拟机。目标是让每个虚拟机下载脚本然后执行它。
我已经能够使用curl下载脚本并执行,但仍然收到输入sudo密码的提示。
这有效:
sshpass -p 'password' ssh -t -t [email protected] 'curl -s 192.168.1.15/upgrade.sh | sudo sh'
但当到达 sudo 命令时,我仍然需要再次输入密码。
我尝试过:
sshpass -p 'password' ssh -t -t [email protected] 'curl -s 192.168.1.15/upgrade.sh | echo 'password' | sudo sh'
会出现以下提示:
[sudo] password for aaron: (23) Failed writing body
我该怎么做才能将密码传递到 sudo 密码提示符?
答案1
基本上有多种选择,每种选择都有其优点和缺点。这在一定程度上取决于您的网络的“本地”程度以及您的解决方案的耐用性。
无密码 sudo。允许用户在目标计算机上使用无密码 sudo。要么适用于所有内容(
put "nameofuser ALL=(ALL) NOPASSWD: ALL
在目标计算机上/etc/sudoers
使用),要么仅允许特定命令。visudo
请注意,有权访问nameofuser
目标计算机的每个人实际上都具有该计算机上的 root 访问权限(并非如 @terdon 在评论中建议的那样,该计算机上的每个人都具有 root 访问权限)。允许控制计算机上的用户以 root 身份 ssh 到目标计算机。将控制用户的公钥放入
authorized_keys
目标计算机上的文件中。这意味着控制计算机上的特定用户拥有所有虚拟机的 root 访问权限。看看 Ansible(或 Puppet、Chef 等)。他们已经或多或少地为你解决了这个问题。 Ansible 的学习曲线比较温和(不到一天的时间您就可以实际使用它)。
如果问题持续时间较长,请选择选项 3。如果只是您自己的本地网络进行试验,则选择选项 1 或选项 2。