• ベストアンサー
  • 困ってます

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

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

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

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

  • ベストアンサー
  • 回答No.1

コマンドラインで動いて、cronで動かないということは ・コマンドライン時とcron時で 実行しているユーザーが違う(pathや権限が異なる) ・コマンドライン時とcron時で、カレントディレクトリが異なり、相対パス指定に相違がでる ということも疑ってみてはどうでしょう。

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

質問者からのお礼

superside0 様 ご回答ありがとうございます。 相対パスを見直した処、ビンゴでした。 expect以下、rpm等ではなくソースよりコンパイルしてインストールしましたので、expectの所在が違っていました。 /usr/local/bin/expect -c に変更して解決いたしました。 ありがとうございます。

関連するQ&A

  • 自動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する。

    シェルの超初心者です。よろしくお願いします。 下記のようなシェルを作りたいのですがうまくいきません。 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

  • 自動パスワード入力で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を記述するのはセキュリティ上マズイとはおもいますが,この問題はとりあえず別問題として下さい. よろしくお願いします.

  • expectの構文について

    次のスクリプトを実行しました。 #!/bin/bash user="sarigennu" password="sarigennupassword" passwd="passwd" useradd $user; expect -c " spawn $passwd $user expect Enter\ send $password send \r expect Retype\ send $password send \r expect eof exit 0 " その結果として下のように標準出力されました。 どうしたら成功するでしょうか(一般ユーザのパスワードを変更できるようになるでしょうか?) spawn passwd sarigennu Changing password for user sarigennu. New password: BAD PASSWORD: it's WAY too short Retype new password: No password supplied No password supplied No password supplied passwd: Authentication token manipulation error

  • シェルの -eq の動作について

    シェルの -eq の動作について質問があります。 次のプログラムの動作を例に挙げます。 【ファイル名:A.sh】 #!/bin/sh readonly A=666 B=A echo $B if [ $B -eq 666 ]; then echo XXXXXXX exit 0 fi 「実行方法」 sh B.sh 「実行結果」 A XXXXXXX 【ファイル名:B.sh】 #!/bin/sh readonly A=666 B=A echo $B if [ $B -eq 667 ]; then echo XXXXXXX exit 0 fi 「実行方法」 sh B.sh 「実行結果」 A -Question- A.shを実行すると、処理がif文に入ってしまう理由を教えてください。 変数Bが二重参照しているような気がするのですが、 そのような機能が sh にあるのでしょうか?

  • expectでコマンド実行結果を変数に代入出来ない

    test.sh #!/bin/sh expect -c " set timeout -1 spawn telnet $1 expect "login:" ; send \"username\r\" expect "sword:" ; send \"password\r\" expect ${1} ; send \"start shell\r\" expect ${1} ; send \"set val=`date +%Y'-'%m%d`\r\" expect ${1} ; send \"echo $val\r\" expect ${1} ; send \"exit\r\" expect ${1} ; send \"exit\r\" exit " 例えばリモートホスト側で コマンド date +%Y'-'%m%d の実行結果を valに代入したいのですが 代入結果をechoコマンドで表示させても上記コマンド実行結果が 変数に代入されていないのか何も表示されません リモートホストに変数valを表示させるのがうまくいっていないんじゃないかと 思うのですが特殊文字($val)を正しく変数として解釈させる方法をご教示いただけませんでしょうか?

  • UNIX teeコマンドについて

    あるテストプログラムの実行結果をteeコマンドで、ログに追加出力しようとしています 以下の1.変更前の様にシェルスクリプトを作成しました。 このシェルスクリプトを実行するとteeコマンドが正常終了するので $? が常に0になってしまい、必ずOKになってしまいます 急いでいたので2.のように修正したのですが、テンプファイルを使わないでもうちょっとシンプルに作成する方法をご存知の方教えてください 1.変更前 ./testpgm | tee -a logfile.txt  if [ $? -eq 0 ] ; then  echo "OK,testpgm," | tee -a logfile.txt else echo "NG,testpgm," | tee -a logfile.txt fi 2.変更後 ./testpgm > tempfile.txt if [ $? -eq 0 ] ; then cat tempfile.txt>>logfile.txt cat tempfile.txt echo "OK,testpgm," | tee -a logfile.txt else cat tempfile.txt>>logfile.txt cat tempfile.txt echo "NG,testpgm," | tee -a logfile.txt fi rm tempfile.txt OSはAIXで、シェルはshのみ使用可です

  • シェルの -eq の動作について

    シェルの -eq の動作について質問があります。 次のプログラムの動作を例に挙げます。 【ファイル名:A.sh】 #!/bin/sh readonly A=666 B=A echo $B if [ $B -eq 666 ]; then echo XXXXXXX exit 0 fi 「実行方法」 sh B.sh 「実行結果」 A 【ファイル名:B.sh】 #!/bin/sh readonly A=666 B=A echo $B if [ $B -eq 667 ]; then echo XXXXXXX exit 0 fi 「実行方法」 sh B.sh 「実行結果」 A -Question- A.shがif文に入ってしまう理由を教えてください。 変数Bが二重参照しているような気がするのですが、 そのような機能がshにあるのでしょうか? あと、もう一つ質問があります。 このシェルを古いバージョンで実行すると、  A.sh: line 8: [: A: integer expression exprected というエラーが出てしまいます。 これについても、わかる人がいましたら教えてください。

  • シェルスクリプトを使った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です。 一体何が原因なのでしょうか・・