我正在尝试使邮件接收脚本正常工作,但是当它尝试将文件复制到需要它们的位置时出现权限错误。
我们正在运行 Linux/CentOS/Plesk 网络服务器。我将 qmail 设置为通过管道将某个地址接收到的消息发送到 shell 脚本。该脚本应该将消息写入文件并将它们复制到服务器的虚拟主机订阅之一,以便可以通过网络服务器运行的代码访问它们。
我可以将消息传递给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 到终端中的 popuser 并 cd 上下目录结构,并在正确的位置复制/创建文件。我什至可以从终端 AS popuser 运行邮件接收脚本,它运行良好。它仅在接收邮件时触发错误。
我认为这意味着 popuser 通过 qmail 运行的环境与终端相比存在一些差异 - 我只是无法准确追踪可能是什么(或在网上找到有关它的文章)。
或者我误解了某些东西是如何工作的?就像我说的,不是专家...
所以我的问题是:
当 qmail 接收到消息时,为什么 parse_mail.sh 脚本不能成功地将创建的文件复制到指定的 message_files/ 目录,因为同一系统用户(popuser)在通过终端?