perlのsystem関数でrsyncが動かない

このQ&Aのポイント
  • perlのsystem関数を使って、外部サーバーのフォルダ(999)をバックアップしたいと思っています。
  • 公開鍵を設定して、コマンド入力では動きます。$ rsync -av user1@xxx.xxx.xxx.xxx:/home/user1/public_html/hp/999 /home/user2/public_html/hp/
  • しかし、perlのsystem関数に入れると動かない問題があります。$retcodeは-1になり、apacheのエラーログには何も出ていません。原因は何でしょうか?
回答を見る
  • ベストアンサー

perlのsystem関数でrsyncが動かない

perlのsystem関数を使って、外部サーバーのフォルダ(999)をバックアップしたいと思っています。 公開鍵を設定して、コマンド入力では動きます。 $ rsync -av user1@xxx.xxx.xxx.xxx:/home/user1/public_html/hp/999 /home/user2/public_html/hp/ これをperlのsystem関数に入れると動きません。 $retcodeは-1になります。 apacheのエラーログには何も出ていません。 何が原因で動かないのでしょうか? よろしくお願いします。 #!/usr/bin/perl $retcode=system ("rsync -av user1@xxx.xxx.xxx.xxx:/home/user1/public_html/hp/999 /home/user2/public_html/hp/"); print "Content-type: text/html\n\n"; print"code: $retcode"; exit;

  • Perl
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5071/13248)
回答No.2

> ブラウザ経由だとユーザーとしてログインしていないですが、それでrsyncを動かすことはできるものでしょうか? rsync自体は問題なく実行できますが、ブラウザ経由で実行した場合のコマンド実行ユーザーはapacheの実行ユーザーになるので、wwwとかデーモン実行用のユーザーで実行されます。 > 外部サーバーのCGIで書き込みがあったときに、別のサーバーに同じデータを差分コピーしたいという目的でしたが、apacheやrsyncの実行ユーザーのことを考えると難しそうですね。 リアルタイム性に拘らなければ、cronを使って5分に1回rsyncを実行すると言った方法もあります。

yo3708
質問者

お礼

サーバーの負荷とリアルタイム性を考えて、cronを使わずにコピーできればと思いましたが、cronを使って同期させることにします。 どうもありがとうございました。

その他の回答 (1)

  • t_ohta
  • ベストアンサー率38% (5071/13248)
回答No.1

apacheの話が出てくると言う事は、CGIとしてブラウザ経由で実行を行っているのでしょうか。 その場合、apacheの実行ユーザーとrsyncのユーザー、鍵の所有ユーザー等々のパーミッションが絡んできますが、その辺りの整合性は取れていますでしょうか。

yo3708
質問者

お礼

ありがとうございます。 外部サーバーのCGIで書き込みがあったときに、別のサーバーに同じデータを差分コピーしたいという目的でしたが、 apacheやrsyncの実行ユーザーのことを考えると難しそうですね。 フォルダのオーナーをwwwにして、パーミッションを777にしてみたりしましたがうまくいかないようです。 ブラウザ経由だとユーザーとしてログインしていないですが、それでrsyncを動かすことはできるものでしょうか?

関連するQ&A

  • IE上からrsyncスクリプトを実行したい。

    目的:IEからrsyncスクリプトを実行してWEBサーバAとWEBサーバBの    同期を取り、データを同じにしたいです。    IEのURL欄部分へスクリプトまでのフルパスを入力、実行すると    同期が取れるようにしたいのです。        *現状はIE上では無く、サーバ上からrsyncスクリプトを実行     すると同期が取れます。     コマンド:./test/script/testrsync.pl     IE上からフルパスでtestrsync.plを実行すると     Internal Server Errorとなってしまい、下記のエラーログ     が出てしまいます。 apacheのエラーログ ----------------------------------------------------------- Host key verification failed. rsync: connection unexpectedly closed (0 bytes received so far) [sender] rsync error: error in rsync protocol data stream (code 12) at io.c(463) [sender=2.6.8] Host key verification failed. rsync: connection unexpectedly closed (0 bytes received so far) [sender] rsync error: unexplained error (code 255) at io.c(463) [sender=2.6.8] [Mon Jun 1 00:00:00 2009] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: /test/script/testrsync.pl ------------------------------------------------------------ rsyncスクリプト ------------------------------------------------------------ #!/usr/local/bin/perl $RSYNC_SCRIPT = "/usr/local/bin/rsync --rsync-path=/usr/local/bin/rsync"; $RSYNC_OPTION = "-azpq -e ssh --delete"; $RSYNC_SVUSER = "user\@serverb:"; $TEST_DIR = "/test/hogehoge"; $REAL_DIR = "/test/hogehoge"; $DEBUG = "debuglog.txt"; open(DEBUG,">$DEBUG"); @SYNCDIR = ( "root/", ); foreach $SYNC (@SYNCDIR){ $CMD = "$RSYNC_SCRIPT $RSYNC_OPTION $TEST_DIR/$SYNC $RSYNC_SVUSER$REAL_DIR/$SYNC"; system($CMD); } close(DEBUG); ------------------------------------------------------------ 現在はcronで定期的に自動更新がかかるようにしておりますが、 同期を取りたい時にIE上からフルパスでスクリプトを実行し サーバAからサーバBへ同期を取りたいです。 色々と調べているのですが、糸口が掴めない状態です。 どなたかお分かりになられればご教示頂きたいです。 よろしくお願い致します。

  • perlからsystemコマンド呼ばれる時のシェルについて

    HP-UX/perl4 で作成したスクリプトを、Linux(Red Hat)/perl5 へ移植するに当たって、system関数の動作が異なり困っています。 HP-UX では ksh をシェルとして使用していたため、perl からのsysytem関数で実行するsystemコマンドも、kshで動作するものを使っていました。Linuxでもログインシェルをkshに設定しました。 ところが、HP-UXで使っていたprintコマンドが使用できず、以下のエラーメッセージが出ます。 sh: print: command not found シェルはkshを指定していても、perlからsystem関数やバッククウォート`` でシステムコマンドを実行するときは、shが使われるようなのです。 perl内の記述は以下のとおりです。 system("print 'a'"); "print"の前に"ksh "をつけたり、"print"を"echo"に変えると、正しく動作します。 移植するperlの本数が多いのと、print以外にもこの問題が起きるかもしれませんので、できれば perl 内からのシステムコマンド実行時にもログインシェルとおなじ ksh で動くようにしたいのですが、どのようにすればよいのでしょうか? よろしくお願いいたします。

  • PHP の system コマンド

    ブラウザからtest.php を実行してperl スクリプトを実行したいのですが、 うまく動きません。アクセス権の問題なのでしょうか。 よろしくお願いします。 ---------------- test.php ---------------------- <? system("/usr/bin/perl /home/usr/public_html/test.pl > /dev/null &"); echo "OK."; ?> ---------------- End File ---------------------- ---------------- test.pl ----------------------- #!/usr/local/bin/perl $sendmail = '/usr/sbin/sendmail'; open(SENDMAIL,"| $sendmail -t -i"); print SENDMAIL <<'END'; From: hoge@hoge.com To: moga@moga.com Subject: test Hello This is test END close(SENDMAIL); --------------------- End File -------------------------

    • ベストアンサー
    • PHP
  • 複雑なrsync

    WindowsStrageServer2012版テラステーション内に共有フォルダを作成し(home) このテラステーションを同じネットワーク内のWindowsServer2008R2のPCの ActiveDirectoryのドメインに参加して、アクセス制御しています。 このフォルダを、CentOSのディレクトリにcifsでマウントし、(/Backup/home) mount -t cifs -o username=administrator,pass=パスワード //テラステーションサーバーIPアドレス/home /backup/home CentOS PC内の、ユーザーフォルダ/homeのデータをrsyncしようとしているのですが、 コマンドは以下の通りです。 rsync -av /home/ /backup/home >> /backup/home.log rsync: failed to set times on "/backup/home/.": Permission denied (13) と表示されて、同期できません Permission deniedなので、テラステーション側の共有のアクセス権をEveryoneに設定してみたのですが、うまくいきませんでした。(このフォルダはadministratorでも読み書き可に設定されています。) 考えられる原因は何でしょうか? ちょっと複雑な構成なので、参考文献を探しているのですが、見つけることができません。 よろしくお願いします

  • system関数の実行結果の表示について

    system関数で、mysql -h host -u user -ppasswd dbname < xxx.sqlを 実行しているのですが、エラーメッセージが取得できずに困っています。 DOSプロンプトから実行した場合は、エラーなどがあるとDOSプロンプトに表示されると思うのですが、その結果を取得したいと思っています。 system関数では、取得できないのでしょうか?または、使い方が間違っているのでしょうか? print( system("mysql -h host -u user -ppasswd dbname < xxx.sql") , $intRet ); 環境:Windows2003+Mysql4.1.9+PHP4+Apache2

    • ベストアンサー
    • PHP
  • perlでLocation

    Locationでは#xxxというのは使えないのでしょうか? #!/usr/local/bin/perl print "Location:xxx.cgi#xxx/?userID=$name\n\n"; exit; という風に書いています。 xxx.cgiはローカルにあるcgiでそのcgiの中身は表示できます。 しかしxxx.cgiの中の <xxxx.cgiの中身> print <<"EOM"; <html> . . . <A NAME="xxx>image</A> . . . </HTML> EOM exit; xxxのところでなく一番最初が表示されてしまいます。 どうすればいいのでしょうか?

    • ベストアンサー
    • Perl
  • perlのdbi-connect処理のエラー

    active perlでdbi-connect処理から戻ってきません。教えてください。 以下のテスト的なプログラムで試しました。 Xには、数字が入ります。(会社のファイルサーバーになります) DBI->connectから戻ってきていないようです。(hhhhhhhhが表示されません) ちなみにDBI->connectをコメントにすれば表示されます。 申し訳ありませんが、どなたかご存知の方いらっしゃらないでしょうか? エラーがかえってこないと、何が悪いかわかりません。 困っています、宜しくお願いします。 ちなみにPerlは、Ver. 5.8.7.813でdbi,dbd-oracleは、昨日ppmでダウンロードしました。 # DBへコネクトする my $datasource = 'dbi:oracle:usrDB:xxx.xxx.x.xx:8080' ; my $usr = 'usrname' ; my $pass = 'usepass' ; my $dbh = DBI->connect($datasource,$usr,$pass) ; print "hhhhhhhhhhhh\n" ; if( ! $dbh ){ print "gggggggggggg\n" ; } $dbh->disconnect();

    • ベストアンサー
    • Perl
  • Perl からbashを呼び出したい

    Perlからbashのファイルを呼び出そうとしています。 sendmail2.cgiは、呼び出せていまが、 sendmail3.cgiは、呼び出せません。 bashのファイル自体は、./(bashファイル)とやると実行できます。 パーミッションは、 sendmail3.cgi 655 mail_plain.sh 755 sendmail2.cgi 705 mailsend.sh 705 です。 パスの設定の問題かとも思ったのですが、よくわかりません。 宜しくお願いします。 ===sendmail2.cgi============= #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<P>sendmail test</P>\n"; print "mailtest\n"; print "</HTML>\n"; exec('/home/httpd/wwwroot/yoshida/mailsend.sh'); exit(0); ============================== ===sendmail3.cgi============= #!/usr/bin/perl exec("/home/httpd/wwwroot/bbstest/mail_plain.bash"); exit(0); ==============================

    • ベストアンサー
    • Perl
  • Apach2.0 ホームディレクトリでCGIが

    こんにちは。 CGIの勉強をしています。 わかる方がいらっしゃいましたら、おしえてください。 ソースは、poderosaでつないでviにて作成。 ブラウザからのアクセス http://XXX.XXX.XXX.XXX/~admin/cgi-bin/test.cgi (test.cgi)755 #!/usr/bin/perl print "Content-type: text/html\n\n"; print "Hello\n"; ./test.cgi にて、Helloと表示される (httpd.confに追加したもの) UserDir public_html <Directory /home/*/public_html> AllowOverride All Options IncludesNoExec ExecCGI FollowSymLinks <Limit GET POST OPTIONS> Order allow,deny Allow from all </Limit> <LimitExcept GET POST OPTIONS> Order deny,allow Deny from all </LimitExcept> </Directory> 以下を追加したこともあり↓ <Directory /home/*/public_html/cgi-bin/> AllowOverride None Options ExecCGI SetHandler cgi-script Order allow,deny Allow from all AddHandler cgi-script .cgi </Directory> よろしくおねがいします。

  • [Perl] Pack関数について教えてください。

    こんにちは。 下記は、pack関数のサンプルスクリプトですが、 なんでそのような結果になるのか、よくわかりません。どなたか教えていただけますか。 print "文字列を入力してください:"; $string = <STDIN>; chomp ($string); $length = length($string); print "数値を入力してください:"; $number = <STDIN>; chomp ($number); # Do Pack! $packed = pack("A${length}i", $string, $number); print "パック文字列: $packed\n"; --- 結果 --- 文字列を入力してください:perl 数値を入力してください:100 パック文字列: perl

    • ベストアンサー
    • Perl

専門家に質問してみよう