我需要创建一个脚本,用于使用一台跳转服务器从多个服务器获取详细信息,因此在运行脚本时,它应该询问一次用户名和密码,之后所有服务器都应该没有密码,我如何创建脚本?
if [ $(id -u) -eq 0 ]; then
read -p "Enter username : " username
read -s -p "Enter password : " password
egrep "^$username" /etc/passwd >/dev/null
if [ $? -eq 0 ]; then
echo for HOST in $(cat servers.txt ) ; do ssh $HOST "cat /var/log/QPKS/qpk" ; done
答案1
安西布尔
我会用 Ansible 来做这件事。您可以创建一个包含服务器的清单文件,如下所示:
$ cat inventory
[serverlist]
host1
host2
host3
host4
然后运行 Ansible ad-hoc 命令,如下所示:
$ ansible -i inventory -m shell -a "cat /var/log/QPKS/qpk" all
如果您必须通过 sudo 提供对此文件的访问权限,请将-b
开关添加到ansible
.如果您需要提供密码sudo
,请使用-K
。要作为备用用户连接到远程服务器,请使用-u
。
-b, --become
run operations with become (does not imply password prompting)
-K, --ask-become-pass
ask for privilege escalation password
-u REMOTE_USER, --user REMOTE_USER
connect as this user (default=None)
其他方法
过去我曾使用其他工具来完成同样的事情。第一个链接显示使用 执行类似的操作pssh
。第二个链接展示了如何pssh
第一次在一组服务器上传播 SSH 密钥,此时您所拥有的只是对一组服务器的用户名/密码访问权限,并且不想多次输入密码最初将您的 SSH 密钥推出。
一旦您的 SSH 密钥被分散,您必须执行的上述循环就会消失,因为您将设置 SSH 密钥访问权限,从而无需输入密码。
答案2
这就是我做的方式,就像简单的 shell 方法一样。
#!/bin/bash
cd ~
read -p "Username:" uname
echo -n Password:
read -s password
read -p "`echo -e '\nFile Name:'`" fname
if [ ! -e $fname ]; then
echo "No file found"
elif [ ! -s $fname ]; then
echo "File has no data"
fi
#lcount=0
#hcount=0
count=0
#check for the host name in the file provided. Get them one by one on the following loop.
for host in `cat $fname`;
do
#intimate te user on progress and logon to the server to get OS type
echo "$host in progress"
ost=$(sshpass -p $password ssh -q $uname@$host uname) &> /dev/null #check the OS type of the server
if [[ $ost =~ .*UX.* ]]
then
if [[ -e result_$1.$(date '+%Y%m%d') && count -le 0 ]]; then #to remove if the file exists withe same name. always use different name
rm result_$1.$(date '+%Y%m%d')
fi
echo "### $host ###" >> result_$1.$(date '+%Y%m%d')
sshpass -p $password ssh -q $uname@$host swlist | grep -e Pat -e QPK >> result_$1.$(date '+%Y%m%d') #get the current patch and apend the file
echo "$host completed"
# (( hcount++ ))
elif [[ $ost =~ .*Linux.* ]]
then
if [[ -e result_$1.$(date '+%Y%m%d') && count -le 0 ]]; then ##to remove if the file exists withe same name. always use different name
rm result_$1.$(date '+%Y%m%d')
fi
echo "### $host ###" >> result_$1.$(date '+%Y%m%d')
sshpass -p $password ssh -q $uname@$host "cat /var/log/QPKS/qpk" >> result_$1.$(date '+%Y%m%d') #get the current patch and apend the file
echo "$host completed"
# (( lcount++ ))
else
echo "Please check the server $host. Unable to check the patch" #if the server could not be logged in to get the patch
fi
(( count++ ))
done