プロが教える店舗&オフィスのセキュリティ対策術

linuxマシン(ローカル)から、レンタルサーバ(さくら)
のバックアップファィルを自動でダウンロードしようとしています

 linuxマシンのサーバで下記のようにコマンドを順番にたたくとダウンロード
できます
 
================================================================
[root@linux ~]# ftp -i ***.***.***.*** 
Connected to ***.***.***.***.
220 ProFTPD 1.3.3g Server (SAKURA Internet FTP Server) [***.***.***.***]
500 AUTH not understood
500 AUTH not understood
KERBEROS_V4 rejected as an authentication type
Name (112.78.112.40:root): abcde
331 Password required for abcde
Password:
230 User abcde logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> passive
Passive mode off.
ftp> binary
200 Type set to I
ftp> cd /home/abcde/backup/
250 CWD command successful
ftp> mget bak*
local: bak-mysql-20111226.sql.gz remote: bak-mysql-20111226.sql.gz
200 PORT command successful
150 Opening BINARY mode data connection for bak-mysql-20111226.sql.gz (2431811 bytes)
226 Transfer complete
2431811 bytes received in 0.43 seconds (5.5e+03 Kbytes/s)
local: bak-mysql-20111111.sql.gz remote: bak-mysql-20111111.sql.gz
200 PORT command successful
150 Opening BINARY mode data connection for bak-mysql-20111111.sql.gz (2459206 bytes)
226 Transfer complete
2459206 bytes received in 0.44 seconds (5.5e+03 Kbytes/s)
ftp> quit
221 Goodbye.

=================================================================

 次に、シェル等をcronに登録して自動化したいので下記URLを
http://q.hatena.ne.jp/1244629690
参考にして次のスクリプトを記載してlinuxマシンの/root
に入れました

=================ftp_all.sh===========================
#!/bin/csh -f
#"@(#)ftp_all.sh 1995/07/01 Copyright(C)1995 ASH"
#
# name: ftp all files
#

ftp -n ***.***.***.*** << _EOD
user (ユーザ名) (パスワード)
passive
binary
cd /home/*****/backup
mget bak*.*
bye
_EOD
========================================================


そして、ローカルサーバから
# sh ftp_all.shとたたくと
下記のようになりスクリプト(?)がうまく働いてないように
みえます

=====================================================
: command not found
AUTH not understood
AUTH not understood
KERBEROS_V4 rejected as an authentication type
Login incorrect.
Login failed.
?Invalid command
?Invalid command
Please login with USER and PASS
Please login with USER and PASS
Passive mode refused. Turning off passive mode.
Please login with USER and PASS
ftp: bind: Address already in use
?Invalid command
=====================================================

これとは別にWindowsマシンからのバッチファイルでは
ダウンロードできるのですが、linuxのローカル側から
ダウンロードしたいので・・・

どなたか、どのようにすれば自動化できるか教えていただけないで
しょうか
よろしくお願いします。

A 回答 (2件)

改行コードは


Windows標準は CR+LF (ASCIIコード13,10と2文字使用)
Linux等のunix系標準は LF (ASCIIコード10と1文字使用)
です。CR+LFのファイルをそのままLinuxで使おうとすると、CRが「ただの文字」と扱われてしまいます。
そのため、CRをファイルやコマンドの一部だと解釈され、エラーになったり、なぜか消せないファイルができたりします。
# 消せないのは、見えるファイル名だけを指定するだけでは、CRが含まれないためで、*を使うとかすれば消せます。

CRは端末でカーソルを行頭へ復帰させるために使うコードでもあります。
そのため、本当は
~: command not found と表示するところが ~のあとにCRで行頭に戻って、:以降で上書きされて :ではじまったように見えている状態です。


対処法ですが
・Windows側で対応
エディタでの設定で、改行をLFにする。
大抵のまともなエディタは対応しています。
また、他の大抵のアプリでは、LFのファイルでも普通にテキストファイルとして読み込めます。
メモ帳のようにどちらもできないものもありますが。

・転送時に対応
FTPにはASCIIモードといって、転送時の改行コードを修正するモードがあります。
これで送ると、転送相手にあったものになります。
切り替えを忘れると、変えてはいけないバイナリーデータまで変わってしまうので、注意が必要です。

・Linux 側で対応。
CR+LFのまま転送しても、nkf,dos2unix等の変換アプリがあります。
適当なエディタで開いて、LFで保存しなおすのも手です。

漢字コードについても同様です。

mdeleteについてはわかりません。


あと、今回の範囲では問題ないですが
> #!/bin/csh -f
と書いてあっても
> sh ftp_all.sh
と実行すれば、cshではなくshで実行します。B-sh系とC-sh系では文法などいろいろ違うので、注意しましょう。
シェルスクリプトではBsh系が使われます、
    • good
    • 0
この回答へのお礼

kmee様
 丁寧に説明いただきありがとうございました。
 改行コードについてよくわかりました。
 windowsとlinuxでの違いもあることが理解できました。
 
 あと、スクリプトの最上位にある
 > #!/bin/csh -f
 これについてもわからないままに利用していました。
 B-sh系とC-sh系での違いがあることも理解しました。
 これも次の勉強の入口がわかりました。
 
 次に
>mdeleteについてはわかりません。
この件ですが、おそらくということなのですが、FTPツールでダウンロード
 した時の状態をみていると、ダウンロードするファイルが大きいので
 deleteできるようになるために結構時間がかかります
 このことがあるのかと想定しています

 従って、後で、時間をとるコマンドを記載するか
 別のdeleteするスクリプトを作成し、数分の時間をおいてそれを走らせる
 やり方でためしてみるつもりです

 いずれにせよ、丁寧に教えていただいてありがとうございました。

 

お礼日時:2012/03/16 08:14

表示は


: command not found
でしたか? その行は:で始まっているのですか?

もしそうなら、一つあやしいのは、改行コードです。
ftp_all.sh を作ったのがWindowsで、それをFTPで転送した、ってことは無いですか?

この回答への補足

補足させていただきます
【Viコマンドで直接たたいた場合】
 うまく動作しました。ありがとうございました。
【windowsエディターで作成した場合】
  文字コード・・・自動選択
  改行コード・・・LF
これで動作しました
  ↑上記が正解でしょうか?

別の質問にすべきかもしれませんが・・・
 質問のmget bak*.*のあとに
 mdelete bak*.*としたのですが
 ダウンロードはしているのですが、ファイル削除していません
 このコマンドの利用はできないのでしょうか?
わかれば教えていただけば幸いです

補足日時:2012/03/15 08:51
    • good
    • 0
この回答へのお礼

いつも返答ありがとうございます。
>:command not found
>でしたか? その行は:で始まっているのですか?

そのとおりです。「:」で始まっています

>ftp_all.sh を作ったのがWindowsで、それをFTPで転送した、ってことは無いですか?

当方はいつもそのような作成をしています
ftp_all.shを削除してみて、vi コマンドで直接作成してみます
その結果は後で報告させていただきます

なお、改行コード等は
エディターは、「MKEditor」
保存する時にファイルの種類を「*.*」
文字コードは「EUC」
改行コードは「CR+LF」としました
どの組み合わせが最適なのか教えていただければ幸いです

お礼日時:2012/03/15 08:02

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