2013-07-15 30 views
5

Co staram się zrobić to:odczytać pliku do String i zrobić pętlę w Expect Script

  1. Utwórz plik .exp, który będzie odczytany z pliku *.txt z tego samego katalogu i analizować całą zawartość w pliku tekstowym do zmiennej łańcuchowej w skrypcie oczekiwania.
  2. Zapętlaj ciąg znaków, który zawiera serię nazw hosta, i wykonuj serię poleceń do momentu wyliczenia ciągu.

Więc co skrypt nie jest czytać serię hosta z pliku w tym samym katalogu txt, a następnie odczytać je na sznurku, a plik .exp będzie auto log do każdego z nich i excecute serię poleceń.

Mam następujący kod napisany, ale to nie działa:

#!/usr/bin/expect 

set timeout 20 
set user test 
set password test 

set fp [open ./*.txt r] 
set scp [read -nonewline $fp] 
close $fp 

spawn ssh [email protected]$host 

expect "password" 
send "$password\r" 

expect "host1" 
send "$scp\r" 

expect "host1" 
send "exit\r" 

Każda pomoc jest mile widziana ....

+0

jestem trochę zdezorientowany. Czy masz jeden plik z listą wszystkich poleceń i inną listą wszystkich hostów? A może masz katalog z jednym plikiem na hosta (nazwany przez nazwę hosta z rozszerzeniem .txt?), Który przechowuje polecenia do uruchomienia na tym hoście? –

+0

witam. Próbuję utworzyć pętlę. najpierw przeczytaj plik host.txt, który zawiera wszystkie serwery, na których chcę uruchomić skrypt exp. Następnie, podczas przeglądania pliku host.txt, skopiuj i wklej polecenia znajdujące się w pliku commands.txt do każdego hosta. – Tony

+0

co oznacza również, że polecenie expect w tym skrypcie będzie wymagało wielu różnych hostów, takich jak $ host1->, $ host2-> etc .... – Tony

Odpowiedz

8

kod powinien odczytać zawartość dwóch plików na liście linii, a następnie powtórzyć je. Kończy się tak:

# Set up various other variables here ($user, $password) 

# Get the list of hosts, one per line ##### 
set f [open "host.txt"] 
set hosts [split [read $f] "\n"] 
close $f 

# Get the commands to run, one per line 
set f [open "commands.txt"] 
set commands [split [read $f] "\n"] 
close $f 

# Iterate over the hosts 
foreach host $hosts { 
    spawn ssh [email protected] 
    expect "password:" 
    send "$password\r" 

    # Iterate over the commands 
    foreach cmd $commands { 
     expect "% " 
     send "$cmd\r" 
    } 

    # Tidy up 
    expect "% " 
    send "exit\r" 
    expect eof 
    close 
} 

Można to trochę zmienić za pomocą procedury pracowniczej lub dwóch, ale to jest podstawowy pomysł.

2

bym byłaby trochę:

#!/usr/bin/expect 

set timeout 20 
set user test 
set password test 

proc check_host {hostname} { 
    global user passwordt 

    spawn ssh [email protected]$hostname 
    expect "password" 
    send "$password\r" 
    expect "% "    ;# adjust to suit the prompt accordingly 
    send "some command\r" 
    expect "% "    ;# adjust to suit the prompt accordingly 
    send "exit\r" 
    expect eof 
} 

set fp [open commands.txt r] 
while {[gets $fp line] != -1} { 
    check_host $line 
} 
close $fp 
1

Korzystając z dowolnego z dwóch rozwiązań tutaj, utworzyłbym również plik dziennika, który można wyświetlić w późniejszym czasie. Ułatwia rozwiązywanie problemów po uruchomieniu skryptu, zwłaszcza jeśli konfigurujesz kilkaset hostów.

Dodaj:

plik_protokołu -a [nazwa pliku dziennika]

Przed swojej pętli.

Cheers,

K