通过 ssh 和脚本使用 sudo 编辑文本文件

通过 ssh 和脚本使用 sudo 编辑文本文件

我想通过脚本和 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

相关内容