• 締切済み

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  

みんなの回答

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

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

palayo
質問者

補足

数千数万のファイルになるので、失敗した際に 「ログ見て、転送済みのファイルを手で削除して、再実行」 という手作業だと未転送のファイルを誤削除する可能性もあり、極力避けたいのです。 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なんて使えない気がしますが、 こういうことをおっしゃってたわけではないのでしょうか。

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

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

palayo
質問者

お礼

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

palayo
質問者

補足

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

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

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

palayo
質問者

お礼

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

palayo
質問者

補足

例えば、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

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

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

  • 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した後に、転送が上手く行ったことを確認したいのですがどうすればよいのでしょうか?  コマンドであれば、転送したファイルと同じファイルが存在すれば 良いと思うのですが、自動バッチファイルなら通常どうされているのか 良くわかりません。  初歩的な質問で申し訳ありませんが宜しくお願いします。

  • ftp受信確認

    FTPサーバはwindows2003のIISです FTPクライアントはwindows2000,xpの標準添付のftpコマンドです バッチファイル中でFTP -S:C:\FTPCMD.TXT みたいな感じで起動していますが FTP正常・異常にかかわらず常にERRORLEVELは0が 返ってきます なんとかバッチファイル中で正常通信できたか できないか判断したいのです その判断方法をアドバイス下さい ※その他の手段として  バッチファイルでコマンド起動できるFTPクライアントソフト  (できればフリー)を使えばERRORLEVELが返ってくるよという  ものがありましたら紹介頂けると嬉しいです もしくは ProFTPDが転送中のファイルを".in.{ファイル名}"として、転送完了すると"{ファイル名}"に変更する機能がある そうですがこれと同じような機能はIISのFTPにはないのでしょうか? 設定を探してみましたが見つかりませんでした (FTPサーバーはIIS以外に変更できません)

  • FTP接続ができなくなりました

    ルータの設定を変更した後にプロバイダで開設しているホームページにFTP接続できなくなりました。ルータの設定を戻して、Windowsファイアウォールを無効にしてみましたが、改善しません。FFFTP.exe ではエラー要因が分からないので、InfoByIPというWebサイトから接続試験をしたところ、次の様なログがでました。 (xx はIPアドレス user-id はログインID public_htmlはプロバイダの初期接続先  レは成功、Xは失敗) レ <私>に接続 xx.xx.xx.xx:21 FTPサーバー レ <私>としてログインシテ user-id@xx.xx.xx.xx:21 レ パッシブモードに切替え レ リモートシステムタイプは<私>UNIX X <私>へのリモートディレクトリへの変更に失敗しました。 public_html プロバイダは、FTPサーバーの設定に問題は無いと言うのですが、PC側の設定も以前、接続できていた状態に戻したので、悪いところが分かりません。FTP接続に詳しい方がいらっしゃいましたら、良い対応を教えて頂けると助かります。よろしく御願い致します。

  • FTPソフトで接続できません。

    FTPソフトで接続できません。 現在、Ubuntu上にProFTPDをインストールしました。 それで動作確認の為、TeraTermでUbuntuに接続してFTPコマンドを実行してみました。 ---------------------------------------------------------------------------------------------------- ftp ftp> open (to) localhost Connected to localhost. 220 ProFTPD 1.3.5b Server (ホスト名) [127.0.0.1] Name (localhost:xxxxx): xxxxx 331 xxxxx のパスワードを入力しください Password: 230 xxxxx がログインしました Remote system type is UNIX. Using binary mode to transfer files. ftp> pwd 257 カレントディレクトリは "/" です ftp> close 221 さようなら. ftp> exit ---------------------------------------------------------------------------------------------------- 接続できたのでFileZillaで接続できるかを確認したらエラーが発生してしまいました。 ---------------------------------------------------------------------------------------------------- 状態: x.x.x.x:21 に接続中... 状態: 接続を確立しました, ウェルカム メッセージを待っています... 状態: ログインしました。 状態: ディレクトリ一覧を取得中... コマンド: PWD レスポンス: 257 カレントディレクトリは "/" です コマンド: TYPE I レスポンス: 200 転送タイプを I にセットしました コマンド: PASV レスポンス: 227 Entering Passive Mode (x.x.x.x,172,45). コマンド: LIST エラー: Connection timed out after 20 seconds of inactivity エラー: ディレクトリ一覧表示の取り出しに失敗しました 状態: サーバから切断されました 状態: x.x.x.x:21 に接続中... 状態: 接続を確立しました, ウェルカム メッセージを待っています... 状態: ログインしました。 状態: ディレクトリ一覧を取得中... コマンド: PWD レスポンス: 257 カレントディレクトリは "/" です コマンド: TYPE I レスポンス: 200 転送タイプを I にセットしました コマンド: PASV レスポンス: 227 Entering Passive Mode (x.x.x.x,161,177). コマンド: LIST エラー: Connection timed out after 20 seconds of inactivity エラー: ディレクトリ一覧表示の取り出しに失敗しました ---------------------------------------------------------------------------------------------------- ProFTPDのインストールと設定は下記のURLを参考しました。 https://www.server-world.info/query?os=Ubuntu_17.04&p=ftp&f=2 環境は以下の通りです。 Ubuntu 17.04 ProFTPD Version 1.3.5b Windows7 FileZilla Client 3.26.1 ネットで調べてもエラーを解消する事ができませんでした。 どうか、皆さんのお知恵を拝借したいと思い、投稿しました。 宜しくお願いします。

  • FTPがサーバと接続が出来ない

     はじめて質問します。PC暦1年チョットで正直良く分かりません。  ホームページビルダー11を使ってホームページを作っています(2つ持っています)  最近のことですが、Aのホームページ用のファイルをBのホームページ用のサーバに誤って転送してしまいました。  ホームページビルダー11に、FTPツールというのがあったのでそれを起動してサーバ側のファイルを全て削除して、改めてホームページビルダー11の転送で転送は出来たのですが、FTPのほうがサーバと接続できなくなってしまいました。  ERROR表示は   Microsoft Visial C++ Rantime Library Buffer overrun detected! Program:D\PROGRA"1\IBMHOM"2\bin\fxfer.exe  と出ます。転送設定は正しいと思いますが。どなたかアドバイスをお願いいたします。

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

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

  • FTP 転送コマンド

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

  • CentOS5.2 FTPサーバーに接続できない。

    CentOS5.2を使用しています。 IPアドレスの設定をしたくらいで、 他はデフォルト値でOSをインストールしました。 イントラネットでのFTPサーバーとして利用したいと思っています。 ネットワークには接続していることを確認しています。 OSのインストール後に [アプリケーション]→[ソフトウェアの追加/削除]から、 添付した画面にある[FTPサーバー]にチェックを入れて インストールしました。 サーバー側の設定としては、これでもうOKなのでしょうか? FTPのサービスは起動しているのでしょうか? WindowsXPのクライアントから接続を試みましたが、 「接続できません。」とエラーになってしまいます。 クライアント側では、ホスト名(アドレス)として、 サーバーに割り当てたIPアドレスを設定し、 ユーザー名、パスワードには、サーバーのrootの ユーザー名とパスワードを設定して接続をしようとしました。 そもそもこのユーザーがFTPのユーザーでないような気もするのですが。。。 私なりに頑張って調べてみたのですが、 コマンドラインで設定する方法しか見付けられず、 解決することができませんでした。 もしよろしければ、アドバイス頂けませんか? ぜひよろしくお願いいたします。

専門家に質問してみよう