2016-05-15 31 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 

das ist meine Shellscript. Dies wird durch php genannt:scp mit nohup im hintergrund funktioniert nicht

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

diese workes in Ordnung, aber die Dateien, ich will übertragen, sind zu groß, dass in Sekunden zu handhaben, so will ich in der Shell verwenden nohup den scp-Prozess ausgeführt im Hintergrund. scp läuft, aber nicht im Hintergrund. ich weiß nicht, warum:/

danke für die hilfe!

+0

Ihr PHP-Code ist ernsthaft unsicher. Ich kann dir helfen, die Shell-Bits zu reparieren, aber das macht es nicht weniger gefährlich. –

+0

(... oder besser gesagt: das macht den Weg, den Sie von PHP aus aufrufen, weniger gefährlich). –

Antwort

0

keine Notwendigkeit für nohup Es gibt hier - trennen nur direkt alle FDs vom TTY und verwenden 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 

Hinweis:

  • die -B (Batch) Option scp aktiviert ist.
  • stdin, stdout und stderr werden alle auf /dev/null umgeleitet (obwohl man es besser machen könnte, die beiden letzteren in eine Protokolldatei zu umleiten beim Debuggen)
  • shebang beginnt mit #!, nicht ##!
  • disown verwendet wird, die entfernen Prozess von der Auftragstabelle Shell

das größere Problem ist die Verwendung von shell_exec() mit einer verketteten Zeichenfolge. Der richtige Weg, um einen Unterprozess direkt zu starten, gibt jeden Array-Eintrag argv an. Im Gegensatz zur Verwendung einer Shell (wie shell_exec()) verhindert dies, dass Variablen willkürlichen Code ausführen (denken Sie an eine Datei namens /uploads/evil-$(rm -rf $HOME)'$(rm -rf $HOME)'.mp4; wenn Sie diesen Namen in eine Zeichenfolge einfügen, die als Code ausgeführt wird, haben Sie einen sehr schlechten Tag, auch wenn Sie versuchen, Anführungszeichen zu verwenden, um es zu schützen).