「シェルスクリプトの基礎 - 入出力」の版間の差分

ナビゲーションに移動 検索に移動
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>


案内メニュー