いくつかのコマンド()を使用して、多くのdmidecode
ホストのリモートシステムの詳細を取得しようとしています。expect
expect
以下はこの目的に使用するスクリプトです。
while read i; do
{
/usr/bin/expect<<EOF
spawn ssh "root@$i" dmidecode
expect "Password:"
send "xxxx\r";
interact
EOF
}
done<iplist
ただし、ここのコマンドはリモートコンピュータでは実行されません。私は一重引用符、二重引用符、カラットを試しましたが、まだ成功していません。
ここでは、リモートコマンドをパラメータとして実行したいと思います。たとえば、次のようになります。ssh <ip> <remote command>
いくつかのアドバイスをしてください。一部のパラメーターが欠落している可能性があります。助けてください。
答え1
while
1つの単純化はバグがあり、遅いシェルループを取り除くことですstdin
。interact
つまり、入力ファイルがexpect
スクリプトのTCLコードに渡され、読み込まれます。
#!/usr/bin/expect
if {[llength $argv] != 1} {
puts stderr "Usage: $0 iplist-file"
exit 1
}
set ipfh [open [lindex $argv 0]]
while {[gets $ipfh ip] >= 0} {
spawn ssh root@$ip dmidecode
expect "Password:"
send "Hunter2\r";
interact
}
答え2
thrigは素晴らしい答えを持っています。 bashを使い続けるには(読み込み中にループが非常に遅く、構文を正しくインポートするのが面倒ですが)、別のファイル記述子を使用してファイルから読み込み、Expectがstdinを保存できるようにします。
while IFS= read -r -u3 ip; do
# .................^^^
/usr/bin/expect << EOF
spawn ssh "root@$ip" dmidecode
expect "Password:"
send "xxxx\r";
interact
EOF
done 3< iplist
# ...^^
dmidecode コマンドにユーザー対話が必要ない場合は、interact
次のように変更します。expect eof