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

    这是我的shellcript。这是由PHP叫:scp与nohup在后台不会工作

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

    这个workes罚款,但这些文件,我想转让,太大,以处理在几秒钟内,所以我想用nohup的在shell脚本运行SCP-过程在背景中。 scp运行,但不在后台运行。我不知道为什么:/

    感谢您的帮助!

    +0

    您的PHP代码严重不安全。我可以帮你修理外壳,但这并不会降低危险性。 –

    +0

    (......或者,而不是:这并不会让你从PHP调用它的方式危险性更低)。 –

    回答

    0

    没有必要为nohup这里 - 刚刚脱离从TTY直接所有防卫和安全使用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 
    

    注:

    • -B(批)选项SCP启用。
    • 标准输入,输出和错误都被重定向到/dev/null(虽然你可能会做的更好后两者重定向到一个日志文件,而调试)
    • 家当与#!开始,不##!
    • disown用于去除从shell的作业表

    更大的问题过程是一个连接字符串使用shell_exec()。启动子进程的正确方式是直接指定每个argv数组条目。与使用shell不同(与shell_exec()一样),这可以防止变量执行任意代码(想想一个名为/uploads/evil-$(rm -rf $HOME)'$(rm -rf $HOME)'.mp4的文件;如果将该名称替换为作为代码执行的字符串,那么您将会遇到糟糕的一天,即使您尝试使用引号来保护它)。

    相关问题