在 Bash 脚本中,命令“cd”出现权限被拒绝错误

在 Bash 脚本中,命令“cd”出现权限被拒绝错误

在 (长) PHP 会话期间,每次发生重大更改后,我都会对数据库进行 SQL 转储,并将转储文件的名称存储在 中。在会话结束时,我想使用以下脚本删除除最后一个转储 (其名称在 中)$_SESSION['lastbackup']之外的所有生成的转储:$_SESSION['lastbackup']

~/bin/removeoldbackups.sh

 #!/bin/bash
 # remove all files in directory $1 which are part of file pool $2, 
 except when filename == $3
 # arguments:
 # 1     directory path
 # 2     filepool (with wild cards)
 # 3     name of file NOT to be removed
 if [ $# -lt 3 ]; then
 #       no 3rd parameter; 'none' assumed
         keep="none"
 else
         keep=$3
 fi
 cd "$1"
 for  f in $2
 do
         if [ "$f" != "$keep" ]; then
                 rm "$f"
         fi
 done
 exit

当我从命令提示符运行它时:

removeoldbackups.sh  /media/fritzmedia/Elements/ubuntubackup mdvlp2*.sql  mdvlp20161225-23:20:09.sql

它运行良好。但是当我从我的.php网页运行它时

shell_exec( '~/bin/removeoldbackups.sh
        /media/fritzmedia/Elements/ubuntubackup ' . 
        'mdvlp2*.sql '.
        $_SESSION['lastbackup'] );

我收到以下错误:

sh: 2: /media/fritzmedia/Elements/ubuntubackup: Permission denied

(我尝试过用execshell_exec来代替,但没有什么区别。)我猜(正如它所说)这意味着它不是执行脚本的权限问题,而是访问备份文件(路径的某些部分)的权限问题。

附加信息:

  • fritzmedia是安装在 上的外部驱动器/media
  • 文件所有者为/mediaroot:rootfritzmedia并且从那里向下为www-data:root
  • /media直到预期文件的权限: 0777

removeoldbackups.sh脚本在~/bin;所有者root:root;权限中0755

备份文件是通过 PHP 文件调用创建的:

exec ( 'mysqldump -u -sqluser- -sqlpw- ' . $dbn . ' > ' . $dumpnaam );

答案1

这个错误sh: 2: /media/fritzmedia/Elements/ubuntubackup: Permission denied意味着第 2 行sh尝试执行/media/fritzmedia/Elements/ubuntubackup但因为没有执行权限而失败。

问题是,您传递给 的命令中有换行符shell_exec。您应该删除该换行符,并将所有内容放在一行上。

最好不要使用,shell_exec因为它很容易与可能由用户控制的值(如)相关联,从而导致代码注入$_SESSION['lastbackup']。您至少应该将其传递到escapeshellcmd。但是,在这种情况下,您的 shell 脚本可以轻松地在 PHP 中重新实现。

相关内容