세부정보를 가져오는 스크립트

세부정보를 가져오는 스크립트

하나의 점프 서버를 사용하여 여러 서버에서 세부 정보를 가져오는 스크립트를 만들어야 하므로 스크립트를 실행하는 동안 사용자 이름과 비밀번호를 한 번 요청해야 하며 그 후에는 모든 서버에 비밀번호가 없어야 합니다. 스크립트를 어떻게 만들 수 있습니까?

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 임시 명령을 실행합니다.

$ 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

이것이 제가 하는 방법입니다. 간단한 쉘 방법과 같습니다.

#!/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

관련 정보