![通过 ssh 和脚本使用 sudo 编辑文本文件](https://linux22.com/image/968486/%E9%80%9A%E8%BF%87%20ssh%20%E5%92%8C%E8%84%9A%E6%9C%AC%E4%BD%BF%E7%94%A8%20sudo%20%E7%BC%96%E8%BE%91%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6.png)
我想通过脚本和 ssh 修改 /etc/hosts(以及稍后的主机名)。因此我通过 ssh 登录,并且此操作有效:
sudo nano /etc/hosts
它显示了 nano 中的远程主机文件。但是我尝试了这个(通过命令行,但这应该可以使其在脚本中工作,对吧?):
echo [mypassword] | sudo -S nano /etc/hosts
但得到这个输出:
Recieved SIGHUP or SIGTERM
Buffer written to /etc/hosts.save
我刚刚发现这种情况也发生在更简单的文本文件(例如 test.txt)中。有什么办法可以解决这个问题吗?
是的,我知道明文密码不安全。:)
提前致谢
答案1
我建议使用无密码的 sudo,而不是在脚本中清晰地输入密码。
在脚本中,使用 echo 写入文本文件,而不是 nano。
喜欢
#!/bin/bash
echo 'text to write to /etc/hosts' > /etc/hosts
或者我正确理解了你的目的吗?
答案2
我发现该tee
命令有助于避免文件重定向的 sudo 限制。
这是我用来将集群中所有机器的主机远程附加到 /etc/hosts 的命令:
for i in {1..10}; do ssh [email protected].$i -t "echo '10.1.1.1 dev-1
10.1.1.4 dev-4
10.1.1.3 dev-3
10.1.1.2 dev-2
10.1.1.6 dev-6
10.1.1.8 dev-8
10.1.1.5 dev-5
10.1.1.10 dev-10
10.1.1.9 dev-9
10.1.1.7 dev-7' | sudo tee -a /etc/hosts >/dev/null"
每次迭代的输出如下所示:
0+1 records in
0+1 records out
255 bytes (255 B) copied, 4.1338e-05 s, 6.2 MB/s
这个 SU 答案对于我最终的解决方案至关重要:https://superuser.com/a/1026359/587485
答案3
对我有用的是写入临时文件并用它替换 /etc/hosts
#!/bin/bash
# $1: IP of the new host
# $2: name of the new host
# read current /etc/hosts int temp-file
cat /etc/hosts > tmphost
# add new entry to temp-file
echo "$1 $2" >> tmphost
# replace hosts file
sudo cp tmphost /etc/hosts
# remove temp-file
rm tmphost
就像@Pasi 建议的那样,这需要无密码 sudo