Monitoramento do espaço em disco em vários servidores Linux usando o script expect

0

Estou tentando escrever um script usando o Expect para monitorar vários servidores; as conexões serão através do ssh usando uma senha.

Meu loop básico é auto-reprovado, não tenho certeza se a linguagem Expect TCL aceita ou não a sintaxe Linux for loop.

Código:

#!/usr/bin/expect -f  
server_list="/tmp/DR.txt"  
for HOST in $(cat $server_list) ; do  
spawn ssh -q $HOST  
expect "assword:"  
send "Abcd@123\r"  
interact  
echo ' '  
echo "====For space utilization details for server $HOST===" >/tmp/space_utilization.log  
Df -kh >> /tmp/space_utilization.log  
echo ' '  
done  

O arquivo /tmp/DR.txt contém uma lista de 100 nomes de servidores, como os seguintes:

hzavks01  
dzavks20  
dzavks03  
uzavks05  
acavks30  

O erro que recebo é:

[root@dzavks20 tmp]# ./expect.sh  
invalid command name "server_list=/tmp/DR"  
    while executing  
"server_list=/tmp/DR"  
    (file "./expect.sh" line 2)  
    
por muku 12.09.2018 / 17:08

2 respostas

2

Você tem que usar esperar? Você pode simplesmente ter um shell bash simples que executa o comando df remotamente via ssh e coleta as informações em um único arquivo?

Se as chaves ssh estiverem configuradas corretamente a partir do servidor de chamada para todos os servidores em seu arquivo de configuração, não será necessário inserir senhas. O loop a seguir coletará a saída do df de todos os servidores

while read -r h; do
    echo "=== Space utilization for ${h} ==="
    ssh "$h" df -kh
    echo ""
done </tmp/DR.txt >/tmp/space_utilization.log

Espero que isso ajude

    
por 12.09.2018 / 17:30
0

Use a autenticação de chave privada ssh se você puder: depois de configurá-la, não precisa pensar nisso. Além disso, você não precisa armazenar uma senha em texto simples.

Além disso, o código é um lote mais complicado:

#!/usr/bin/expect -f  

set server_list /tmp/DR.txt
set fh_hosts [open $server_list r]

# truncate the log file
set log_file /tmp/space_utilization.log  
close [open $log_file w]

set pass "Abcd@123"
set prompt_re {\$ $}

while {[gets $fh host] != -1} {
    spawn ssh -q $host  
    expect "assword:"  
    send "$pass\r"  
    expect -re $prompt

    set cmd "df -kh"
    send "$cmd\r"
    expect -re "$cmd\r\n(.*)\r\n$prompt"

    log_file $log_file
    send_log "\n"
    send_log "====Space utilization for server $host at [timestamp -format +"%Y-%m-%d %T"]===\n"
    send_log -- $expect_out(1,string)
    send_log "\n\n"
    log_file

    send "exit\r"
    expect eof
}
close $fh_hosts
    
por 12.09.2018 / 18:03