シェルスクリプトを使ったSCPのエラー

このQ&Aのポイント
  • シェルスクリプトを使い、サーバAからサーバBへファイルを定期的にコピーしようとしていますが、エラーが発生しています。
  • エラーメッセージは「/home/user/data_new/*: No such file or directory」と表示されており、ファイルやディレクトリの存在確認をしても問題はありません。
  • スクリプトのSCPコマンド部分をコピペして実行しても普通に動作するため、原因は不明です。Ubuntu 12.04を使用しているサーバAとBの環境に問題がある可能性があります。
回答を見る
  • ベストアンサー

シェルスクリプトを使ったSCPのエラー

お世話になります。 シェルスクリプトを使い、サーバAからサーバBへファイルを定期的にコピーしようと、以下のシェルスクリプトを作りました。 test.sh ================= #!bin/sh HOST1=hostB.com (さくらVPSサーバ) USER1=hugahuga PASS1=hogehoge TARGET_DIR1=/home/user/data/  #サーバB(転送先)のディレクトリ BACKUP_DIR1=/home/user/data_new/*  #サーバA(転送元)のディレクトリ expect -c " set timeout 30 spawn scp ${BACKUP_DIR1} ${USER1}@${HOST1}:${TARGET_DIR1} expect { \" Are you sure you want to continue connecting (yes/no)? \" { send \"yes\r\" expect \"password:\" send \"${PASS1}\r\" } \"password:\" { send \"${PASS1}\r\" } } interact " ================= sh test.sh すると、以下のようなエラーが出ます。。 /home/user/data_new/*: No such file or directory そのまんまだとは思うのですが、ファイルもディレクトリもありますし、上記スクリプトのSCPコマンド部分をコピペして、シェル上で実行すると普通にうまくいきます。 サーバAもBもUbuntu12.04です。 一体何が原因なのでしょうか・・

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

rsyncなどで処理した方がよいのでは?

amnet2012
質問者

お礼

ありがとうございます。rsyncでやることにしました。

その他の回答 (1)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>/home/user/data_new/*: No such file or directory エラーメッセージの通り、*というディレクトリが無いのでしょう。 >上記スクリプトのSCPコマンド部分をコピペして、シェル上で実行すると普通にうまくいきます。 シェルが*を展開しているから……でしょう。 BACKUP_DIR1=`ls /home/user/data_new/*` としてみたらどうでしょうか? # ` は日本語キーボードの設定ならShift+@なのでご注意を。 # Shift+7の方の記号ではありません。

amnet2012
質問者

お礼

ありがとうございます。 私の環境では上手くいきませんでした。。

関連するQ&A

  • シェルスクリプト初心者です、以下のシェルを見てくだ

    お世話になります。 CentOS5にて、ディレクトリ「/home/user」からリモートホスト「192.168.11.200」の「/home/user」へ sshの鍵方式を使い、SCPで画像のコピーを行うシェルスクリプトを書きました。 以下のシェルスクリプトを書いたのですが、3行目の「/usr/bin/scp」が引っかかって 「/home/user/move_img.sh: line 3: `/usr/bin/scp -P 22 -i "/home/user/.ssh/id_rsa" -r ${FILE} user@192.168.11.200:${FILE};'」 とのエラーが出てしまいます。 素人のくせにシェルなんて書くなと言われればそれまでですが、 一体どの記述が悪いのか見当がつきません。 ご教授をお願いいたします。 ------ #!/bin/sh for FILE in `find /home/user -regex ".*\.\(jpg\|png\|gif\|JPG\|GIF\|PNG\)"`; /usr/bin/scp -P 22 -i "/home/user/.ssh/id_rsa" -r ${FILE} user@192.168.11.200:${FILE}; done ------

  • 自動パスワード入力でscpするスクリプトでエラー「Unterminated quoted string」

    Win2kのCygwinで下記のスクリプトを試してみました。 (ローカルのファイルをscpで自動転送) $ uname -a CYGWIN_NT-5.0 upsil 1.5.11(0.116/4/2) 2004-09-04 23:17 i686 unknown unknown Cygwin $ cat ./test.sh #!/bin/sh HOST=192.168.1.105 # scp するマシン名を設定 UNAME=user01 # ログイン名を設定 PASSWD=xxxxxxxx # パスワ-ドを設定 TARGET=/cygdrive/c/cygwin/home/root/hoge /usr/bin/zip -r $TARGET.lzh $TARGET expect -c " # expect コマンドを実行 set timeout 20 spawn scp -P 60001 $TARGET.lzh $UNAME@$HOST:/home/fat32/ # expect コマンドの管理下でscpを実行する expect login:\ ; send \"$UNAME\r\" # login: が出たらログイン名を打ち込む expect sword:\ ; send \"$PASSWD\r\" # password: が出たらパスワ-ドを打ち込む #expect \"$\" ; send \"ls\r\" # $ が出たら ls を打ち込む #expect \"$\" ; send \"exit\r\" # $ が出たら exit を打ち込む $ which expect /usr/bin/expect $ which zip /usr/bin/zip $ ./test.sh と実行すると : 9: Syntax error: Unterminated quoted string となり、終ってしまいました。 「expect -c " # expect コマンドを実行」 が問題みたいなのですが何がまずかったのでしょうか?

  • scpをスクリプト内で実行してそれにpasswordを渡したい

    scpをスクリプト内で実行して,それにpasswordを渡すようなことをshellスクリプト又はPerlスクリプトで出来ますでしょうか? (私の調べたところ)scpはオプションでpasswordを渡すことがどうやら出来ないようなので, プロンプトが入力待ちになったときにそこにpasswordを流すようなことを実現したいのです. 因に, #!/bin/sh scp test.txt host.hogehoge.ne.jp:~ echo "passwd"; ではパスワード入力の所で止まって仕舞います. スクリプトに生にpasswordを記述するのはセキュリティ上マズイとはおもいますが,この問題はとりあえず別問題として下さい. よろしくお願いします.

  • シェルスクリプトのループ内でSSH接続できない

    ファイル内にある行数文、あるサーバに接続し、処理をしたいのですが、 「0-0:ambiguous redirect」とエラーが発生し、正常に動作しません。 リダイレクトが悪いのはわかるのですが、どのようにしたらよいか いろいろやったのですが、うまくいきません。 こちらを参考に対応をしました。 http://okwave.jp/qa/q6974977.html ソースは以下の通りです。 while read F1 F2 F3 F4 F5 do expect -c " set timeout 10 spawn ssh ${id}@${host} expect \"Are you sure you want to continue connecting (yes/no)?\" { send \"yes\n\" expect \"${id}@${host}'s password:\" send \"${pass}\n\" } \"${id}@${host}'s password:\" { send \"${pass}\n\" } expect \"\[${id}@${host} ~\]$\" send \"ls\n\" interact " 0<&9- done 9<&0-0<$OUT_FILE ご教授下さい。

  • 自動scpスクリプトでキーが書き換わった場合にexpectでのif文の書き方は?

    度々スイマセン。 自動パスワード入力でscpコマンドを実行させたく思っています。 Win2kのCygwinで下記のスクリプトを試してみました。 $ cat ./test.sh #!/bin/bash -x HOST=foo.hoge.dyndns.net UNAME=user01 PASSWD=xxxxxxxx TARGET=/cygdrive/c/cygwin/home/root/hoge /usr/bin/zip -r $TARGET.lzh $TARGET expect -c " set timeout 20 spawn scp -P 60001 $TARGET.zip $UNAME@$HOST:$DSTNTN ; expect \"password:\" ; send \"$PASSWD\r\" ; interact " で、成功しましたがキーが変わった時には「yes」と自動で入力させたくて expect -c " set timeout 20 spawn scp -P 60001 $TARGET.zip $UNAME@$HOST:$DSTNTN ; if [ expect \"Are you sure you want to continue connecting (yes/no)?\" ] then ; send \"yes\r\" ;# yesと入力する。 fi; expect \"password:\" ; send \"$PASSWD\r\" ; interact " としてみたのですがキーが書き換わっていない場合(いきなりパスワードが聞かれる場合)、 user01@foo.hoge.dyndns.net's password: syntax error in expression "": premature end of expression while executing "if [ expect "Are you sure you want to continue connecting (yes/no)?" ] then " となってしまいます。一方、書き換わって、受け入れるかの問い合わせされた場合も同様の文法エラーとなってしまいました。 if文を入れる場合にはどう記述したらいいのでしょうか?

  • expectでscpのパスフレーズ入力を自動化

    別サーバーに存在するファイルを、scpでダウンロードしています。 これをcronを使用して自動実行させたいのですが、パスフレーズ入力の自動化で悩んでいます。 expectを使ってみましたが、以下のようにエラーもなく、反応でした。 expectの書き方が悪いのだと思いますが、ご教授いただけましたら助かります。 ○やりたいこと サーバーA(linux)から、サーバーB(linux, 192.168.1.100)のファイルをデイリーで自動ダウンロードしたい。 以下のtest.shを作って実行してみましたが、エラーも無く無反応です。 expectは導入されています。 ○環境 ・サーバーAからサーバーBへは、SSHでアクセスできる。 ・秘密鍵を/home/testuser/.ssh/に置いている。  ・サーバーBへは、パスフレーズを入力するだけでsshでログインできる。 ・パスワードでの認証はdisable ■手入力では、このようにファイルをダウンロードできています。 $ scp 192.168.1.100:/home/testuser/test.txt ./ Enter passphrase for key '/home/testuser/.ssh/id_dsa': ★ここでパスフレーズを手入力★ test.txt 100% 5 0.0KB/s 00:00 ■test.sh ----------- #!/bin/sh FILE=192.168.1.100:/home/testuser/test.txt TARGET=/home/testuser/ PASSWORD=hogehoge expect -c " set timeout 20 spawn scp $FILE $TARGET #expect \"Enter passphrase for key '/home/testuser/.ssh/id_dsa':\" ; #send \"$PASSWORD\r\"; " ■実行結果(エラー表示無し。ファイルはダウンロードされない) $ sh test.sh spawn scp 192.168.1.100:/home/testuser/test.txt /home/testuser/ $ 以上、よろしくお願いします。

  • expectで複数台にログインしscpする。

    シェルの超初心者です。よろしくお願いします。 下記のようなシェルを作りたいのですがうまくいきません。 3台のパソコンA, B, Cがあるとします。 まず、AからBにssh接続し、シスログをAにscpします。 その後、AからCにssh接続し、シスログをAにscpします。 下記が、作成したものです。 どうぞ、アドバイスよろしくお願いいたします。 #!/usr/bin/expect set timeout 5 spawn ssh B@xxx.xxx.xxx.xxx expect "Enter passphrase for key" send "Password\n" spawn scp /var/log/messages A@xxx.xxx.xxx.xxx:/tmp/log01.log expect "password" send "Password\n" send "exit\n" spawn ssh C@xxx.xxx.xxx.xxx expect "Enter passphrase for key" send "Password\n" spawn scp /var/log/messages A@xxx.xxx.xxx.xxx:/tmp/log02.log expect "password" send "Password\n" send "exit\n" interact

  • cronを介してのscpの挙動おかしい

    CentOS5系(64bit) expect5.45 Tcl8.6.0 Tk8.6.0 下記のデータダウンロードのスクリプトをcronに設定して自動実行していますが、 エラーも吐き出されずデータがダウンロードされません。 しかしながら、./download.shとコマンドを打鍵するとデータがダウンロードされます。 PCが壊れる前には、正常に動作していたスクリプトファイルなのです。 新しいPCに環境を再構築しまして、挙動がおかしいのですが、 インストール等がうまくいってないって事でしょうか。 お詳しい方、ご教授願えれば幸いです。 ー略- alive_time=3600 logFile=/home/admin/scp.log echo `date` >> $logFile expect -c " log_file $logFile set timeout $alive_time spawn scp $host $local sleep 1 expect { \"Are you sure you want to continue connecting (yes/no)?\" { send \"yes\r\" expect \"password:\" send \"${passwd}\r\" } \"password:\" { send \"${passwd}\r\" } } expect { \"denied\" { exit 2 } \ eof { sleep 1 exit 1 } } " ret=$? if [ $ret -eq 0 ] then echo "abort" >> $logFile else if [ $ret -eq 1 ] then echo "done" >> $logFile else if [ $ret -eq 2 ] then echo "fail" >> $logFile fi fi fi exit $ret

  • シェルスクリプトで標準エラーが出たらスクリプトを停止させる方法は?

    centOS 5で] 以下のようなシェルスクリプトを実行させています。 #!/bin/bash mount -t cifs -o username=root,password=abcd //192.168.0.5/backup /mnt/win rsync -vr /home/data /mnt/win >> backup.log 上のシェルスクリプトでもしmountが失敗したらスクリプトを停止させる方法を 探しています、どなたかご教授願います。

  • Bashシェルスクリプトの書き方

    Bashシェルスクリプトの書き方 ↓のx.shはどこが間違っているのでしょうか? $ cat x.sh #!/bin/bash function x() { local dir if $1; then dir=$1 else dir="." fi `find $dir -type d` } ↓こうなります $ source x.sh $ x dir dir: command not found bash: .: ./dir: はディレクトリです