• ベストアンサー

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 -----------------------------------

質問者が選んだベストアンサー

  • ベストアンサー
  • coredump
  • ベストアンサー率46% (12/26)
回答No.3

どもです。 え~っと、このような時にはexpectという言語を 使うのが便利が宜しいです。まぁ、perlとかでも 同じような事が出来ますが、、、 で、expectを使用する場合、実環境でコードを 書かないとつらいものがあります。 一応、サンプルを以下に乗せますが、多分動作 しないでしょう。 expect "XX" となっているところは、FTPで接続しているときに 表示される文字列が来るまで待つって意味なので、 XX が来るまで待つって感じです。 #!/usr/local/bin/expect if { $argc < 1} { puts "Error" exit 1 } set fname [lindex $argv 0] # 要修正 spawn ftp 192.168.100.135 # 要修正 ユーザー名 expect "Name" expect ":" send "hogeuser\r" # 要修正 パスワード expect "Password:" send "hogepwd\r" expect "ftp>" send "passive\r" expect "ftp>" send "binary\r" expect "ftp>" send "cd /export/test\r" expect "ftp>" send "put $fname\r" expect "ftp>" send "bye\r" expect eof

その他の回答 (2)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

shell変数の値を参照する場合は、変数名の前に$をつける必要があります。 put $filename ――のように記述してみては。

syakuyaku
質問者

補足

回答ありがとうございます 早速、試してみます。

  • mendokusa
  • ベストアンサー率13% (359/2726)
回答No.1

ヒアドキュメントじゃなくて 一回ファイルに書き出したらダメ?

syakuyaku
質問者

補足

すいません、私自身unixに未熟なので mendokusaさんのアドバイスがどのようなものか 具体的にもう少し教えていただけますか?

関連するQ&A

  • ftpでファイルアップロードさせるシェルスクリプト

    Linuxで、あるftpサーバーにファイルをアップロードするシェルスクリプトを作る方法を教えてください。 例えば、このようなftpサーバーに対して、以下のスクリプトを作りました。 ■ftpサーバー ftpサーバー:ftp.hogehoge.jp User-ID: user1 Password: password1 アップロードしたいファイル:test.html アップロードしたい場所:/public_html ■シェルスクリプト #!/bin/sh ftp ftp://user1:password1@ftp.hogehoge.jp -u /public_html test.html ■結果 エラーも何も表示せず。 シェルスクリプトを、このようにすると、ftpサーバーにログインはできています。 #!/bin/sh ftp ftp://user1:password1@ftp.hogehoge.jp ここで、以下のように手でファイルをアップロードすることはできています。 ftp> cd public_html 250 CWD command successful. ftp> put test.html local: test.html remote: test.html 227 Entering Passive Mode (210,132,253,13,218,1) 150 Opening BINARY mode data connection for test.html 100% |*************************************| 62 270.29 KB/s 00:00 ETA 226 Transfer complete. 62 bytes sent in 00:00 (1.78 KB/s) ■環境 クライアント側 SuSE Linux 9.3 man ftpを見て、-uを使うのだと思ったのですが、間違ってますでしょうか? よろしくお願いします。

  • 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に入っても有効にはできないのでしょうか?

  • cronでftp自動転送を行いたい

    ftpで自動ログイン+ファイル転送するシェルを作成して、これをcronで 実行したのですが、ftpが実行されません。()シェル単体で実行すると、転送されます) 何が原因でしょうか?宜しくお願いいたします。 【環境】 FedoraCore5 【シェル(ftp.csh)の内容】 ftp -n xxx.xxx.xxx.xxx << _EOD user xxx xxx ascii put xxxxxxxx quit _EOD 【cron設定】 05 6 * * * root /share/ftp.csh

  • ftp自動スクリプト

    FTP自動スクリプトに関する質問です。 取得したいファイルのディレクトリが異なっているので、下記のようにシェルスクリプトを作成し、 実行しています。 実行すると、file1は取得できるのですが、file2が取得できません。(シェルが返ってこない。処理が止まる) 手動で行うと、file1,file2両方取得できる場合もあれば、file1のみしか取得できない場合もあります。 (取得できない場合:227 Entering Passive Mode (サーバ名,197,154))が表示されたまま。) そもそも理解(FTPの使い方が間違っている?)が足りない気もしますが、教えていただけると幸いです。 宜しくお願いいたします。 ・ftp_start.txt ----------------------------------------------- open サーバ名 user test **** cd directory1 bin get file1 cd directory2 bin get file2 bye ----------------------------------------------- ・ftp_cmd.sh ----------------------- #!/bin/sh ftp -n < ftp_start.txt ------------------------

  • FTP転送をしたいのですが

    あるクライアントでコマンドプロンプトから以下を行っても 処理ができません。(エラーなども出力されません) 20秒ほどたつと、勝手にコマンドプロンプトが終了して しまいます。何が悪いのか、お分かりになる方がいらっしゃいましたら 教えてください。 (ftp.exe は、c:\window\system32 に存在しています。) 宜しくお願いします。 C:\>ftp -n -s:c:\test_ftp.txt xxx.xxx.xxx.xxx (←IPアドレスです) test_ftp.txtファイルは以下のようになっています。 user anonymous binary put c:\test.xls /aaa/test.xls quit

  • FTPにより自動でファイルをサーバ間移動させたい

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

  • 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  

  • vsftpd FTP転送を行うシェルスクリプトについて

    お世話になっております。 標記の件で少しこまっております。 旧Linuxサーバで使用していたFTP転送用シェルスクリプトが 新Linuxサーバで動かなくなりました。 シェルスクリプトは以下の通りです。 exampleftp.sh # ftp -n -i < exampleftp.txt exampleftp.txt # open (IPアドレス) # user testuser testpass # binary # cd /home/example/ # lcd /home/example/ # mput *.* # close # bye exampleftp.shを実行すると以下のようになります。 # exampleftp.sh # Please login with USER and PASS. # Please login with USER and PASS. # KERBEROS_V4 rejected as an authentication type # Login incorrect. # Login failed. # ?Invalid command # Please login with USER and PASS. # : No such file or directoryi # ?Invalid command # ?Invalid command どうやら、user testuser testpassをしたところ、 ログインに失敗し、エラーになっているようです。 しかし、このtxt内容をシェルで実行せずに、 コマンドを普通に入力していくとログインにも成功し、 エラーにはならず、転送もできました。 なぜか、シェルスクリプトを実行した場合のみ、 ログインに失敗するようです。 いろいろ調べてみましたが、よく解りません。 どなたかご教示お願いできないでしょうか。 よろしくお願いします。

  • WindowsのバッチファイルでFTP転送

    PC-A(Windows)内の特定のデータを、PC-B(Linux)内の特定のフォルダにコピーするのに FTPのバッチファイルを使いたいと思います。 元データの場所 PC-A\%systemroot%\system32\dhcp\test.log  ↓                        このデータを転送したい。 転送先(PC-B) /1G/1T/(ここにコピーしたい) 下のような構成を考えたのですが、うまくいかないので誤っている点をご指定いただけますでしょうか? バッチファイル内 ftp -s:copy_to_server.txt テキストファイル(copy_to_server.txt )内 open サーバー名 ユーザー名 パスワード put %systemroot%\system32\dhcp\test.log >> PC-B\1G\1T bye

  • FTPにより自動でファイルをサーバ間移動させたい

    サーバA(レンタルサーバ)のバックアップファイル(毎日生成)を サーバB(自作(Fedora-core4))から自動でFTP接続させて、サーバAの バックアップファイルをサーバBにコピーして、サーバAのバックアップファイル を消去しようとしています。 自動で抽出してくるシェルスクリプトをある方に教えてもらって下記(sample)のように 記載して、サーバBのルートに置いています ********** sample (ftp_all.sh) ************************** #!/bin/csh -f #"@(#)ftp_all.sh 1995/07/01 Copyright(C)1995 ASH" # ftp -n サーバAのIPアドレス << _EOD user username password passive binary cd /home/****/backup mget bak*.* mdelete bak*.* bye _EOD **************************************************** 実行結果は次のようになります *************** 結果 *********************** [root@linux ~]# sh ftp_all.sh AUTH not understood AUTH not understood KERBEROS_V4 rejected as an authentication type Passive mode off. mget bak-mysql-20121207.sql.gz? mget bak-root-20121207.tar.bz2? mget bak-mysql-20121206.sql.gz? mget bak-root-20121206.tar.bz2? mget bak-mysql-20121205.sql.gz? mget bak-root-20121205.tar.bz2? mget bak-mysql-20111226.sql.gz? mget bak-mysql-20111111.sql.gz? [root@linux ~]# sh ftp_all.sh AUTH not understood AUTH not understood KERBEROS_V4 rejected as an authentication type Passive mode off. mget bak-mysql-20121207.sql.gz? mget bak-root-20121207.tar.bz2? mget bak-mysql-20121206.sql.gz? mget bak-root-20121206.tar.bz2? mget bak-mysql-20121205.sql.gz? mget bak-root-20121205.tar.bz2? [root@linux ~]# ********************************************************************** ファイル名の頭に「bak」とつくファイルを全てコピーしコピーの後、消去しようとしています サーバAには「bak」とつくファイルは、bak-mysql****が5、6、7と3個、bak-root****が5、6、7と3個の全部で6個あるのですが 実際に [root@linux ~]# sh ftp_all.sh と打鍵すると、サーバBにコピーされるのは、bak-mysql****の20121207、bak-root****の20121207の2個のみで他のものは コピーされません また、実行結果をみてもらってもわかるように「mdelete bak*.*」のコマンドが実行されていません ・何故、最新のファイル(20121207)の2個のみになっているのか? ・削除されてないのはなぜか ・bak頭につくファイルのコピーそして削除ができるようにするにはどのようにしたらいいか  教えていただけないでしょうか  よろしくお願いします。

専門家に質問してみよう