• 締切済み

ダウンロードするシェルスクリプトについて

LINUXサーバAとBの2つあります Linux-Aでは/aaa/bbbの中に(bak-A-20120218tar.bz)と(bak-B-20120218.gz)と毎日バックアップファイルを作成しています Linux-Aの容量が多くなっては困るのでLinux-Bのサーバから (1)毎日、定時にLinux-Aにアクセスし、 (2)Linux-Aの(bak-A-20120218tar.bz)と(bak-B-20120218.gz)をLinux-Bにダウンロードしたあと (3)Linux-Aの(bak-A-20120218tar.bz)と(bak-B-20120218.gz)を消去する このプロセスをシェルスクリプトに記載してCron登録したいと思っています そこでそのスクリプトを次のように考えました ************シェルスクリプト********************************* open xxx.yyy.ne.jp ・・・Linux-Aのサーバへ接続 user mmmmm nnnnnnn ・・・Linux-Aのサーバへ接続 cd /aaa/bbb/ ・・・Linux-Aの該当フォルダに切り替え binary mget bak-*.* ・・・bak以下のワイルドカードを利用して抽出(?) mdelete bak-*.* ・・・bak以下のワイルドカードを利用して削除(?) bye *************************************************************** 上記の5-6行目のように、ワイルドカードを指定して、ダウンロードとかファイル の消去をしようとしたのですがうまくいきません ワイルドカードを利用したのはbak-以下が毎日変わるのでそれを指定(プログラム)するのが難しかったのでこれを考えました まず、mgetとかmdeleteは利用できないのでしょうか このワイルドカードが利用できるダウンロードなり消去できるコマンド等あれば 教えていたただけないでしょうか または、別のいい方法があれば教えていただければ幸いです

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

> : unknown hostkura.ne.jp 「hostkura.ne.jp」がわからない、と言っているのですから、「失敗」以前の問題として「hostkura,ne.jp」が見つけられてません。 DNS の設定の問題とかで名前→IPアドレスに変換できないとか、そもそも「open xxx.yyy.ne.jp」のホストの指定が間違っているとか、いくつか原因が考えられます。 nslookupとかpingとかでネットワーク状態を調べる trans.shを実行するのでなく、全部手入力する とかで、原因がどこにあるか、一つ一つ潰していきましょう。 「自動実行」する前に、まず「手動実行」で問題が無いことを確認することです。

city21_kum
質問者

お礼

kmee様  気にかけていただいていたようで申し訳ありません  > : unknown hostkura.ne.jp これが出たということで(実は(sakura)サーバにアクセスさせようとしていたのですが・・・)  これはDNSでないかと思いちょっとためらっていました Linux-Bは数年前に自分でたてたサーバです  その時からこのサーバのDNSをうまく動作させられなかったので  そのままになっていました  Linux-Bから起動しているので確かに、そちらのDNSがきちんと働いていないと  いけないですね・・・  理解できました  DNSをきちんと働くようにしていくか、Linux-Aから起動させるように  するかどちらかにします  ありがとうございました。 1週間程度、外にでるので即応できないのですが  この質問サイトが閉じられてなければ結果が出たら報告  させていただきます  本当にありがとうございました。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

・そのまま実行したときには成功ていますか? まずは、それを確認してください。 ・openの後でuserとしていますが、ftpの動作はそれであってますか?openしたらすぐにuser/password聞いてくるようになってませんか? ・cronを使うときの注意点は「実行時には環境変数が最小限しか定義されていない」ということ。 PATHも未定義になっているので、ftp等のコマンドを探せません。 フルパスで指定するとか、(今回の場合なら)このスクリプトの中でPATHを設定するとかします。 ・メールは来てないですか?cron中の表示はメールとして届くはずです。 そうでない場合でも、リダイレクトするとかで実行の様子をファイルに残せばどこでどんなエラーになってるかわかるのでは?

city21_kum
質問者

お礼

早速返答をいただき本当にありがとうございます スクリプトを利用るのが初めてなので・・・ いろんなサイトをみながらやっているのですが・・・ さて、最初の質問ですが >そのまま実行したときには成功ていますか? >まずは、それを確認してください。 実行する方法としてSSHでBサーバに入り そこから #sh trans.shとしてみました ところが : unknown hostkura.ne.jp Not connected. として、接続できていないようになります つまり接続で失敗しているのかなぁ・・と思うのですが・・・ この件で何かお気づきの点があれば教えていただければ幸いです rootのメールについては見方が理解できていないので後でみてみます すみません

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

これシェルスクリプトじゃなくってftpのコマンドでしょ。 これをシェルスクリプトとして実行しようとしたんでは、動くわけないですよ。 このままやろうとすれば、ftpの入力にリダイレクトされるようにしないとです。 あと、B側からftpでmgetしてmdeleteするよりは、A側から送信→削除した方が制御が楽だと思います。 ファイル転送だけなら、rcp,scp,rsync,rdiff-backup等ftp以外の方法も使えますし。 ファイルの選択にファイル名展開やfind等のコマンドも使えますし。

city21_kum
質問者

お礼

早速回答いただきありがとうございました。 初心者ですみません。 上記の質問に記載したものをftp.txtとしてBサーバの/root配下に置き 同じ/rootにtrans.shとして、 下記のスクリプトをおいています ******trans.sh********* cd /rrr/sss/ ・・・・Aサーバのファイルの格納場所 ftp -n <ftp.txt ・・・・リダイレクト ************************ これがうまく働きません これでは無理でしょうか わかれば教えていただければ幸いです

関連するQ&A

  • 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頭につくファイルのコピーそして削除ができるようにするにはどのようにしたらいいか  教えていただけないでしょうか  よろしくお願いします。

  • 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の意味も勉強したいのですが  どこかこのあたり解説しているものがあれば教えていただければ  幸いです  よろしくお願いします。

  • シェルスクリプトの記載方法

    linuxでシェルスクリプトを書いています サーバ上に「日付のついた*.bak」ファイルが毎日できています これを3日以上経過した*.bakファイルを消去したいので直接 コマンドラインから次のようにキーボードでたたくと正常に消去できます find /root -name '*.bak' -mtime '+3' -exec rm -f {} \; これをシェルスクリプト(sakujyo.bash)として次のように記載し /rootの中におきました ================(sakujyo.bash)===================== #!/bin/bash find /root -name '*.bak' -mtime '+3' -exec rm -f {} \; =================================================== そして # sakujyo.bash と打鍵すると 次のようにエラーとなります -bash: sakujyo.bash: command not found findのpathが通ってないのかとも考えられるのですが・・・ findコマンドは /usr/bin/ の中にあるので次のように記載してみました =================================================== #!/bin/bash cd /usr/bin find /root -name '*.bak' -mtime '+3' -exec rm -f {} \; ==================================================== このようにしても同じエラーとなります 記載方法等教えていただけませんか よろしくお願いします。

  • シェルスクリプト間で排他をとりたい

    環境 linux(redhat) 使用シェル bash シェルスクリプトAとシェルスクリプトBを作成し、 シェルスクリプトAが動作している間は、シェルスクリプトBの動作を禁止したいと考えています。 例えば、シェルスクリプトAが起動している状態で、シェルスクリプトBが起動されたとき、シェルスクリプトBは、シェルスクリプトAが起動していることを検知して、自発的に処理を終了するようにしたいと考えています。 上記のような仕組みをシェルスクリプトで実現可能でしょうか? 基本的には、シェルスクリプトの先頭で、ある資源のロックを行い、終了時にロックの解放ができれば、その仕組みは実現可能と考えています。 (シェルの異常終了時は、ロックが自動的に解放されることが望ましい) 上記のようなことをシェル(bash)で実現可能でしょうか。 bash単独での方法、もしくはbashからperl,C言語作成の実行モジュールを呼び出す方法でもかまいません。 (ちなみにperl(もしくはC言語作成のモジュール)単独では実現可能なことはわかっています)

  • シェルスクリプト

    シェルスクリプトに関しては、まったくの初心者です。 OSは、SolarisとLinuxですが、シェルスクリプトを利用して下記のような自動実行プログラムを作りたいのですが、どなたかご教授下さい。 一台のWWWサーバのログ(例:access.log)を、1日に一回(出来ましたら朝の5時)に別サーバに送信するプログラムなのですがいかがでしょうか?このとき、出来れば送信先のファイル名は、送信した日付(例:20020222.log)にしたいです。説明不足かも知れませんが、ひとまずこれでお願いします。

  • シェルスクリプト内で他のサーバへSSH接続

    急にシェルスクリプトを組む事になり、勉強を始めて2週間です。 下記について、調べても分からなかった為、教えてください。 どのようなコマンドを使用すればよいのかや、参考になるサイトがありましたら教えてください。 【概要】 シェルスクリプト内で、SSH接続で他サーバへ接続し他サーバ内で別のシェルスクリプトを実行する。その際にroot権限が必要となる。 【環境】 作業PC:Windows サーバA:Linux サーバB:Linux 【スクリプト】 スクリプト1  格納場所:サーバA  処理  :スクリプト1、2を実行 スクリプト2  格納場所:サーバA  処理  :サーバA内でディレクトリ作成等の作業をしてOK/NGを返却 スクリプト3  格納場所:サーバB  処理  :サーバB内でディレクトリ作成等の作業をしてOK/NGを返却 【やりたい事】 1.作業PCからサーバAへSSH接続 2.サーバAでroot権限へスイッチし、スクリプト1を実行 3.スクリプト1は、スクリプト2を実行 4.スクリプト2はディレクトリ作成等の処理を行い、OK/NGを表示 5.スクリプト1は、サーバBへSSH接続 6.スクリプト1は、サーバBでルート権限へスイッチし、スクリプト3を実行 7.スクリプト3はディレクトリ作成等の処理を行い、OK/NGを表示 8.スクリプト1はサーバBからログアウト

  • .tar.gzダウンロードの挙動

    HTMLに<a>タグで.tar.gzファイルへのリンクを掲載しています。 このファイルのダウンロード時、挙動が異なります。 1)リンククリックでダウンロードすると、.tar(アーカイブ)のファイルサイズになる  (Chrome、Edgeの場合。Firefoxでは、.gz(圧縮)のファイルサイズになる) 2)右クリックでコンテキストメニューの「名前を付けてリンク先を保存」でダウンロードすると、Chrome、Edge、Firefoxいずれも.gzのファイルサイズになる。 このHTMLは、同じものを別々のサーバに置いています。 サーバAはApache2.4.53、サーバBはApache2.4.54です。 1)、2)の事象は、サーバAで起きるのですが、サーバBでは、いずれも.gzのファイルサイズでダウンロードできます。 ちなみにレンタルサーバなので、httpdconfの編集は出来ないので、httaccessに以下を追記しています。(サーバA、B共に同じもの) AddEncoding x-gzip .tar.gz .gz .tgz AddEncoding x-identity .tar.gz .gz .tgz AddType application/x-gzip .tar.gz .gz .tgz 1)、2)は、Apacheのバージョンによるものなのでしょうか? サーバAでも、リンククリックで.tar.gzの状態でダウンロードできるようにしたいので、質問させていただきます。

  • シェルスクリプトについて

    シェルスクリプトについて Linuxで先頭にスペースが入っている行をひとつ上の行につなげたいと考えています。 その場合、シェルスクリプトはどのように書けばよいかご教示願います。 【ファイル内容】 aaa △bbb ccc ddd (b行の先頭のみスペース(△)が入っています。) 【変換後のファイル】 aaa bbb ccc ddd

  • シェルスクリプトの自動化で動作が変なのですが・・・

    いつも大変お世話になります。 シェルスクリプトでtarコマンドを書き、このファイルをcrontabで自動化しております。 設定した時間になるとcrontabが実行され、ファイルが生成されるのですが、ファイル容量が少なく、tarコマンドがきちんと実行されていない様なのです。 あるディレクトリをまるごと圧縮しているのですが、容量は1GB程あり、これを tar czvf /directory_name1/file_name1.tar.gz /directory_name2/ というコマンドで圧縮しております。 直接このコマンドを実行するとちゃんと圧縮され、約940MBの容量になります。しかし、crontabでシェルスクリプトを実行すると45バイトのファイルが生成されて終ってしまいます。 なぜなのか、さっぱり原因が分かりません。 どなたかご教授の程、何卒、宜しくお願い致します。

  • 複数ファイルのダウンロードを自動化したい

    windows端末のDOSプロンプトからFTPコマンドで複数ファイルを ダウンロードしようとしています FTP>mget bak*.*  ↑ 上記のようにして、 サーバ側にあるbakのつくファイルをmgetコマンドを利用してダウンロード させたいのですが 複数あるファイルのひとつひとつのファイルに対してダウンロードするか 否かを聞いてきます 最終的にはバッチファイルにして、自動ダウンロードにしたいので 人手を介しないようにするために何かいい方法はないでしょうか? お知恵を拝借したいと思います よろしくお願いします。