скрипт для получения деталей

Мне нужно создать один сценарий для извлечения подробностей с нескольких серверов с одним сервером перехода, поэтому при запуске сценария он должен запросить одноразовое имя пользователя и пароль, после чего на весь сервер он должен идти без пароля. Как я могу создать сценарий?

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 

анзибль

Я бы сделал это с Ansible. Вы можете создать файл инвентаризации, который включает в себя ваши серверы, как это:

 $ cat inventory [serverlist] host1 host2 host3 host4 Список $ 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 . Во 2-й ссылке показано, как вы можете использовать pssh для распространения вашего SSH-ключа на несколько серверов в первый раз, когда все, что у вас есть, это доступ по имени пользователя / паролю к набору серверов, и вы не хотите вводить свой пароль в десятках раз нажать ваш ключ SSH изначально.

  • Parallels-SSH с парольным ключом защищенного ключа SSH
  • Как я могу распространить свой ключ публикации SSH на список серверов, не вводя пароль снова и снова?

Как только ваш SSH-ключ будет рассредоточен, вышеприведенные циклы, которые вам нужно сделать, исчезнут, поскольку у вас будет настроен доступ к SSH-ключу, что устраняет необходимость вводить ваш пароль.

Вот как я это сделал, как простой метод оболочки.

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