password check in bash script chamando em esperar

2

Background: Eu tenho que copiar um arquivo de um servidor para mais de 100 servidores em um ambiente de teste. depois que o arquivo é copiado, é necessário que as permissões no arquivo sejam alteradas / verificadas. Estes são todos os servidores linux. a maioria deles tem a mesma senha para o login, mas alguns não podem.

Preciso de ajuda para fazer um loop no meu script bash. Na verdade, está chamando em esperar. A área que eu quero fazer 'melhor' ou consertar, é algumas coisas

  • a parte em que espera uma senha. (a seção *), ele deve sair do script após uma tentativa de senha com falha e despejar o ip em um arquivo de texto chamado "fail.txt"
  • idealmente, deve haver uma parte que também copie o ip para um arquivo com falha, se não houver conexão com o servidor.

Eu tentei escrever a parte da senha pensando que é um loop, mas não tenho certeza se esse método de pensar é bom. Eu tentei apenas adicionar outro "esperar senha:" pensando que se receber o prompt uma segunda vez, para sair, mas eu tive um tempo difícil com que isso funcionasse. Obrigada!

#!/bin/bash
while read ip; do

sleep 2
expect <<- DONE
        set timeout 1
        spawn scp yoman.txt root@$ip:/felixtemp
                if above command fails, dump the IP to fail.txt, otherwise continue
        expect yes/no { send yes\r }
        expect Password: { send aaaaaa\r } #if this is good, continue the script from *****
                else                                     #exit the script
                expect Password: { send 033\r }
                expect # { send "echo 'password failed'\r" }
                && dump to a text file called fail.txt
*****   expect # { send "exit\r\r" }
        sleep 1

        set timeout 1
        spawn ssh root@$ip
        sleep 2
        expect yes/no { send yes\r }
        sleep 2
        expect Password: { send aaaaaa\r }
        sleep 5
        expect # { send "cd /felixtemp\r" }
        expect # { send "chown informix:informix yoman.txt\r" }
        expect # { send "chmod 775 yoman.txt\r" }
        expect # { send "sum yoman.txt | grep 10350 && echo 'transfer good' || echo 'transfer bad'\r" }
        expect # { send exit\r }
        sleep 1
DONE

done < ip.txt
    
por 2legit2quit 20.04.2015 / 20:02

2 respostas

1

Se você tem que gerenciar centenas de servidores Linux, você deve usar uma ferramenta de gerenciamento de configuração para executar essas tarefas. Uma ferramenta de gerenciamento de configuração muito simples é ansible, o único requisito para o sistema gerenciado é o python 2.4 ou mais ( link ).

Seu problema foi resolvido com ansible:

1) Defina uma lista de hosts que você pode definir uma senha padrão para todos os hosts e outra senha para alguns hosts

[hosts_list]
172.17.0.101 ansible_ssh_user=root ansible_ssh_pass=password
172.17.0.102 ansible_ssh_user=root ansible_ssh_pass=oldpassword
172.17.0.103
172.17.0.104

[hosts_list:vars]
ansible_ssh_user=root ansible_ssh_pass=default_password

2) Defina um playbook simples contendo as tarefas que você deseja executar nos nós gerenciados

    root@node1:~# cat play.yoman
---
- hosts: hosts_list
  tasks:
  - name: "Build hosts file"
    copy: src=/root/yoman.txt dest=/tmp/felixtemp owner=user group=adm mode=0755

3) Execute o manual e verifique o resultado

root@node1:~# ansible-playbook -i hosts_list play.yoman

PLAY [hosts_list] *************************************************************

GATHERING FACTS ***************************************************************
fatal: [172.17.0.104] => SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue
fatal: [172.17.0.103] => SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue
ok: [172.17.0.101]
fatal: [172.17.0.102] => Authentication failure.

TASK: [Build hosts file] ******************************************************
ok: [172.17.0.101]

PLAY RECAP ********************************************************************
           to retry, use: --limit @/root/play.yoman.retry

172.17.0.101               : ok=2    changed=0    unreachable=0    failed=0
172.17.0.102               : ok=0    changed=0    unreachable=1    failed=0
172.17.0.103               : ok=0    changed=0    unreachable=1    failed=0
172.17.0.104               : ok=0    changed=0    unreachable=1    failed=0

Você obtém a lista de servidores em que a tarefa foi executada e a lista de servidores em que a tarefa falha com os motivos (servidor inacessível ou senha incorreta). Você também obtém o subconjunto do servidor onde o arquivo, sua permissão e seu conteúdo não foram alterados porque já estão atualizados

    
por 20.04.2015 / 21:46
0

Por que você não usa sshpass ?

Loop com uma tabela:

tab=(
     1.2.3.4
     4.3.2.1
     ...
);

for (( i = 1; i < ${#tab[*]}; i++ )) {
        echo ${tab[i]};
        ...
}

Você precisará de algumas condições para endereços IP específicos para definir a senha correta.

SCP

sshpass -p $PASSWORD scp -o StrictHostKeyChecking=no $FILE $USER@$HOST:$PATH

De acordo com a manpage, os valores de retorno são:

0 Success

1 Invalid command line argument

2 Conflicting arguments given

3 General runtime error

4 Unrecognized response from ssh (parse error)

5 Invalid/incorrect password

6 Host public key is unknown. sshpass exits without confirming the new key.

Útil se você deseja imprimir $ HOST em um arquivo com o valor de retorno:

sshpass -p $PASSWORD scp -o StrictHostKeyChecking=no $FILE $USER@$HOST:$PATH

if [ $? -ne 0 ]
then
    echo $HOST:$? >> file.txt;
fi

SSH

Para enviar comandos:

sshpass -p $PASSWORD ssh -o StrictHostKeyChecking=no $USER@$HOST $CMD
    
por 21.04.2015 / 19:21