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