アプリ版:「スタンプのみでお礼する」機能のリリースについて

シェルスクリプトの作成について初心者の者です
サーバ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の意味も勉強したいのですが
 どこかこのあたり解説しているものがあれば教えていただければ
 幸いです
 よろしくお願いします。

A 回答 (1件)

> この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を聞かずに実行します。

あるいは、そういう自動転送に特化したツールを使うのがよいかと。
    • good
    • 0
この回答へのお礼

kmee様
 以前にも助けていただきました
 今回もありがとうございました

 >その文字自体には区切りとしての意味はありません。
>「ヒアドキュメント」といいます。
ありがとうごさいました
 検索して勉強させてもらいます

 
>実際にgetするかどうかを聞いてくるので、 yまたはnを入力したりしてるのでは?

まさしくその状態でした

 >ftpが対応していれば prompt off 等でy/nを聞かずに実行します。

prompt off をスクリプトに記載して実行したら、きれいにコピーして
 くれて、消去もできました
 ありがとうございました

お礼日時:2012/12/11 20:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!