13,000
回編集
126行目: | 126行目: | ||
|} | |} | ||
</center> | </center> | ||
<br><br> | |||
== expectコマンド == | |||
expectコマンドを使用すると、任意のコマンドの出力を待ち受けて、自動でそれに対する入力を行うことができる。<br> | |||
例えば、SSHやRsyncのパスワード入力を自動化することができる。<br> | |||
<br> | |||
expectコマンドがインストールされていない場合は、パッケージ管理システム等を使用してインストールする。<br> | |||
<br> | |||
==== expectコマンドの基本 ==== | |||
以下の例では、簡単なユーザ入力を必要とするスクリプトを自動で動作させている。<br> | |||
<syntaxhighlight lang="sh"> | |||
#!/bin/sh | |||
read -p "Enter your name: " NAME | |||
echo "Hello, $NAME" | |||
</syntaxhighlight> | |||
<br> | |||
これを実行すると、以下のようにユーザ入力の待ち受け状態となる。<br> | |||
Enter your name: | |||
<br> | |||
この状態において、自動的に入力を行うには、以下のように<code>expect -c</code>コマンドを使用する。<br> | |||
以下の例では、外部のシェルスクリプト(Sample.sh)の入力待ちに対して、自動的にMakuという入力を行っている。<br> | |||
<syntaxhighlight lang="python"> | |||
#!/bin/sh | |||
expect -c " | |||
set timeout 3 | |||
spawn ./Sample.sh | |||
expect \"Enter your name:\" | |||
send \"Maku\n\" | |||
interact | |||
" | |||
# 出力 | |||
spawn ./Sample.sh | |||
Enter your name: Maku | |||
Hello, Maku | |||
</syntaxhighlight> | |||
<br> | |||
<code>expect -c</code>コマンドのダブルクォーテーションで囲まれた部分には、実行するシェルスクリプトを記述する。<br> | |||
また、この内部でダブルクォーテーションを使用する場合は、<code>\"</code>と記述してエスケープしなければいけないことに注意する。<br> | |||
<br> | |||
expect -cコマンドの内部の各行は、以下のような意味を持っている。<br> | |||
* set timeout 3 | |||
*: 外部のシェルスクリプト(Sample.sh)の実行を3秒待つ。 | |||
* spawn ./Sample.sh | |||
*: 指定した外部プログラム(./greet.sh)を実行する。 | |||
* expect \"Enter your name:\" | |||
*: 外部プログラムの出力(Enter your name:)を待つ。 | |||
* send \"Maku\n\" | |||
*: 外部プログラムにMakuと入力して、最後にEnterを入力する。 | |||
* interact | |||
*: 外部プログラムとのインタラクションへ戻る。 | |||
<br> | |||
==== SSH接続やRsync接続のパスワード入力を自動化する ==== | |||
SSHコマンドやRsyncコマンド等のパスワード入力も自動化することができる。<br> | |||
ただし、シェルスクリプト等にパスワードを平文で記述することになるので、ファイルの扱いには十分に注意すること。<br> | |||
<br> | |||
以下の例では、SSHコマンドがパスワード入力を求めてきた時、自動でパスワードを入力してログインしている。<br> | |||
<syntaxhighlight lang="sh"> | |||
#!/bin/sh | |||
expect -c " | |||
set timeout 3 | |||
spawn ssh <ユーザ名>@<ドメイン名またはIPアドレス> | |||
expect \"password:\" | |||
send \"<パスワード>\n\" | |||
interact | |||
" | |||
# 出力 | |||
spawn ssh <ユーザ名>@<ドメイン名またはIPアドレス> | |||
<ユーザ名>@<ドメイン名またはIPアドレス>'s password: | |||
Last login: Sat Nov 10 19:58:51 2018 from hogehoge.ap.example.jp | |||
</syntaxhighlight> | |||
<br> | |||
ログイン後に、何らかのコマンド(例 : ls -alF)を実行するところまで自動化するのであれば、<br> | |||
以下のように、プロンプトの$を待ち受けて、次の入力を行えばよい。<br> | |||
<syntaxhighlight lang="sh"> | |||
#!/bin/sh | |||
expect -c " | |||
set timeout 3 | |||
spawn ssh <ユーザ名>@<ドメイン名またはIPアドレス> | |||
expect \"password:\" | |||
send \"<パスワード>\n\" | |||
expect \"$\" | |||
send \"ls -aFl\n\" | |||
interact | |||
" | |||
</syntaxhighlight> | |||
<br> | |||
また、Rsyncコマンドでファイル転送する場合も、同様にパスワード入力を自動化できる。<br> | |||
<syntaxhighlight lang="sh"> | |||
#!/bin/sh | |||
expect -c " | |||
spawn rsync -r -h -v --delete public <ユーザ名>@<ドメイン名またはIPアドレス>:public | |||
expect \"Password:\" | |||
send \"<パスワード>\n\" | |||
interact | |||
" | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||