FTPの処理内容で変数を用いたスクリプトの作成

仕事でFTPのスクリプト作成についての検討をしていたところ、ちょっと覚えておきたい内容があったので備忘として記述しておく。 FTP putのスクリプトなのだが、put先にはそれぞれのホスト名のディレクトリが存在しており、そこにファイルを設置するというスクリプトを作成したかったのだ。で、このホスト名をどうするのか?なのだが…

当たり前の話になってしまうのだが、bashやkshで定義した変数は、FTPのプロンプト内では利用出来ない。

bashやkshで定義した変数を利用するには、これらで作成したスクリプト内で変数を展開する必要がある。 FTPは、以下のような外部ファイルを用いて接続や処理を自動化することが出来るが、そこでも変数は利用出来ない。

$ cat ftptest.txt
open 192.168.0.240
user USER PASSWORD
ascii
cd /tmp
lcd /tmp
put aaa.txt
$ ftp -n < /home/test/ftptest.txt

では、どうすれば変数を使ってFTP接続、処理を行えるのだろうか? 例えば、以下のように記述すればFTPプロンプトでの処理内で変数を利用可能になる。

#!/bin/sh
SERVER=$1
USER=$2
PASS=$3
FILE=$4

ftp -n <<END
    open $SERVER
    user $USER $PASS
    cd /tmp
    binary
    prompt
    mput $FILE
END

引数でそれぞれのパラメータをわたし、FTP接続するスクリプト。 スクリプト自体に手を加えなくても、引数を変えればいいだけなので汎用性がある。

ただ、処理内容や場所等も引数になると数が多すぎる(そもそも、それらが変動するってスクリプトにする必要があるのか?という疑問もあるけど)ので、より汎用性を持たせるにはどうすればいいだろうか? 個人的には、先ほど記述した外部ファイル内で引数を用いて、それをスクリプト側で読み込んで変換、FTPコマンドにわたすようにすれば良いと考えた。

というわけで、ちょっと変則的で分かりにくいのだけど、以下のようなスクリプトを作ってみた。 読み込むFTPの外部ファイル(記述内容に変数を利用)を引数として読みこみ、それをスクリプト内で変換してFTPコマンドにわたす仕組みだ。

#!/bin/sh
HOST_NAME=`hostname`

i=0
while read line;
do
    COMMAND=${COMMAND}`eval "echo $line"`"\n" ;
done<$1
FTP_COMMAND=`echo "${COMMAND}"`

ftp -n <<END
    $FTP_COMMAND
END

引数で渡す外部ファイルの形式はこちら。

open 192.168.0.240
user test test
ascii
cd /home/$HOST_NAME
lcd /tmp
put aaa.txt

外部ファイルにスクリプト内で指定する変数を使用する形式。 ちょっとトリッキーなやり方かもしれないけど、一時ファイルとかも作られない。