質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.11%

expectコマンドで入力待ちで入力できない

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,791

mugichon

score 56

expectコマンドで以下のようなシェルを書いています。

expect -c "
set timeout 30
spawn env LANG=C /usr/bin/ssh root@192.168.43.204
expect \"password:\"
send \"abc\n\"
expect \"root@abc504\"
send \"sh /root/yesno.sh\n\"
expect \"Type yes or no.\r\"
send \"yes\"
exit 0
"
#!/bin/sh

echo "Type yes or no."
read answer

case $answer in
    yes)
        echo -e "tyeped yes.\n"
        echo "yes" >> /root/yesno.log
        ;;
    no)
        echo -e "tyeped no.\n"
        echo "no" >> /root/yesno.log
        ;;
    *)
        echo -e "cannot understand $answer.\n"
        echo "other" >> /root/yesno.log
        echo $answer >> /root/yesno.log
        ;;
esac


上記を実行すると、expectでyesを入力しているはずなのに、シェルの実行結果では、
何も入力されておらず、その他扱いとなってしまいます。
何が原因でしょうか??

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

テストしてませんが、ぱっと見、

expect \"Type yes or no.\"
send \"yes\n\"


では?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/09 13:20

    ご回答ありがとうございます。
    Type yes or no.の後に改行が入り、そのあとの空行で入力待ちの状態です。
    Type yes or no.
    |
    ↑|が入力待ちカーソル
    その場合、expect \"Type yes or no.\"ですと、Type yes or noの行に対してsendするようで
    正しく動作しませんでした。
    改行を入れてexpect \"Type yes or no.\r\"としても、カーソル行での入力とならずに、
    未入力のまま終了するようです。
    ですので、ちょっと???の状態です。。

    キャンセル

  • 2018/08/09 13:38

    「行に対して」という概念はないと思いますよ。
    > 正しく動作しませんでした。
    とは、具体的にどんな現象でしょう?

    > expect \"Type yes or no.\r\"
    \rで終わる行は存在しないので、タイムアウトまで待ち続けるでしょう。

    キャンセル

  • 2018/08/27 08:26

    回答が遅くなりすみません。
    「正しく動作しない」とは、何らかの入力はされているが、yesではなく、何らかの文字の入力はあるけども、
    expectスクリプトがタイムアウト前に終了してしまう状態です。
    なぜか、
    expect "Type yes or no.\r" {send "yes\r";exp_continue}
    で正しくyesが入力されて動くようになりましたが。。。1行にしてなぜ期待した動作になるのか謎。。

    キャンセル

0

まず、yessendする時に改行もつけましょう。
それと、sendした後すぐにexitしちゃうと、せっかく呼んだスクリプトが動作を続けられなくなる可能性が高いですね。
expectでスクリプトの出力を全部受け取ってあげましょう。

この例だとsshログインしてコマンド入力をエミュレートしてますから、もう一度プロンプト(root@abc504)のexpectで良いでしょう。
ただ、スクリプトを1つしか実行しないなら

spawn env LANG=C /usr/bin/ssh root@192.168.43.204 sh /root/yesno.sh

の方が、プロンプト待ち処理が要らなくなります。
※その場合、最後は単なるexpectwait

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/27 08:29

    コメントが遅くなりすみません。
    なるほど、send後すぐにexitだと動作を続けられないんですね。。
    そのまま待ってくれるものだと思い込んでいました。
    教えて頂いた実装で試してみます。
    ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる