用于获取详细信息的脚本

用于获取详细信息的脚本

我需要创建一个脚本,用于使用一台跳转服务器从多个服务器获取详细信息,因此在运行脚本时,它应该询问一次用户名和密码,之后所有服务器都应该没有密码,我如何创建脚本?

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

相关内容