You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用strace -f执行mutt命令失败的原因排查

问题背景
  • 单独执行mutt命令发送邮件可正常运行:
mutt myOwnMail@server.com -s "some_subject" -a file.log < file.log # WORKS
  • 使用strace直接跟踪该命令也能正常运行:
strace mutt myOwnMail@server.com -s "some_subject" -a file.log < file.log # WORKS
  • 但添加-f(跟踪子进程)选项后执行失败,错误输出如下:
[pid 24140] open("maildrop/816765.24140", O_RDWR|O_CREAT|O_EXCL, 0644) = -1 EACCES (Permission denied)
[pid 24140] write(2, "postdrop: warning: mail_queue_en"..., 90postdrop: warning: mail_queue_enter: create file maildrop/816765.24140: Permission denied
) = 90
[pid 24140] sendto(3, "<20>Aug 22 20:49:03 postfix/post"..., 124, MSG_NOSIGNAL, NULL, 0) = 124
[pid 24140] rt_sigprocmask(SIG_BLOCK, [CHLD], [CHLD TSTP], 8) = 0
[pid 24140] nanosleep({10, 0}, 0x7ffd7e940140) = 0
[pid 24140] open("maildrop/817709.24140", O_RDWR|O_CREAT|O_EXCL, 0644) = -1 EACCES (Permission denied)
[pid 24140] write(2, "postdrop: warning: mail_queue_en"..., 90postdrop: warning: mail_queue_enter: create file maildrop/817709.24140: Permission denied
) = 90
[pid 24140] sendto(3, "<20>Aug 22 20:49:13 postfix/post"..., 124, MSG_NOSIGNAL, NULL, 0) = 124
[pid 24140] rt_sigprocmask(SIG_BLOCK, [CHLD], [CHLD TSTP], 8) = 0
[pid 24140] nanosleep({10, 0}, 0x7ffd7e940140) = 0
[pid 24140] open("maildrop/818761.24140", O_RDWR|O_CREAT|O_EXCL, 0644) = -1 EACCES (Permission denied)
[pid 24140] write(2, "postdrop: warning: mail_queue_en"..., 90postdrop: warning: mail_queue_enter: create file maildrop/818761.24140: Permission denied
) = 90
[pid 24140] sendto(3, "<20>Aug 22 20:49:23 postfix/post"..., 124, MSG_NOSIGNAL, NULL, 0) = 124
[pid 24140] rt_sigprocmask(SIG_BLOCK, [CHLD], [CHLD TSTP], 8) = 0
[pid 24140] nanosleep({10, 0}, ^Cstrace: Process 24137 detached
  • 查询postdrop的权限信息:
sh -c 'find / -name \*postdrop\* -ls 2> /dev/null'

输出结果:

2333274  216 -rwxr-sr-x   1 root     postdrop   218632 Oct 30  2018 /usr/sbin/postdrop
9426253    4 -rw-r--r--   1 root     root         1629 Oct 30  2018 /usr/share/man/man1/postdrop.1.gz
原因分析

问题核心在于postdrop的SGID权限位与strace -f的跟踪机制冲突:

  1. 从权限输出可知,/usr/sbin/postdrop的权限为-rwxr-sr-x,其中的s表示启用了SGID位——程序运行时会继承所属组(postdrop组)的权限,这是它能写入Postfix的maildrop目录(该目录通常仅对postdrop组开放写入权限)的关键。
  2. 当使用strace -f时,strace会通过ptrace系统调用跟踪所有子进程(包括mutt启动的postdrop进程)。Linux的安全机制会限制被ptrace跟踪的进程的权限提升:被跟踪的进程无法正常获取SGID带来的有效组ID(EGID)提升,导致postdrop只能以当前用户的组权限运行,没有权限写入maildrop目录,最终触发Permission denied错误。
  3. 而不带-f的strace仅跟踪父进程(mutt本身),不会干预postdrop子进程,因此postdrop能正常继承SGID权限完成邮件投递。

内容的提问来源于stack exchange,提问作者urie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:27:17