在 (长) 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
(我尝试过用exec
:shell_exec
来代替,但没有什么区别。)我猜(正如它所说)这意味着它不是执行脚本的权限问题,而是访问备份文件(路径的某些部分)的权限问题。
附加信息:
fritzmedia
是安装在 上的外部驱动器/media
。- 文件所有者为
/media
;root:root
为fritzmedia
并且从那里向下为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 中重新实现。