• 締切済み
  • 困ってます

shでftp⇒接続切らずに成否確認して削除可?

ftpで多数のファイルを転送(put)したいです。 転送した後に転送エラーがないか確認し、 転送エラーがなければローカルのファイルを削除する、 ということを1ファイルずつ行いたいです。 ftpコマンドをヒアドキュメントやコマンドファイルを使用して実行する場合、 転送エラーがあったかどうかは、ftpの出力結果を見ないと分からないので、 いったんftpコマンドを終了する必要があると思います。 そうすると、1ファイルずつftpのコネクションを張りなおさないとならないので、 WAN経由での接続を考慮すると相当効率が悪いと思うのですが、 接続を切らずに実現することは可能でしょうか。 理想案: 転送先にftp接続 すべての対象ファイルに対し、  ┣ファイルをput  ┗putが成功したら   ┗ファイルを削除 ftp接続を切断 現実案: すべての対照ファイルに対し、  ┣転送先にftp接続  ┣ファイルをput  ┣ftp接続を切断  ┗putが成功したら   ┗ファイルを削除 現実案の実装だと、こんな感じかと思います。 実際に動かしてないので、間違いあるかもですが。 for file in `ls` do  ftp -n ${hostname} > ftp.log << _EOF   user ${user} ${pass}   put ${file}   bye  _EOF  if [ `grep "err" ftp.log` ]; then   exit 1;  else   rm -f ${file}  fi done  

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数1585
  • ありがとう数3

みんなの回答

  • 回答No.3
  • notnot
  • ベストアンサー率47% (4606/9664)

>途中で失敗した場合や停止した場合の再実行の際、すべて再実行となるのを避けたいのです。 そんなものは、ログをちゃんと解析すればどうとでもなります。 失敗した時点から後を再送すれば良いだけ。 あと、 >標準出力には一切出力しないという制限があるので、 と >expectは使用できないかと思います。 に何の関係があるのかわかりません。何かの勘違いでは?

共感・感謝の気持ちを伝えよう!

質問者からの補足

数千数万のファイルになるので、失敗した際に 「ログ見て、転送済みのファイルを手で削除して、再実行」 という手作業だと未転送のファイルを誤削除する可能性もあり、極力避けたいのです。 expectについては、ftpコマンドを実行して、ftpのプロンプトをexpectしながら実行する、ということであれば、標準出力が必要になりませんか? 下記のようなイメージだと思ったのですが、 私の勘違いであれば教えてください。 ftp ${hostname} !expect "User:" ${user} !expect "Password:" ${pass} !for file in `ls` !do  !expect "ftp>"  put ${file}  !if (何らかのエラーハンドリング) then   bye;   !exit 1;  !else   !rm -f ${file}  !fi !done !expect "ftp>" bye そもそもftpの中でforやifなんて使えない気がしますが、 こういうことをおっしゃってたわけではないのでしょうか。

関連するQ&A

  • bashからFTPコマンドのステータスを調べる方法

    bashからFTPコマンドのステータスを調べる方法 シェルでFTPによるファイル転送を行っていますが、FTPが成功したかどうかをシェル側で受け取ることはできますか? FTP転送に失敗したら、3回やりなおして、それでダメならあきらめるというスクリプトにしたいです。 <サンプル> /usr/bin/ftp -n -v hostname << EOF user user1 passwd1 binary put file1 bye EOF

  • FTP 転送コマンド

    Free BSD4.8でFTPを使いputコマンドでフォルダ(ディレクトリ)ごと転送するとnot a plain fileとエラーがでました。フォルダごと転送するにはどうすればいいでしょうか。もしくはそのディレクトリのファイル全てをまとめて putするにはどうすればいいでしょうか?よろしくおねがいします。

  • シェルでftp接続によるファイル取得について

    以下のようなシェルスクリプトを作成しましたが、 (file-name) get: No such file or directory (file-name) done: No such file or directory のエラーメッセージが出てしまい、うまくいきません。 OSはLinux(FedoraCore4)です。 どうやらファイル名の取得がうまくいかず、エラーになっている 様です。 試しに直接ファイル名を指定して書くと、無事ファイルを 取得できます。 エラーの原因がお分かりになる方、どうぞ宜しくお願い致します。 ----------------------------------------------- #!/bin/sh cd /local_test/log/ ftp -n xxx.xxx.xxx.xxx<< _EOF user test_user test_pass cd /test/log/ ascii prompt for i in *.log do chmod u+r $i get $i chmod u-r $i done bye _EOF exit 0 -----------------------------------------------

  • 回答No.2
  • notnot
  • ベストアンサー率47% (4606/9664)

No1です。 >例えば、ftpコマンドを子プロセスとして標準入力待ちとなる状態で起動しておいて、その子プロセスにメッセージを送ることは可能でしょうか。 expectコマンドを使えば可能です。ただエラー判定まですると、かなり面倒だと思います。 使い方は検索してください。 私なら、そんなことはしないで、 転送先にftp接続 すべての対象ファイルに対し、  ┗ファイルをput ftp接続を切断 すべての対象ファイルに対し、  ┗putが成功していたら   ┗ファイルを削除 と、最初にまとめてputしますね。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

調べた限りでは、こちらのサイトによると <http://www.itmedia.co.jp/enterprise/articles/0805/13/news040_3.html> kshにはコプロセスというのがあり、 親プロセスから子プロセスに入力したり、 子プロセスの出力を親プロセスで受け取ったり、 というのが簡単にできるようです。 bashでこれと同等のことをやろうとすると、 どのような方法が考えられるのでしょうか。

質問者からの補足

例では`ls`してるだけですが、 実際には多量のファイルを転送することになるので、 途中で失敗した場合や停止した場合の再実行の際、 すべて再実行となるのを避けたいのです。 また、後だし情報ですいませんが、 標準出力には一切出力しないという制限があるので、 expectは使用できないかと思います。

  • 回答No.1
  • notnot
  • ベストアンサー率47% (4606/9664)

>接続を切らずに実現することは可能でしょうか。 shスクリプトからftpを起動するやり方では不可能です。 自分で、ftpに代わるプログラムを書けば可能です。 >if [ `grep "err" ftp.log` ]; then これはおかしい。 >if `grep "err" ftp.log` ; then

共感・感謝の気持ちを伝えよう!

質問者からのお礼

> 自分で、ftpに代わるプログラムを書けば可能です。 shスクリプトで実現可能かどうかを教えてください。

質問者からの補足

例えば、ftpコマンドを子プロセスとして 標準入力待ちとなる状態で起動しておいて、 その子プロセスにメッセージを送ることは可能でしょうか。 イメージはこんな感じ? ftp -n ${hostname} > ftp.log & FTP_PID=$$ ${FTP_PID}プロセスに入力 "user ${user} ${pass}" (*1) for file in `ls` do  ${FTP_PID}プロセスに入力 "put ${file}" (*1)  putが完了するのを待機(*2)  if `grep "err" ftp.log` then   exit 1;  else   rm -f ${file}  fi done ${FTP_PID}プロセスに入力 "bye" (*1) (*1)の子プロセスの標準入力に親プロセスから入力を渡すこと (*2)の子プロセスのput完了を確認すること ができれば実現できそうな気がしてます。 (*2)はftp.logをチェックしてればできそうですが、 (*1)はどうやったらできるのか全然わかりません。 (*1)の実現方法、もしくは、もっといい方法があれば (こういうときはこうやるんだぜ~とか) 教えてください。

関連するQ&A

  • shスクリプトでftp接続してファイル転送したい

    テキストファイルの1行の文字列を読込んで ftpで、文字列と同名のファイルを別サーバに転送する shスクリプトを作成したいと思っています。 テキストファイルから読込んだ文字列を変数に格納して ftp接続後、putで変数を指定すると 『変数名のファイルがありません』 というエラーがでます。 エラーメッセージから、変数が変数として扱われていない。 ファイル名そのものとして扱われていると思います。 テキストファイルから読込んだ文字列をftpで使用するには どうしたらよいでしょうか? また、何か代替案はあるのでしょうか? 簡略化したshスクリプトの内容は以下の通りです。 ------------------------------------ #!/bin/sh read filename <./test.txt ftp -n host_name <<"EOD" user user_name password passive binary cd /export/test put filename bye EOD -----------------------------------

  • ftpコマンド出力結果の取得

    ftpコマンドのバッチ処理によってファイルの一覧の結果を取得したいのですが、 リダイレクション等を用いても取得できません。 どのようにすればいいか教えてください。 **************状況************* OSおよびOSレベル:AIX5.2 シェル:Kシェル コマンドファイルの中身(ftp.txt) cat << EOF | ftp -n open SERVER user USER PW cd PATH ls -l bye EOF SERVER:実際のサーバー名 USER:実際のユーザー名 PW:実際のパスワード PATH:実際のパス これを以下のように実行し、結果を取得しようとしました。 # ./cmd.ftp > log しかし、出力ファイルlogの中身はカラっぽでした。 ところが、リダイレクションを外し、コマンドファイルのみを実行すると、結果が画面に表示されます。 何故、画面には表示されるのに、リダイレクションやパイプでは結果が渡されないのかが分かりません。

  • phpのftp_putについて

    はじめましてphp初心者です。 以下の内容を実行した際に うまく行かず困っています。 $ftp_server="【サーバー名】"; $ftp_user_name="【アカウント名】"; $ftp_user_pass="【パスワード】"; //サーバーに接続する $conn_id = ftp_connect($ftp_server); // ユーザ名とパスワードでログインする $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // 接続できたか確認する if ((!$conn_id) || (!$login_result)) { echo "FTP接続に失敗しました。"; exit; } else { echo "FTP接続に成功しました。"; } $local_file="【ローカルのファイルパス】"; $remote_file="【FTPサーバー上のアップロードファイルパス】"; if (!ftp_put($conn_id, $remote_file, $local_file, FTP_ASCII)) { echo "FTPアップロードに失敗しました。"; exit; } else { echo "FTPアップロードに成功しました。"; } ftp_close($conn_id); ローカル、リモート共にファイルの位置は間違っていません。 また以上のように反映させた際に返ってくる答えは 「FTP接続に成功しました。」 「FTPアップロードに成功しました。」 と出てきます。 しかし、ffftpを確認したところ サバー側に変化がありません。 手動ではffftpでアップ可能です。 ご教授お願い致します。

    • 締切済み
    • PHP
  • ftp_getできない?

    レンタルサーバの自前のファイルサーバからFTP接続にてファイルを取得しようとしているのですが、エラーとなってしまいます。 FTP接続はできているのですが、ファイルの取得に失敗(FALSE)してしまいます。 レンタルサーバの環境は OS:Linux PHP:4.4.1 試しにftp_nlist関数にてファイル一覧を取得しようとしましたが、やはり失敗(FALSE)してしまいます。 知り合いのレンタルサーバを借用して全く同じプログラムを実行すると正常に一覧の取得ができました。 FTP接続時・ログイン時にはエラーが発生していないのでFTPでの転送は可能だと思うのですが、全くわかりません。 どなたか分かる方ご教授お願いします。 以下、スクリプトです。 if($ftp=ftp_connect($ftp_host)){  if(ftp_login($ftp,$ftp_user,$ftp_pass)){   //ファイルリスト一覧取得    $file_list=ftp_nlist($ftp,".");   var_dump($file_list);   //ファイルダウンロード    if(!(ftp_get($ftp,$local_file,$remote_file,FTP_BINARY))){     エラー処理1;    }   }   else{     エラー処理2;   } } else{  エラー処理3; }

    • ベストアンサー
    • PHP
  • FTPでタイムアウトになる

    RedHatLinuxのサーバ間でFTP転送しようとしています。 例えばAとBとCというサーバがあったとします。 OSは全てRedHatLinuxでAとBは7.1、Cは7.3です。 FTPサーバは全てwu-ftpdです。 FTPコマンドで接続し、putで転送しようとしていて、BからAへの転送は正常にできます。 CからAに行おうとすると、接続は問題無いのですが、ファイル転送の際、数分後に「Connection Timed out」と出てしまい転送できません。 CからBに転送しようとしても同様のエラーでできませんでした。 ちなみにAとB及びCの間にファイアウォールが設定されていますが、BからもCからも通す設定にしていますし、 接続が正常にできるのでこれは問題ないと思うのです。BとCの間にはありません。 アクセス制限によるものかと思いましたが、特に制限していないですし、 一応ftphosts、tpusers、ftpgroupsやhosts.allow、hosts,denyファイルを確認してみたのですが、特に これと思われるものがありませんでした。 転送するファイルのアクセス権限を色々いじってたので、これが原因かとも思いましたが、 BからAに転送したものと同様に変更してみましたが、ダメでした。 何が原因なのでしょうか。

  • ftpの操作について・・・

    最近コマンドをいじるようになりましたが、 ftpでどうもつまづいています。 詳しい方がいましたら、いくつかまとめてお聞きしたいです。 最近ホームページを作ろうと思いまして、日々ftpの努力を致しております。 よろしくお願いします。 質問 (1) ftp時のputコマンドについて、 送り先のフォルダー(ディレクトリー)を指定できないのですか? ftp>put index.html /web 200 PORT command successful 550 /web: Not a regular file と言うエラーになる。 エラー内容 : 要求されたリクエストはアクセス権限やファイルシステムの理由で実行できない ※ほかに何か指定して、使うのですか? (2)ftp時、> が無い時は何を意味しているのですか? たとえば、 ftp>227   (IP) _  ←(ここ) cat時などは、ファイルの内容を書くと思いますが、 使い方が解らないときがあります。 良かったらよろしくお願いします。 (3)webで検索をかけると、ftp時に、LISTやモードを切り替える、passive など、いろんなコマンドがあるのですが、使おうとすると「コマンドが無効です。」 と出たりするのはなぜですか? ※コマンドプロンプトで検索して、?やHelpに無いコマンドで説明してあったりする。 よろしくお願いします。

  • NTのFTP通信

    こんにちわ Windows NT 4.0 workstationにて(数台) FTP転送したいのですが、 転送するファイル名が固定ではありません。 転送するファイルは以下のようなファイルになります。 yanolog.txt saitolog.txt sayamalog.txt このような場合、下記のputのぶぶんを put *log.txt で実行しても転送されるでしょうか? open ftp.noname.ne.jp bluepixy password ascii put *log.txt close quit よろしくお願いします

  • FTP受信が不調

    Linux側クライアント、PC側サーバの役割でクライアント側からファイルをFTPによりダウンロードします。 64KBのファイルを400msecに一回の繰り返しで数十回受信するとFTPのところでHangUpしてしまいます。 この障害は数回目で発生することもあれば20回無事通り抜けることもあります。  障害の原因がクライアント側なのかサーバ側なのか特定できていません。  クライアント側LinuxのプログラムではFTP受信は専用スレッドを設け、メインと分離していますが、受信スレッドに十分なリソースが配分されないことが原因かなとも思っています。  Windows側はFTP6サーバをコンパネ>『プログラムと機能』で組み込んでいます。 FTPクライアント側:  Linux2.6.18-at9 Debian PowerPC 内部クロック300MHz  メインスレッド側からメッセージキューにより開始信号を受け  system("msh fileRcv.sh file"); により、Winodws側にファイル送信を要求します。 fileRcv.shの内容は: #!/bin/sh HOST_NAME="192.168.1.3" USER="ftp" PASSWORD=NULL ftp -n ${HOST_NAME} >&2 >ftpLog.txt << _EOF_ user ${USER} ${PASSWORD} bin get ${FILE_NAME} bye _EOF_ exit です。  解決には何よりもエラーLOGを取得することが先決ですが ftp -n ${HOST_NAME} >&2 >ftpLog.txt << _EOF_ の記述に問題があるのか、うまくエラーLOGを取得できません。 何とか得られた結果は以下の通りでした: receive aborted waiting for remote to finish abort  この内容では解決にはなりません。  なにか解決のヒントがあればお願いいたします。

  • FTPでのファイルPUT

    あるサーバに毎日吐かれている log.YYMMDDといったファイルがあり、 それを別のFTPサーバにPUTするシェルを作りたいのですが ************ CDATE=`date "+%y%m%d"` FILENAME=log.${CDATE} >ftp >open 192.168.XXX.XXX >user xxxx xxxx >get $FILENAME >disconnect FTPの部分は実際にはテキストにします。 上記のように入力すると$FILENAMEなんてありませんという エラーになってしまいます。 FTPに入っても有効にはできないのでしょうか?

  • ftp 接続先のフォルダのファイル数を知りたい

    FTP接続した後、特定のフォルダ内のファイル数(個数)を知りたいのですが、 そういったコマンドはありますでしょうか?? やりたいこととしては、Linux -> FTPサーバーへデータ転送をしているので、 終った後に、転送元と転送先でデータ数の整合を行いたい為、FTP側のファイル数を知りたい。といった状況です。 アドバイスをお願い致します。