複数のサーバーを監視するためにExpectを使用してスクリプトを作成しようとしています。接続はパスワードを使用してSSHを介して行われます。
私のデフォルトループが自動的に失敗し、Expect TCL言語がLinux forループ構文を受け入れるかどうかはわかりません。
パスワード:
#!/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
ファイルには、/tmp/DR.txt
次の100個のサーバー名のリストが含まれています。
hzavks01
dzavks20
dzavks03
uzavks05
acavks30
私が得るエラーは次のとおりです。
[root@dzavks20 tmp]# ./expect.sh
invalid command name "server_list=/tmp/DR"
while executing
"server_list=/tmp/DR"
(file "./expect.sh" line 2)
答え1
Expectを使用する必要がありますか? SSHを介してリモートでdfコマンドを実行し、情報を単一のファイルに収集する単純なbashシェルを持つことはできますか?
コールサーバーからすべてのサーバーへのSSHキーが設定ファイルに正しく設定されている場合は、パスワードを入力する必要はありません。次のループは、すべてのサーバーからdf出力を収集します。
while read -r h; do
echo "=== Space utilization for ${h} ==="
ssh "$h" df -kh
echo ""
done </tmp/DR.txt >/tmp/space_utilization.log
答え2
可能であれば、SSH秘密鍵認証を使用してください。一度設定したら、それについて考える必要はありません。また、パスワードをプレーンテキストとして保存する必要はありません。
また、コードはたくさんより複雑な:
#!/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