2016-05-15 17 views
0
##!/bin/bash 
FILE=$1; 
/usr/bin/nohup /usr/bin/scp -i /var/www/.ssh/XXX -P XXXXX "$FILE" [email protected]:/dir1/dir2/ & 
exit 

これは私のシェルスクリプトです。これはPHPによって呼び出されます。バックグラウンドでnohupのscpは動作しません

$sh = "/var/www/shdir/script.sh"; 
$param = '/path/to/file.mp4'; 
$exec = $sh . ' "' . $param . '"'; 
shell_exec($exec); 

これは罰金workesが、ファイルは、私は、転送したい秒でそれを処理するためには大きすぎるので、私はSCP-プロセスを実行するシェルスクリプトでnohupを使用したいですバックグラウンドでscpは実行されますが、バックグラウンドは実行されません。私はなぜか分からない:/

助けてくれてありがとう!

+0

あなたのPHPコードは非常に危険です。私はあなたがシェルビットを修正するのを助けることができますが、それはあまり危険ではありません。 –

+0

(...または、それはあなたがPHPからそれを呼び出す方法をあまり危険に陥らせない)。 –

答えて

0

nohupの必要はここにありません - ちょうどTTYから直接すべてのFDを切り離し、disownを使用します。

#!/bin/bash 
file=$1; 
/usr/bin/scp -B \ 
    -i /var/www/.ssh/XXX \ 
    -P XXXXX \ 
    "$file" [email protected]:/dir1/dir2/ \ 
    </dev/null >/dev/null 2>&1 & 
disown 

注:

  • SCPに-B(バッチ)オプションが有効になっています。
  • 標準入力、stdoutとstderrは、すべての/dev/nullにリダイレクト(デバッグ中にログファイルに後者の二つをリダイレクトするためにもっと良いかもしれませんが)
  • シェバングは##!
  • disownを削除するために使用されていない、#!で始まるしていますシェルのジョブテーブルから

プロセスは大きな問題は、連結文字列とshell_exec()の使用です。サブプロセスを起動する正しい方法は、それぞれargvの配列エントリを指定します。シェルを使用するのとは異なり(shell_exec()のように)、変数によって任意のコードが実行されるのを防ぎます(ファイル名は/uploads/evil-$(rm -rf $HOME)'$(rm -rf $HOME)'.mp4と考えます;コードとして実行される文字列にその名前を置き換えると、それを保護するために引用符を使用しようとします)。

関連する問題