espera não receber argumentos ssh no while / for loop

1

Eu estou tentando buscar detalhes da máquina remota ( dmidecode ) para muitos hosts usando algum comando expect .

Abaixo está o script expect que estou usando para essa finalidade.

while read i; do
{
/usr/bin/expect<<EOF
 spawn ssh "root@$i" dmidecode 
 expect "Password:"
 send "xxxx\r";
 interact
 EOF
  }
 done<iplist 

Mas aqui o comando que não está sendo executado na máquina remota. Eu tentei com simples, aspas duplas e símbolo de cursor ainda sem sorte.

Aqui eu quero executar o comando remoto como um argumento como: ssh <ip> <remote command>

Por favor, dê-me alguns pontos de vista, posso perder alguns params aqui, por favor me ajude

    
por jay 22.06.2018 / 17:00

2 respostas

2

Uma simplificação seria eliminar o loop de while com bugs e lento, o que também liberaria stdin a ser usado para interact . Ou seja, o arquivo de entrada seria transmitido e lido pelo código TCL no script expect .

#!/usr/bin/expect

if {[llength $argv] != 1} {
    puts stderr "Usage: $0 iplist-file"
    exit 1
}

set ipfh [open [lindex $argv 0]]

while {[gets $ipfh ip] >= 0} {
    spawn ssh root@$ip dmidecode
    expect "Password:"
    send "Hunter2\r";
    interact
}
    
por 22.06.2018 / 17:17
1

thrig tem uma ótima resposta. Se você quiser ficar com o bash (mesmo que o loop while-reading seja extremamente lento, e tedioso para obter a sintaxe correta), use um descritor de arquivo diferente para ler o arquivo e permitir que ele segure stdin:

while IFS= read -r -u3 ip; do
# .................^^^
    /usr/bin/expect << EOF
        spawn ssh "root@$ip" dmidecode 
        expect "Password:"
        send "xxxx\r";
        interact
EOF
done 3< iplist 
# ...^^

Se o comando dmidecode não exigir interação humana, altere interact para expect eof

    
por 22.06.2018 / 17:28

Tags