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

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

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

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

シェル

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

Q&A

解決済

2回答

10345閲覧

centosでのexpectの利用について

TakakiKuwabara

総合スコア38

CentOS

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

シェル

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

0グッド

0クリップ

投稿2017/03/05 07:42

CentOSでexpectを使用して諸々の設定の自動化を行おうとしています。
その中で、おそらくメタ文字でコマンドが正しく認識されない問題が起きているため、お分かりになる方のアドバイスをいただきたく存じます。

例えば下記のコマンドをspawnで認識ができません。

expect -c " spawn cat /var/log/mysqld.log | grep 'password is generated' expect \".*\" send \"tes\n\" expect eof "

下記のようなエラーが表示されます。

cat: |: そのようなファイルやディレクトリはありません cat: grep: そのようなファイルやディレクトリはありません cat: 'password: そのようなファイルやディレクトリはありません cat: is: そのようなファイルやディレクトリはありません cat: generated': そのようなファイルやディレクトリはありません

そこでメタ文字を下記のように編集しました。

expect -c " spawn\ cat\ /var/log/mysqld.log\ \|\ grep\ \'password\ is\ generated\' expect \".*\" send \"tes\n\" expect eof "

すると下記のようなエラーとなり、実行されません。

invalid command name "spawn cat /var/log/mysqld.log | grep 'password is generated'" while executing "spawn\ cat\ /var/log/mysqld.log\ \|\ grep\ \'password\ is\ generated\'"

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

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

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

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

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

guest

回答2

0

ベストアンサー

spawnでの実行はシェルを介さないので、パイプなどを認識しません。パイプやバッククォートを扱うためにはシェル経由にします。

Bash

1expect -c " 2spawn sh -c \"cat /var/log/mysqld.log | grep 'password is generated'\" 3expect \".*\" 4send \"tes\n\" 5expect eof 6"

質問のものは意味不明な例なので、本当にやりたいことを書いた方が良いですよ。

#追記
他回答へのコメントと前後しました。なるほど、途中まで書いただけですか。

一般に、各種プログラミング言語や、各種ツールから「外部コマンドを実行できる」という機能には2種類あります。
・直接OSの機能を呼び出す
・シェルにコマンドラインを渡してあとはシェルに任せる

expextのspawnは前者なので、シェルの機能(シェル組み込みコマンド、リダイレクト、パイプ、変数置換、コマンド置換、ファイル名展開など)は使えません。

投稿2017/03/05 10:58

編集2017/03/05 11:36
otn

総合スコア84555

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

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

0

サンプルスクリプトの中でやりたいことの趣旨が今ひとつ見えない
のですが、もし

/var/log/mysqld.log の中に 'password is generated' があれば
"tes\n" と表示したい

ということであれば、そもそも expect を使うというアプローチ自体が
誤っている気がします。上記のことをコマンドで実行するには、たとえば
以下のようにします。

bash

1$ chmod +x a.sh 2$ cat a.sh 3#!/bin/bash 4if grep 'password is generated' /var/log/mysqld.log >& /dev/null 5then 6 echo found 7else 8 echo not found 9fi 10$ echo 'password is not generated' > /var/log/mysqld.log 11$ ./a.sh 12not found 13$ echo 'password is generated' > /var/log/mysqld.log 14$ ./a.sh 15found

expect は、たとえば passwd コマンドや ssh/telnet ログイン時の
ように、キーボード入力待ちで処理が止まっているときに、手入力の
代行をさせて先に進ませるためのコマンドのようです。

やりたいことの想定が誤っている場合は、希望する処理を記載して
ください。

投稿2017/03/05 10:25

hotta

総合スコア1613

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

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

TakakiKuwabara

2017/03/05 10:53

失礼しました。説明に不足がありました。 /var/log/mysqld.log の中にある初期パスワードを拾い、次の処理につなげることが目的です。 パスワード表示後の処理はまだ作っていないため、省きました。 他の方法があることはわかっておりますが、メタ文字のために意図する動作をしない、ということが後々のexpectを使用したシェルに関わってくる可能性があるため、投稿した次第でございます。 よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問