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
存在。