输入密码后 Sudo 挂起 - /dev/null 问题

输入密码后 Sudo 挂起 - /dev/null 问题

Ubuntu 16.04。在使用了一些新东西(napp-it,一个 ZFS gui)后,我遇到了一个问题,即 sudo 在密码提示后挂起。sudo 的相关 strace 如下...

open("/dev/null", O_WRONLY|O_CREAT|O_APPEND, 0666) = 8
lseek(8, 0, SEEK_END)                   = 0
umask(022)                              = 077
fcntl(8, F_SETLKW, {l_type=F_WRLCK, l_whence=SEEK_CUR, l_start=0, l_len=0}

如果我 rm /dev/null 并重新创建它(使用 mknod 正确创建,然后使用适当的权限),sudo 可以正常运行。但是,这种情况只能持续到重新启动,此时 sudo 会再次挂起。

编辑...我应该补充说,重新启动后 /dev/null 上的权限立即显示正确。 ls -l /dev/null 产生以下内容(与删除并重新创建后相同)

crw-rw-rw- 1 root root 1, 3 Feb  8 20:58 /dev/null

答案1

sudo -l 的输出表明 sudo 日志记录被定向到 /dev/null。

检查 /etc/sudoers 后显示以下几行。

## supress Console messages from sudo
Defaults logfile=/dev/null
Defaults !syslog
##

不确定何时(或为何)将它们添加到 sudoers 文件中,但将其注释掉可以解决问题。

答案2

我正在编写一个 syslog 处理程序,并终止标准 syslog 守护程序。显然,至少根据此 strace,我猜测 glibcsyslog()函数似乎挂在sendto()系统调用上。

当系统核心部分发生这样的事情时,我总是感到震惊。也许这是设计使然?但这个想法似乎很糟糕。

read(9, "", 4096)                       = 0
close(9)                                = 0
munmap(0x7f461335d000, 4096)            = 0
read(8, "", 4096)                       = 0
close(8)                                = 0
munmap(0x7f461335e000, 4096)            = 0
socket(PF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 8
connect(8, {sa_family=AF_LOCAL, sun_path="/dev/log"}, 110) = 0
sendto(8, "<85>Sep 11 16:53:56 sudo:     ro"..., 92, MSG_NOSIGNAL, NULL, 0

所以 - 如果您遇到此问题,请检查您的 syslog 守护程序,看看它是否正常工作且/dev/log存在。

相关内容