while / forループでSSHパラメーターを使用しないことが予想されます。

while / forループでSSHパラメーターを使用しないことが予想されます。

いくつかのコマンド()を使用して、多くの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

while1つの単純化はバグがあり、遅いシェルループを取り除くことですstdininteractつまり、入力ファイルが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

関連情報