2012-05-10 10 views
3

期待どおりに送信されたstdinをリダイレクトする方法はありますか?以下の私の例では、シェル関数内にheredocを介して別のシェルスクリプトをパイプし、それをシェル変数に取り込むことで出力を抑制したいと考えています。リダイレクトはstdinが呼び出しを呼び出すのを期待します

psshstdin() { 
     local user=$1 pass=$2 hosts=$3 
     out=$(expect -c ' 
     set timeout 15 
     spawn pssh -i -h '"$hosts"' -p 100 -l '"$user"' -A -o ./ -x-oStrictHostKeyChecking=no <EXPECT_STDIN_HERE 
     expect "assword:" { send '\""$pass\r\""' } 
     interact 
    '<<EOF 
    echo "hello" 
    echo "world" 
    EOF 
    ) 
    } 

SOLUTION:私はそうすぐに自分の質問に答えるために十分評判ポイントを持っていないので、私はここにこれを投稿していました。

this issueと同じ技術を試して解決できました。そのソリューションは当初は当てはまるとは思っていませんでしたが、そうでした。作業コードを以下に示します。

psshstdin() { 
    local user=$1 pass=$2 hosts=$3 
out=$(expect -c ' 
set timeout 30 
spawn pssh -I -h '"$hosts"' -p 100 -l '"$user"' -A -o ./ -x-oStrictHostKeyChecking=no 
while {[gets stdin line] != -1} { 
    send "$line\n" 
} 
send \004 
expect "assword:" { send '\""$pass\r\""' } 
expect { 
    "END_TOKEN_OF_SCRIPT" { 
    exit 0 
    } 
    default { 
    exit 1 
    } 
}'<&0) 
} 

私のようなものでそれを呼び出すことができます。STDINを集める期待してみましょう:あなたはstdin=$(cat -)

アップデートで変数に標準入力をキャプチャすることができ

psshstdin myusername mypassword ssh_hosts_file<<EOF 
echo "hello" 
echo "world" 
EOF 
+2

解決策が見つかりました[ここ](http://stackoverflow.com/questions/10237872/expect-redirect-stdin)。 – user1387661

答えて

0

テストされていないが、おそらく:

psshstdin() { 
    local user=$1 pass=$2 hosts=$3 
    out=$(expect -c ' 
    set stdin [read stdin] 
    puts "debug: sending the following stdin to pssh:\n$stdin\n--END--" 
    set timeout 15 
    spawn echo "$stdin" | pssh -i -h '"$hosts"' -p 100 -l '"$user"' -A -o ./ -x-oStrictHostKeyChecking=no 
    expect "assword:" { send "'"$pass"'\r" } 
    interact 
    '<<EOF 
echo "hello" 
echo "world" 
EOF 
) 
} 
+1

これはシェル内で動作しますが、それをspawnによって呼び出されたコマンドにパイプする方法はありません。 元のコードの文脈で次のように試しました。 'spawn echo '" $ stdin "' | pssh ..... ' ' spawn pssh ... <'"$ stdin"' そしていずれも、実際には期待通りにテキストを正しくパイプすることができません。 – user1387661

+0

あなたは期待通りにそれを引用したいでしょう: 'spawn pssh ... <{'" $ stdin "'}'。私は私の答えに代わるものを提供します。 –

+0

私は、答えが全体の既存のstackoverflow質問に座っていることを実現しました。しかし、迅速な助けをありがとう。 – user1387661

関連する問題