我们有大约3000个虚拟机和450个物理服务器是基于Linux的服务器(很少有ubuntu从9.x开始,其中很少是Susu从8.x开始,其中大多数是RHEL从4.x开始到7.4)我需要的所有服务器将带有IP详细信息的主机名条目添加到各自的/ etc / hosts文件中。
我在每台服务器上都有不同的用户,我可以使用完全的sudoers访问权限 因此,我创建了一个包含主机名,用户名和放大器的CSV文件。密码格式。其中包含登录所需的详细信息。文件名为“hostname_logins.csv”
我需要上传一个文件(即hostname_list到每个服务器,然后在每个服务器主机文件中更新相同的详细信息。
我将使用一台RHEL 6服务器运行此脚本。 (所有其他主机都可从此服务器解析并且可以访问,我已经确认了。)
脚本正在运行,但它要求接受主机密钥一次,并且还要求输入密码2次,但是第三次它没有要求输入密码它自动工作我想,但需要确保它不要求接受主机密钥。:
#!/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
我需要将它作为一个可以在所有这些服务器上运行的单个脚本。提前谢谢。
答案 0 :(得分:2)
您正在使用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 ...]
语法对我的实现不起作用,所以我把它拿出来了。
希望有所帮助。
更新
将-t添加到ssh调用。试试吧。