🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

1回答

6206閲覧

exepectコマンドを使用した条件分岐

kakedasi_eng

総合スコア0

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

0グッド

1クリップ

投稿2021/03/27 03:14

UbuntuからShellでexepectコマンドを使って自動でSSHログイン、返答があった文字列によって条件分岐を行いたいのですが、条件分岐できません。何が問題か教えていただけないでしょうか?

Shellのexepectコマンドを使って以下の流れで自動の応答のスクリプトを書きたいです。

(1)サーバーにSSHでログインする

spawn "ssh root@192.168.XXX.X"
expect "password:"
send "${パスワード用変数}\n"

(2)expectの返答によってexitに渡す数値を変更する

expect
{
"条件分1" {exit 1}
"条件分2" {exit 2}
}

上記流れの(2)で条件文によって、exitに渡す数値を変えたいのですが、0を返してきます。
条件分岐できないのは何が問題なんでしょうか?

該当のソースコード

PW="Password"

expect -c "
set timeout 5
spawn "ssh root@192.168.XXX.X"
expect "password:"
send "${PW}\n"
expect
{
"条件分1" {exit 1}
"条件分2" {exit 2}
}
expect "$"
exit 0
"

使用しているOSやバージョン情報

OSはUbuntu(20.04)です。
expectはインストールしました。

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

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

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

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

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

guest

回答1

0

そもそもsshは起動できてますか
spawn ssh root@192.168.XXX.X
じゃないですか

投稿2021/03/27 08:33

sigsegv

総合スコア895

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

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

kakedasi_eng

2021/03/28 02:18

すみません。記載誤っておりました。 spawn ssh root@192.168.XXX.Xです。 sshは起動してログインまではできています。
sigsegv

2021/03/28 03:48

であれば expect の記述は問題ないはずです。 「条件分」は具体的には何を待っているのでしょうか。 パスワードを入力したあと次に表示されるのは普通はプロンプトですが 「条件分」はプロンプトなのですか
kakedasi_eng

2021/03/28 05:08

回答ありがとうございます。 条件分は、ESXiサーバーのVMの状態です。 ESXiサーバーにログインするとVMが起動しているか、電源オフの状態なのか応答します。 そこでVMの状態によって振る舞いを変えたいと思っています。
sigsegv

2021/03/28 07:28

あ、わかったかも。 expect と { が別の行になってますが、同一行にしてみてください。 expect { という感じ
kakedasi_eng

2021/03/28 13:29

ありがとうございます。 承知しました。やってみます。
kakedasi_eng

2021/03/29 23:22

うまくいきませんね。 下記のようにexitではなくsendコマンドだと想定通りの結果を送信してくれるのですが、exitにすると0を返してきます。 expect { \"条件分1\" { send\ \"コマンド1\} \"条件分2\" {send \"コマンド2\} } expect \"$\" exit 0 "
sigsegv

2021/03/30 18:20 編集

その send 行はエスケープがおかしいですが、とにかく 条件文にはマッチしているということですね? であれば、send が動いて、exit が動かないというのは不可解に見えます。 exit を記述していたとき、exit は実行されていたのですか。 exit を実行したが終了コードが 0 だったのか、そもそも exit が実行されず タイムアウト(5秒)していたのか、どちらでしょうか。 あと、「exitにすると0を返す」は expect の直後に確認していますか? (expect のあとに別のコマンドを実行していて。$? を上書きしていませんか)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問