パスワード認証のsshサーバからscpでファイルをコピーする作業は、手動の場合は非常に単純なものです。しかしこれをCronで実装するには、対話型でパスワードの入力を求められるため、作成するシェルスクリプトに少し工夫が必要です。
このような場合、expectコマンド(対話型アプリケーションの自動化)を使用して、シェルスクリプト中で「パスワードの入力を行う」処理を行います。
まず前提として、転送元ファイルが置いてあるサーバ名をcrestとします。アカウント名をcrest-user、転送元ファイルが置いてあるディレクトリを/home/crestとし、コピーするファイル名をexm.txtとします。また、転送先のPC名をbozとします。転送先のディレクトリを/home/bozとします。boz上でファイルをコピーしてくるシェルスクリプトをCronで動作させます。
シェルスクリプトは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#!/bin/bash HOST='crest' HOST_USER='crest-user' POS='/home/crest' FNAME='exm.txt' DATE=`date +"%Y%m%d%H%M"` PSWD='パスワード\n' # sshのパスワードを記述 TO_DIR='/home/boz' expect -c " spawn scp $HOST_USER@$HOST:$POS/$DIR/$FNAME $TO_DIR/$FNAME.$DATE expect \"$HOST_USER@$HOST's password: \" { send \"$PSWD\" } interact " |
このシェルスクリプトは、コマンドラインでは問題なく実行できます。そのため、このままCronで動作させようとしたのですが、うまく動作しませんでした。ログインとCronでは動作環境が異なるため起こる現象のようです。そのような場合は、20行目の「interact」を「expect eof exit」に変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/bin/bash HOST='crest' HOST_USER='crest-user' POS='/home/crest' FNAME='exm.txt' DATE=`date +"%Y%m%d%H%M"` PSWD='パスワード\n' # sshのパスワードを記述 TO_DIR='/home/boz' expect -c " spawn scp $HOST_USER@$HOST:$POS/$DIR/$FNAME $TO_DIR/$FNAME.$DATE expect \"$HOST_USER@$HOST's password: \" { send \"$PSWD\" } expect eof exit " |
シェルスクリプトにはパスワードを記述するため、アクセス制限されたネットワークでの使用に限るなど、セキュリティ上、十分に注意する必要があります。