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

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

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

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

1回答

3290閲覧

centosでのexpectの利用について

TakakiKuwabara

総合スコア38

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

0クリップ

投稿2017/03/04 12:08

編集2017/03/05 01:29

CentOSでのexpectの使用方法について教えていただけないでしょうか。
シェルでのexpectにより、対話型の入力を自動で行うため、下記のようなコマンドを実装しようと考えております。

test.sh

1expect -c " 2 spawn reboot 3 expect \"Password:\" 4 send \"vagrant\" 5"

ところがいざ実行してみると、

[vagrant@localhost tmp]$ sh test.sh spawn reboot ==== AUTHENTICATING FOR org.freedesktop.login1.reboot === Authentication is required for rebooting the system. Authenticating as: root Password: [vagrant@localhost tmp]$

などと表示され、expectによるパスワードの入力が実行されておりません。

どなたかわかる方、アドバイスいただけないでしょうか。

追記:
ちなみにmysqlの初期化コマンドで試してみました。
どうやらsendコマンドが機能していないようです。
使い方が間違っているのでしょうか?

ss.sh

1expect -c " 2 spawn mysql_secure_installation 3 expect \"Enter password for user root:\" 4 send \"Fjjrk195_\n\" 5"
[vagrant@localhost tmp]$ sh ss.sh spawn mysql_secure_installation Securing the MySQL server deployment. Enter password for user root: [vagrant@localhost tmp]$

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

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

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

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

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

guest

回答1

0

ベストアンサー

などと表示され、expectによるパスワードの入力が実行されておりません。

とありますが、[vagrant@localhost tmp]$ はコマンドプロンプトのように見えます。パスワードの入力には成功しているのではないでしょうか?(パスワードはエコーされませんので、expect から送っても表示されません)

プロンプトメッセージを expect してから、ログイン後に実行したいコマンドを send してみてはどうでしょうか?


訂正
すみません。[vagrant@localhost tmp]$は呼びもとのプロプントでしたね。

パスワードを送るときに改行を送らなければならないのではないでしょうか? また、send 後すぐに expect 自身が終わってしまうのをふせぐために、出力を expect してはどうでしょうか? 以下ではどうですか?

shell

1expect -c " 2 spawn reboot 3 expect \"Password:\" 4 send \"vagrant\n\" 5 expect .* 6"

投稿2017/03/04 14:12

編集2017/03/05 01:33
mit0223

総合スコア3401

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

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

TakakiKuwabara

2017/03/05 01:24

ご回答ありがとうございます。 改行コードもいろいろ試しましたら、やっぱりうまくいかないようです。 expectではうまく拾えているようですが、sendがうまくいっていないのでしょうか。。。
mit0223

2017/03/05 01:28

小出しですみません。私の環境だと、 root で reboot するとパスワードを聞かれずに reboot してしまうので、検証できてません。さきほど、回答を修正しました。 expect .* を追加すれば、認証失敗のメッセージが拾えるのは確認しておりますが、いかがでしょうか。
TakakiKuwabara

2017/03/05 01:33

ありがとうございます。 expect .*を入れてみると無事リブートできました。 なぜ成功したのか今確認しているところです。 とりあえず無事に動いてよかったです。ありがとうございます!
mit0223

2017/03/05 01:35

何度もすみません。検証できました。改行と expect .* の追加でこちらでは動作しています。さきほど、私の回答のサンプルコードに全角スペースが入っていて、コピペするとエラーになったので修正しました。
mit0223

2017/03/05 01:36

expect .* がないと、reboot が実際の動作に入る前に expect が reboot を殺してしまうんだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問