这是我所做的:我让 Exim 使用管道传输为某个进程发送电子邮件dovecot-lda
。此进程以用户/组身份运行jdoe:jdoe
。(我使用自写的包装器检查了两次truss
。)消息已正确传递;但我看到一条消息:
dovecot_lda transport output: lda(jdoe): Error: net_connect_unix(/var/run/dovecot/stats-writer) failed: Permission denied
但可以肯定的是,它jdoe
具有组成员身份所需的权限wheel
:
# ls -l /var/run/dovecot/stats-writer
srw-rw---- 1 dovecot wheel 0 7 Sep. 22:13 /var/run/dovecot/stats-writer
# id jdoe
uid=1001(jdoe) gid=1001(jdoe) groups=1001(jdoe),0(wheel),...
那么这里发生了什么?
当我在 Exim 传输配置中更改进程所有权时,警告消失,但交付失败。当我jdoe
在 Dovecot 统计服务中将套接字用户更改为时,其他用户的问题仍然没有解决。
我还可以尝试什么?
Exim 传输配置为:
dovecot_lda:
driver = pipe
command = /usr/bin/truss -s 1024 -o /tmp/dovecot.truss -f /usr/local/libexec/dovecot/dovecot-lda -d "${lookup{$local_part}dsearch{/usr/local/misc/mail}}"
user = $local_part
group = $local_part
...
temp_errors = 64 : 69 : 70: 71 : 72 : 73 : 74 : 75 : 78
您可能需要在传输上
initgroups
设置选项来告诉 Exim 它还需要设置补充组列表。内核不会自动从主 UID 推断它们——而是由 Exim 设置主 UID:GID和补充 GID。
(并且软件没有可以使用的单一“成为用户 X”功能,因此他们必须从多个 API 中组装自己的 UID/GID 切换代码,从而带来所有不一致性;例如,跳过 initgroups() 调用“因为性能”或其他原因。)