私がやろうとしていることは次のとおりです。
.exp
ファイルを作成します。このファイルは、同じディレクトリの*.txt
ファイルから読み取り、テキストファイルのすべてのコンテンツをexpectスクリプトの文字列変数に解析します。したがって、スクリプトが行うことは、同じディレクトリ内のtxt
ファイルから一連のホスト名を読み取り、それらを文字列に読み込むことです。.exp
ファイルは、それぞれに自動ログインし、一連のコマンドを実行します。
次のコードを記述しましたが、機能しません。
#!/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 $user@$Host
expect "password"
send "$password\r"
expect "Host1"
send "$scp\r"
expect "Host1"
send "exit\r"
どんな助けでも大歓迎です....
コードは、2つのファイルの内容を行のリストに読み込んでから、それらを反復処理する必要があります。それは次のようになります:
# 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 $user@Host
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
}
ワーカープロシージャを使用してこれを少しリファクタリングすることもできますが、それが基本的な考え方です。
少しリファクタリングします:
#!/usr/bin/expect
set timeout 20
set user test
set password test
proc check_Host {hostname} {
global user passwordt
spawn ssh $user@$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
ここで2つのソリューションのいずれかを使用して、後で表示できるログファイルも作成します。特に数百のホストを構成している場合は、スクリプトの実行後に問題のトラブルシューティングを簡単に行うことができます。
追加:
log_file -a [ログファイル名]
ループの前。
乾杯、
K