久々にシェルスクリプトをやったんでその復習を。
応用範囲は結構広そうです。
ファイルの読みこみ方
1 |
. autoLogin.sh |
こんなことも知りませんでした。カレントディレクトリであれば、上記のように. ファイル名だけでよいようです。
関数の定義、使い方
シェルスクリプトの場合、呼び出す前に関数を定義しておかないと呼び出せません。
引数は$1,$2...とします。
1 2 3 4 5 6 |
action(){ echo $1 echo $2 } action "hoge" "foo" |
SSHログイン
通常は対話しながら処理を行います。このような場合、expectというメソッドが必要になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
auto_ssh() { host=$1 id=$2 pass=$3 command=$4 port=$5 expect -c " set timeout 10 spawn ssh ${id}@${host} -p ${port} ${command} expect \"Are you sure you want to continue connecting (yes/no)?\" { send \"yes\n\" expect \"${id}@${host}'s password:\" send \"${pass}\n\" } \"${id}@${host}'s password:\" { send \"${pass}\n\" } expect eof exit " } |
ちなみにcronなどで実行する場合、一番最後を
1 2 |
expect eof exit |
と記述しなくてはいけません。
ssh鍵認証つきのログイン
ちなみに鍵認証つきのログインの場合は下記のようになります。
keyは秘密鍵のパスになります。
鍵認証ログインに関してはこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
auto_ssh_key(){ host=$1 port=$2 id=$3 pass=$4 command=$5 key=$6 expect -c " set timeout 10 spawn ssh ${id}@${host} -p ${port} -i ${key} ${command} expect \"Enter passphrase for key '${key}':\" send \"${pass}\n\" expect eof exit " } |
メール送信
いろいろな書き方があると思いますが、下記が一番簡単でした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
sendMailShell(){ from=$1 to=$2 subject=$3 contents=$4 /usr/sbin/sendmail -f ${from} ${to} <<EOM From: ${from} To: ${to} Subject:${subject} Content-Type:text/plain;charset=UTF-8; ${contents} EOM } |
これを組み込んでメールを飛ばすことができます。
cron実行時の注意
- ユーザー権限のチェック
- ファイルパスを絶対パスで記述しているか
- 必ずcdコマンドでカレントディレクトリに移動する
- わからない場合は ファイルパス>/var/log/hoge.txt 2>/var/log/error_log.txt などとしてエラーログを見る
参考リンク
シェルスクリプト基礎
SSHコマンドで 公開鍵認証(鍵交換)を使ってSSH 接続してみる
関数の使い方
SSHログイン
[Shell] crontabでシェルスクリプトのexpectコマンドがうまく動かない
鍵認証のSSHログイン
ポート番号指定
[…] シェルスクリプトで動かしたいときは↓の方法がそのまんま使えます。sshコマンドをそのままSCPに切り替えます。 シェルスクリプトでのsshログインとメール送信 […]