2

cat ~/.ssh/id_rsa.pub | ssh root@host 'cat >> .ssh/authorized_keys'でパイプ コマンドを自動化したいexpect。コマンドを使用してspawnコマンドを実行する場合、

spawn cat ~/.ssh/id_rsa.pub | ssh root@host 'cat >> .ssh/authorized_keys' 

エラーメッセージをスローし、

cat |: No such file or directory
cat ssh: No such file or directory
...

パイプされたコマンドを生成するにはどうすればよいですか?

4

4 に答える 4

5

技術的には 1 回のヒットで複数のシェル コマンドを実行したい (そして spawn はパイプされた I/O を処理しない) ため、それらをスクリプトにカプセル化し、spawn を使用してスクリプトを実行する必要があります。

必要なスクリプトは ssh-copy-id として既に存在しますが、縮小バージョンが必要な場合は、その場でスクリプト ファイルを作成し、それを expect spawn に渡すことができます。

cat > /tmp/sshkeycopy.sh <<MYEOF
cat ~/.ssh/id_rsa.pub | ssh user@host 'mkdir -p -m 600 ~/.ssh; cat >> ~/.ssh/authorized_keys'
MYEOF

chmod u+x /tmp/sshkeycopy.sh

expect -c "
spawn /tmp/sshkeycopy.sh
expect { ... }"

この bash の例では、シェルは期待どおりにパイプを処理し、処理を期待するためにパスワード プロンプトをスローします。

于 2012-11-11T19:01:32.397 に答える
3

spawn入力リダイレクトを処理しますか?

spawn ssh root@host "cat >> .ssh/authorized_keys" < ~/.ssh/id_rsa.pub

catを使用していない場合は、単一のファイルで使用するよりも入力リダイレクトの方が優先されますexpect

編集:cat一重引用符の代わりに、コマンドを二重引用符で囲みます(テストでは機能しません)

于 2012-09-20T14:26:14.700 に答える
1

次のパターンを使用できます。

spawn bash -c "cat MEH | ssh root@host 'cat >>HMM' " 
于 2016-04-12T23:14:29.743 に答える