次の4つのことを行うシェルスクリプトを書きたいと思います。
私はこれを試しました:
#! /bin/bash
for i in 1 2 3 4 5 6 7 8
do
echo "Host$i" >> ~/mysh/top_out
ssh Host$i "top -n1 -b | head -n 15>> ~/mysh/top_out"
echo "done"
done
私が入手した出力ファイルは、一部のマシン(たとえば、Host5-8)の最上位の出力を保存していましたが、Host1-4のような初期のマシンでは空白でした。 「echo "Host $ i" >>〜/ mysh/top_out」という行なしで試してみると、すべてのHost1-8のトップ出力を取得できます。
あなたがするとき
ssh Host$i "top -n1 -b | head -n 15>> ~/mysh/top_out"
ローカルマシンではなく、リモートホストの~/mysh/top_out
に出力を書き込んでいます。リモートホストは、ローカルマシンと同じ物理ホームディレクトリを使用していない可能性があります。一部のマシンでホームディレクトリを共有しているNFSなどがある場合は、説明した症状が表示されます。
やってみてください
ssh Host$i "top -n1 -b | head -n 15" >> ~/mysh/top_out
代わりに、または物事を少しきれいにするために、多分
#!/bin/bash
for i in $(seq 1 8); do
(echo "Host$i"
ssh Host$i "top -n1 -b | head -n 15") >> ~/mysh/top_out
echo "done Host$i"
done
期待スクリプトを試して、接続後に各ホストの出力を保存することができます。さらにコマンドを追加することもできます。 :これは、すべてのホストで同じユーザー名とパスワードを使用していることを前提としています。
#/usr/bin/expect -f
#write your hosts on a new line inside a file and save it in your workging directory as:
#Host 1
#Host 2
#Host 3
#user '' for password if it contains special chars
#pass arguments to the script as ./script $username '$password' $hosttxt
set user [lindex $argv 0]
set pass [lindex $argv 1]
#pass path to txt file with line separated hosts
set fhost [lindex $argv 2]
#set this to the path where you need to save the output e.g /home/user/output.txt
set wd "/home/$user/log.txt"
#open hosts file for parsing
set fhosts [open $fhost r]
exec clear
#set loguser 1
proc get_top {filename line user pass} {
spawn ssh -l $user $line
expect {
"$ " {}
"(yes/no)? " {
send "yes\r"
expect -re "assword:|assword: "
send "$pass\r"
}
-re "assword:|assword: " {
send "$pass\r"
}
default {
send_user "Login failed\n"
exit 1
}
}
expect "$ " {}
send "top -n1 -b | head -n 15\r"
expect -re "\r\n(.*)\r(.*)(\\\$ |# )" {
set outcome "$expect_out(1,string)\r"
send "\r"
}
puts $filename "$outcome\n\n-------\n"
}
while {[gets $fhosts line] !=-1} {
set filename [open $wd "a+"]
get_top $filename $line $user $pass
close $filename
}
出力を取得していないホストに次のエラーが表示されているかどうかを確認します。
TERM環境変数が設定されていません。
一部のホストでこのエラーが発生する場合は、次のコマンドを試すことができます。
ssh user @ Host "screen -r; top" >> file_where_you_want_to_save_output