expect
を使用して、単純なコマンドcat /tmp/id_rsa.pub
をssh経由で実行したい。 (手動でパスワードを入れて)シェルで スペースを含む引数を持つコマンドを生成することを期待する
expect
でこれを自動化したい
ssh [email protected] 'cat /tmp/id_rsa.pub'
、これが問題めざし実行することができます。私expect
スクリプトは、それがエラーbash: cat /tmp/id_rsa.pub: no such file or directory
をスローし、
#!/usr/bin/expect
eval spawn ssh [email protected] 'cat /tmp/id_rsa.pub'
expect "password:"
send "123456"
expect eof
です。それは私には非常に奇妙に見えます。考えられる原因は何でしょうか?
編集:いくつかのテストの後、私はcat
の場合だけでなく、これが一般的であることがわかります。 spawnedコマンドの引数がスペースであれば(引用符で囲まれていても)、問題があります。例えば、それはbash: which java: command not found
と文句を言い
eval spawn ssh [email protected] 'which java'
のように、スペースで他のコマンドとcat /tmp/id_rsa.pub
を交換します。しかし、それをpwd
と置き換えると、
eval spawn ssh [email protected] 'pwd'
のようになります。
「コマンド引数」に関する一重引用符を削除しようとしましたか?問題の根本は、コマンドと引数に分割するのではなく、引用された文字列全体をコマンドの名前として解釈しようとしているようだ... – twalberg
@twalberg that that working。私も二重引用符を試しました、wo/problem。好奇心のために、一重引用符について特別なことを少し説明できますか? – Richard
私は、 'expect'ドキュメントを調べて、それが何を言うのかを知る必要があります - 私の頭の上から分かりません。私はあなたが得ていた特定のエラーメッセージの構文に基づいてそれを提案しました... – twalberg