見守り電球またはGPS端末が特価中!

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QFTPサーバ間でのデータ転送について

 FTPサーバ間でファイルやりとりしたいなと思って調べていたら、PASVモードを上手く使えば
できるようなことをネット上に書いてありました。
http://www.atmarkit.co.jp/fnetwork/rensai/netpro11/netpro01.html
 ただ、具体的な方法論まで書いたページを見つけられず。。
もし識者の方がいれば教えて欲しいのですが、次のようなことは可能でしょうか。

●目的「LAN上のFTP機能があるNASから、単独でネット上のFTPサーバとデータのやりとりをしたい」

ファイヤウォールのあるルータの下にFTPサーバ機能がついたNASがあります。
LAN内に外部に公開しているFTPサーバはありませんので、ルータのポートは自由にあけれます。
可能ならば、おそらく、WAN上のFTPをPASVモードにして、そこに繋ぎにいくという形になるのかなという気はしています。

 可能な場合、以下について教えていただけると嬉しいです。
・どのようなソフトを使って実現すればいいでしょうか。
 TELNETでやる場合、どのようなコマンドを送ればいいでしょうか?
(linux、Windowsどちらのソフトでも構いません。
 転送中常時起動が必要なソフトならばlinuxのものだと嬉しいです)
・ルータのポートは空けないといけないものはあるでしょうか。

よろしくお願い致します。

 FTPサーバ間でファイルやりとりしたいなと思って調べていたら、PASVモードを上手く使えば
できるようなことをネット上に書いてありました。
http://www.atmarkit.co.jp/fnetwork/rensai/netpro11/netpro01.html
 ただ、具体的な方法論まで書いたページを見つけられず。。
もし識者の方がいれば教えて欲しいのですが、次のようなことは可能でしょうか。

●目的「LAN上のFTP機能があるNASから、単独でネット上のFTPサーバとデータのやりとりをしたい」

ファイヤウォールのあるルータの下にFTPサーバ機...続きを読む

Aベストアンサー

http://web.kuicr.kyoto-u.ac.jp/~hattori/non-research/memo/tools/ftp.html
http://www.7key.jp/nw/technology/protocol/ftp.html

ftpサーバの第三者間転送は、コマンドさえ覚えれば難しくないです。
ただし、双方でファイアウォールがあると面倒です。

しかし、セキュリティ面で第三者転送は禁止している場合が多いですよ。

QFTPコマンドでディレクトリごとファイル移動できるコマンドはありますか?

タイトルどおりなのですが、FTPでファイルを転送する際に、サブフォルダを含むディレクトリごとファイル転送するコマンドはありますでしょうか。
ディレクトリの中にあるすべてのファイルを移動したいのですが、サブフォルダがたくさんあるので、わざわざディレクトリの場所へ移動してmputを繰り返すのはめんどうで仕方ありません。
よろしくお願いします。

Aベストアンサー

ご使用になるOS環境が書いてないのですが、Linux,BSD等ならncftpで、get -R dir。
Windowsならffftpを使えば良いと思います。

Qscpコマンドでサーバー間のファイルコピー

AサーバーのファイルをBサーバーに転送する方法について教えてください。
ウェブで情報を調べて実行してみましたがうまくいきません。

Aサーバーの/home/me/appをBサーバーの/home/me/testにコピー
BサーバーのSSHのポート番号は●●●●に変更してある。

下記のコマンドを実行
scp -r -P ●●●● /home/me/app user@xxx.xxx.xxx.xxx :/home/me/test


応答メッセージ
--------------------------------------------------------------------------
ssh: connect to host xxx.xxx.xxx.xxx port ●●●●: Connection timed out
lost connection
--------------------------------------------------------------------------

サーバーBのiptables
--------------------------------------------------------------------------
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport ●●●● -j ACCEPT
-A INPUT -s (転送元サーバーのIPアドレス) -p tcp --dport ●●●● -j ACCEPT→追加した行
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 20 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 21 -j ACCEPT
COMMIT
--------------------------------------------------------------------------

サーバーAのiptablesも同じ記載方法です。

サーバーBのiptablesの設定はこれで良いか教えてください。
サーバーAのiptablesに変更が必要であれば記載方法を教えてください。
接続はSSHというのは解ったのですが、ファイルの転送自体は何で行われるのでしょうか?FTPなどでしょうか?

ご回答宜しくお願い致します。

AサーバーのファイルをBサーバーに転送する方法について教えてください。
ウェブで情報を調べて実行してみましたがうまくいきません。

Aサーバーの/home/me/appをBサーバーの/home/me/testにコピー
BサーバーのSSHのポート番号は●●●●に変更してある。

下記のコマンドを実行
scp -r -P ●●●● /home/me/app user@xxx.xxx.xxx.xxx :/home/me/test


応答メッセージ
--------------------------------------------------------------------------
ssh: connect to host xxx.xxx.xxx.xxx port ●●●●: Connection timed ...続きを読む

Aベストアンサー

scpコマンドを使うまえに
まずはsshでリモート接続できるか試してみてはどうでしょう
sshでのリモート接続ができないようであれば
scpコマンドはおそらく通りません

iptablesの設定は正直
実際にいじりながらではないと
この設定でOKとはいえない部分もあります

それと・・・
FTP転送ではないです
sshもscpもやりとりされるデータは暗号化されています
暗号化されているものでsftpというものも
用意されていますよ

Q起動しているサービスを確認するコマンド

初歩的な質問で恐縮ですが、ご教示いただけますと幸いです。

起動しているサービスを確認するために以下の2つのコマンドを打ってみるのですが、結果(出て来るサービス名)が違います。
このコマンドの違いについてご教示いただけますでしょうか。

(1)service --status-all
(2)chkconfig --list

Aベストアンサー

(1)service --status-all

サービスの現在のステータスを調べるコマンド

(2)chkconfig --list

OSのブート時に自動起動するサービスを調べるコマンド

違いが出るのは、
・ブート後に手動あるいは他のコマンドから起動したサービス
・ブート後に手動あるいは他のコマンドから、あるいはエラーで停止したサービス
・ブート後に実行はされるがすぐに停止して常駐しないサービス (ntpdate とか)

あるいは、(1)ではサービス名が表示されない物もあるので、どのサービスがどんなステータス出力をするのか知っておく必要もありますね。(service network statusとか)

Qファイルサーバー間のデータコピーについて

ファイルサーバー(マスター)のデータを、ファイルサーバ(バックアップ)に
ネットワーク経由でコピーしようとしています。

コピーのコマンドを実行するのは、同じネットワーク内に設置している
クライアントPC(Windows8.1)からです。

この場合、処理の命令はクライアントPCから行いますが、データの流れとしては
以下のような認識で正しいでしょうか?

■想定しているデータの流れ
ファイルサーバー(マスター) → ファイルサーバー(バックアップ)

■想定していないデータの流れ
ファイルサーバー(マスター) → クライアントPC →ファイルサーバー(バックアップ)

前者の動きをすると考えているのですが、気になっている点としては、
クライアントPCをシャットダウンしたり、コピーのコマンドを停止すると
処理が止まるため、もしかすると後者の動きが正しいのでは、と考えた次第です。

また、ファイルサーバはバッファロー社のNASを使用しております。


クライアントPCのHDDがSSDのため、極力負荷をかけたくないという考えがあり
上記の質問をいたしました。
お手数ですが、お教え頂けますと幸いです。

ファイルサーバー(マスター)のデータを、ファイルサーバ(バックアップ)に
ネットワーク経由でコピーしようとしています。

コピーのコマンドを実行するのは、同じネットワーク内に設置している
クライアントPC(Windows8.1)からです。

この場合、処理の命令はクライアントPCから行いますが、データの流れとしては
以下のような認識で正しいでしょうか?

■想定しているデータの流れ
ファイルサーバー(マスター) → ファイルサーバー(バックアップ)

■想定していないデータの流れ
ファイルサーバー(マスター) → ...続きを読む

Aベストアンサー

コピーするプログラムの内部動作としてクライアントPCのメモリー上に読み込んだデータを展開してバックアップに書き込みますので、後者の動きです。実メモリー内に展開できない場合は仮想記憶としてHDD(この場合はSSD)も利用します。

前者の動きをするためには、マスターのサーバーに対して「バックアップに書き込め」という動作をさせないとだめです。


ところで、SSDの寿命をきにされているのでしたら、現行製品でしたら気にしなくても良いレベルですよ。


人気Q&Aランキング