我在服务器上有一个用户帐户,该服务器上大约有 400 个帐户,并且帐户容量正在自动填满。用户主目录中的 dead.letter 文件会自动增长,直到帐户已满(每天大约 10 - 40 Mb)。用户正在使用 Microsoft Outlook 发送和接收邮件。
什么原因造成这种情况?我该如何避免它发生?
现在我有一个紧急的 cron 作业来删除该文件,但是我想“真实的”解决方案。
编辑:服务器版本是Red Hat Enterprise Linux ES release 4 (Nahant Update 4)
编辑2:它似乎主要是垃圾邮件,我看到不同的邮件标题(从 php 到 Outlook Express),并且经常出现的标题是[email protected]
更新:我已经要求使用该专用服务器的托管提供商也调查该问题,因为他们的控制面板可能是导致问题的原因。
答案1
该用户是否拥有由该系统的 Web 服务器提供的 Web 内容树?
检查其内容树中是否有 CGI 或处理 GET/POST 提交的内容。我猜他们安装了一些标准的 Web 软件——页面布局工具或类似 WordPress 的东西。一些第三方正在利用该 Web 软件中的一些安全漏洞尝试从此系统发送邮件。他们的漏洞无法正常工作,或者至少并非总是如此,因此部分/所有外发邮件都失败了;本地邮件传输代理正在将邮件放入用户的 dead.letter 中。
我在这里处于困境之中...但这是我首先要考虑的地方。
答案2
这是一个您可以针对 dead.letter 文件运行的脚本,也许可以捕获创建该文件的进程。
#! /bin/bash
if [ $# -eq 0 ]; then
echo "Syntax: $(basename $0) <file_to_watch>"
exit 1
fi
FILE_TO_WATCH=$1
LOGFILE=/var/tmp/$(basename $0).$(date +"%Y-%m-%d").log
SLEEP_DELAY=5
if [ ! -e $LOGFILE ]; then
echo -e "DATE COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME" > $LOGFILE
fi
echo "Starting lsof tail job with PID $$"
echo "lsof output will be appended to $LOGFILE"
while true; do
if [ -e $FILE_TO_WATCH ]; then
lsof $FILE_TO_WATCH | sed 1d | sed -e "s/^/$(date +"%Y-%d-%m %H:%M:%S ")/" >> $LOGFILE 2>/dev/null
sleep $SLEEP_DELAY
fi
done
例如,您可以随意更改变量以使延迟更加激进。如果您想将其作为后台作业启动,只需像这样调用它:
nohup script.sh /path/to/dead.letter &
为方便您终止它,该脚本将回显它使用的 PID。
编辑:根据您的评论,文件似乎没有被进程保持打开状态足够长的时间,因此您无法捕获它。您可以尝试的另一件事是在 dead.letter 文件上设置不可变标志,希望它会在 /var/log/messages 或其他日志中生成错误。即使是 root 也无法更改不可变文件。
按着这些次序:
# rm -f dead.letter
# touch dead.letter
# chattr +i dead.letter
# lsattr dead.letter
----i---------- dead.letter
然后尝试用 root 再次触摸它。您将得到以下信息:
touch: cannot touch `dead.letter': Permission denied
这证明你做对了。
答案3
如果我没记错的话,很多年前我遇到过一个由损坏的 cron 脚本引起的这种情况,因此请检查用户crontab
。