我正在尝试使邮件接收脚本正常工作,但是在尝试将文件复制到需要它们的位置时出现权限错误。
我们正在运行Linux / CentOS / Plesk Web服务器。我将qmail设置为将某个地址接收到的消息传递到Shell脚本。该脚本应该将消息写入文件,然后将其复制到服务器的虚拟主机订阅之一,以便可以通过通过Web服务器运行的代码来访问它们。
我可以毫无问题地将传递到shell脚本的消息传递出去,它可以成功地将接收到的消息写到本地目录中的文件中(/ var / qmail / mailnames /中的收件人文件夹)。但是,当脚本尝试将消息文件复制到正确的vhost目录时,出现“权限被拒绝”错误。
-
.qmail(将文件管道传递到parse_mail.sh的文件-为清楚起见,包括在内,此部分按预期工作):
| true
| /bin/bash parse_mail.sh &> parse_mail_sh.log
-
parse_mail.sh:
echo "Start parse_mail $(date)";
u=$(/bin/id -u -n);
echo "running as ${u}";
umask 000;
# random tag name
templ='message';
rand=$(awk -vmin=100000000 -vmax=999999999 'BEGIN{srand(); print
int(min+rand()*(max-min+1))}');
tag=$templ$rand;
echo "Create dir ${tag}/";
/bin/mkdir $tag;
echo "Write message into ${tag}/";
/bin/cp /dev/stdin ${tag}/message.txt;
echo "Copy message to message_files/";
/bin/cp ${tag}/message.txt /var/www/vhosts/subscription/httpdocs/subfolder/message_files/${tag}_content.txt
echo "Remove ${tag}/";
/bin/rm -R ${tag};
echo "End parse_mail";
-
parse_mail_sh.log日志显示:
Start parse_mail Thu Jul 18 11:07:06 EDT 2019
running as popuser
Create dir message494556566/
Write message into message494556566/
Copy message to message_files/
/bin/cp: failed to access '/var/www/vhosts/subscription/httpdocs/subfolder/message_files/message494556566_content.txt': Permission denied
Remove message494556566/
End parse_mail
-
很简单,对吧? 'popuser'只是没有写这个目录的权限。
除了,这是奇怪的事情:
我不是专家,但我通常了解unix / linux权限的工作方式。我相信popuser确实具有访问和写入目录的必要权限-中间的目录结构是可遍历的,并且我已经将popuser添加到了写入该特定订阅文件夹所必需的组中。
我可以在终端中使用su弹出用户,并在目录结构中上下移动cd,并在正确的位置复制/创建文件。我什至可以从终端AS popuser运行邮件接收脚本,它可以完美运行。仅在接收邮件时触发时才引发错误。
我认为这意味着popuser通过qmail运行的环境与通过终端运行的环境有所不同-我只是无法精确地找到可能的状态(或在线查找有关此内容的文章)。
还是我误会了某些东西是如何工作的?就像我说的,不是专家...
所以我的问题是:
当qmail接收到一条消息时,为什么parse_mail.sh脚本不能成功地将创建的文件复制到指定的message_files /目录中,因为当由相同的系统用户(popuser)执行该相同的脚本时,该脚本可以这样做。终奌站?
最佳答案
经过几天的努力,我发现了问题所在。
我做了所有正确的更改,但是系统没有赶上。
我已经在PLESK中重新启动了各种服务-包括“ POP /邮件服务器”,但是显然后缀不是您可以从那里控制的。
当我停止然后重新启动Postfix时,我的脚本突然起作用了。
我唯一的理论是,“ popuser”可能是在未更改用户组的旧会话上通过后缀进行操作的-这也许可以解释为什么我可以通过popuser终端执行操作,但邮件处理器却不能。