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

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

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

2回答

13830閲覧

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

mugichon

総合スコア61

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

0グッド

0クリップ

投稿2018/08/08 06:19

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

lang

1expect -c " 2set timeout 30 3spawn env LANG=C /usr/bin/ssh root@192.168.43.204 4expect \"password:\" 5send \"abc\n\" 6expect \"root@abc504\" 7send \"sh /root/yesno.sh\n\" 8expect \"Type yes or no.\r\" 9send \"yes\" 10exit 0 11"

lang

1#!/bin/sh 2 3echo "Type yes or no." 4read answer 5 6case $answer in 7 yes) 8 echo -e "tyeped yes.\n" 9 echo "yes" >> /root/yesno.log 10 ;; 11 no) 12 echo -e "tyeped no.\n" 13 echo "no" >> /root/yesno.log 14 ;; 15 *) 16 echo -e "cannot understand $answer.\n" 17 echo "other" >> /root/yesno.log 18 echo $answer >> /root/yesno.log 19 ;; 20esac 21

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

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/09 12:00

angel_p_57

総合スコア1672

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mugichon

2018/08/26 23:29

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

0

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

bash

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

では?

投稿2018/08/08 14:14

otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mugichon

2018/08/09 04: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\"としても、カーソル行での入力とならずに、 未入力のまま終了するようです。 ですので、ちょっと???の状態です。。
otn

2018/08/09 04:38

「行に対して」という概念はないと思いますよ。 > 正しく動作しませんでした。 とは、具体的にどんな現象でしょう? > expect \"Type yes or no.\r\" \rで終わる行は存在しないので、タイムアウトまで待ち続けるでしょう。
mugichon

2018/08/26 23:26

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問