我们有大约 3000 台虚拟机和 450 台物理服务器,它们是基于 Linux 的服务器(当时很少有 ubuntu 从 9.x 开始,其中很少有 Susu 从 8.X 开始,其中大部分是 RHEL 从 4.x 开始直到7.4) 在所有这些上,我需要在它们各自的/etc/hosts 文件中添加一些带有 IP 详细信息的主机名条目。
我在每台服务器上都有不同的用户,我可以使用这些用户具有完整的 sudoers 访问权限 因此,我创建了一个包含主机名、用户名和密码格式的 CSV 文件。其中包含登录所需的详细信息。文件名为“hostname_logins.csv”
我需要上传一个文件(即 hostname_list 到每个服务器,然后在每个服务器主机文件中更新这些相同的详细信息。
我将使用一台 RHEL 6 服务器运行此脚本。 (所有其他主机都可以从此服务器解析并且可以访问,我已经确认过了。)
该脚本正在运行,但它要求接受主机 key 一次,还要求输入密码 2 次,但是第三次它不要求输入密码,我猜它会自动运行,但需要确保它不要求接受主机 key 或密码。:
#!/bin/bash
runing_ssh()
{
while read hostname_login user_name user_password
do ssh -vveS -ttq rishee:rishee@192.168.1.105 "sudo -S -ttq < ./.pwtmp cp -p /etc/hosts /etc/hosts.$(date +%Y-%m-%d_%H:%M:%S).bkp && sudo -S bash -c 'cat ./hostname_list >> /etc/hosts' && rm -f ./.pwtmp ./hostname_list"
done < hostname_logins.csv
}
while read hostname_login user_name user_password
do echo $user_password > ./.pwtmp
cat ./.pwtmp
scp -p ./.pwtmp ./hostname_list $user_name@$hostname_login:
runing_ssh
done < hostname_logins.csv
我需要把它做成一个脚本,它可以在所有这些服务器上运行。提前致谢。
最佳答案
您正在使用 sudo 从/tmp 执行原始副本,但没有别的。
while read hostname_login user_name user_password
do echo $myPW >.pwtmp
scp -p ./.pwtmp ./hostname_list $user_name:$user_password@$hostname_login:
ssh -etS $user_name:$user_password@$hostname_login "sudo -S <.pwtmp cp -p /etc/hosts /etc/hosts.bkp && sudo -S <.pwtmp cat ./hostname_list >> /etc/hosts && rm -f ./.pwtmp ./hostname_list"
done < hostname_logins.csv
我放弃了显式发送到/tmp 和 cp 回到你的主目录,并通过不在冒号后将任何东西传递给 scp 来默认位置(到 $user_name
的主目录)。如果它对您不起作用,请修复它。
我创建了一个密码文件以提高安全性和代码重用性,并将其与主机列表一起发送。我在每个相关命令中添加了一个 sudo -S,从密码文件中读取。
[bash -c ...]
语法在我的实现中不起作用,所以我把它去掉了。
希望对您有所帮助。
Update
添加 -t 到 ssh 调用。试试看。
关于bash - 在创建脚本以更新/etc/hosts 文件中的主机名时遇到多个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46807173/