予測スクリプトを使用して複数のLinuxサーバーのディスク容量を監視する

予測スクリプトを使用して複数のLinuxサーバーのディスク容量を監視する

複数のサーバーを監視するために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

関連情報