質問: ftpにより自動でファイルをサーバ間移動させたい シェルスクリプトの作成について初心者の者です サーバa(レンタルサーバ)のバックアップファイル(毎日生成)を ・サーバb(自作(fedora-core4))から自動でftp接続させて、 ・サーバaのバックアップファイルをサーバbにコピーして、 ・サーバaのバックアップファイルを消去しようとしています。 皆さんに色々教えていただいて下記(sample)のように記載して 下記の実行結果まできましたが最後の所でつまずいています。 コピー元(サーバa)にあるファイルに頭に「bak***」のつくファイルを すべてコピーしてきて、コピーしたあと、そのファイルを消去しようとしています 例えば、今日(9日)はbak-mysql-*********.sql.gzとbak-root********.tar.bz2 の2種類が(20121207、20121208、20121209)の6ファイルあります つまり、この6ファイルをコピーして、その後、削除させたいと思います それで、サーバaの/rootに下記のsample (ftp_all.sh)のスクリプトを置きました ********** sample (ftp_all.sh) ************************** #!/bin/csh -f #"@(#)ftp_all.sh 1995/07/01 copyright(c)1995 ash" # # name: ftp all files /usr/bin/ftp -n サーバaのipアドレス << eof user username password passive binary cd /home/city21/backup mget bak*.* mdelete bak*.* bye eof ********************************************* その実行結果は次のとおりです *************** 実行結果 *********************** [root@linux ~]# sh ftp_all.sh passive mode off. mget bak-mysql-20121207.sql.gz? mget bak-root-20121207.tar.bz2? mget bak-mysql-20121209.sql.gz? mget bak-root-20121209.tar.bz2? mget bak-mysql-20121208.sql.gz? mget bak-root-20121208.tar.bz2? [root@linux ~]# ****************************************************** この実行結果をみると ・20121207.sql.gz、20121207.tar.bz2、20121209.sql.gz、20121209.tar.bz、20121208.sql.gz、20121208.tar.bz 6ファイルともmgetでファイルをコピーしているかのようにみえます しかし、実際に、サーバb側にコピーされているのは 上記の実行結果の最初の3ファイル、(20121207.sql.gz、20121207.tar.bz2、20121209.sql.gz)しかコピーされて いません また、mdeleteのコマンドが全く効いていません 何故なのか、どこを直せばいいのか教えていただければ幸いです また、今回はスクリプトの中に /usr/bin/ftp -n サーバaのipアドレス << eof ・ ・ ・ eof としたのですが ftp -n サーバaのipアドレス << _eod ・ ・ ・ _eod としている例もあります このeof とか _eodの意味も勉強したいのですが どこかこのあたり解説しているものがあれば教えていただければ 幸いです よろしくお願いします。
回答: > このeof とか _eodの意味 その文字自体には区切りとしての意味はありません。 「ヒアドキュメント」といいます。 > mget bak-mysql-20121207.sql.gz? mget bak-root-20121207.tar.bz2? mget bak-mysql-20121209.sql.gz? mget bak-root-20121209.tar.bz2? mget bak-mysql-20121208.sql.gz? mget bak-root-20121208.tar.bz2? 手動でやってみてください。 mgetに対して mget bak*.* とすると mget bak-mysql-20121207.sql.gz? となどと、実際にgetするかどうかを聞いてくるので、 yまたはnを入力したりしてるのでは? そこで、n以外だと実行とかになっているかと思います。 で、そのスクリプトでの次の入力が、コマンドではなく、そのy/nに対して入力されます。つまり, mget bak-mysql-20121207.sql.gz? に mdelete bak.*.* と入力したような状態になります。 ただ、この入力が表示されないので、見掛けでは改行のない mget bak-root-20121207.tar.bz2? mget bak-mysql-20121209.sql.gz? mget bak-root-20121209.tar.bz2? mget bak-mysql-20121208.sql.gz? mget bak-root-20121208.tar.bz2? と見えます。 ftpが対応していれば prompt off 等でy/nを聞かずに実行します。 あるいは、そういう自動転送に特化したツールを使うのがよいかと。