我有一个运行的bash脚本hostapd_cli all_sta
,并且该脚本在jessie和stretch下从命令行成功执行。该脚本在 jessie 上的 sudo 下运行时也可以运行,但在拉伸时则不行。在拉伸时,命令超时并出现错误'STA-FIRST' command timed out
。当我在 strace 下调用 hostapd_cli 时,我看到它在以下位置打开一个套接字文件/tmp
:
bind(3, {sa_family=AF_UNIX, sun_path="/tmp/wpa_ctrl_13552-1"}, 110) = 0
connect(3, {sa_family=AF_UNIX, sun_path="/var/run/hostapd/wlan1"}, 110) = 0
作为测试,我暂时修改了脚本并添加了一行:
echo "this is a test" >/tmp/test 2>/root/error
当修改后的脚本在 sudo 下运行时,不会创建 中的文件/tmp
,也不会向 中写入错误/tmp/error
。
在我的系统上,/tmp
不是 tmpfs,只是/
ext3 文件系统下的一个普通旧目录。所以 root 无法在下面创建文件/tmp
并且有足够的空间。
# df -h /tmp
Filesystem Size Used Avail Use% Mounted on
/dev/sdb2 6.7G 5.1G 1.4G 80% /
并ls -ld /tmp
给出:
# ls -ld /tmp
drwxrwxrwt 9 root root 4096 Jul 27 23:50 /tmp/
如果我能弄清楚为什么/tmp
无法写入,我相信 hostapd_cli 命令将会起作用。这里可能发生什么?
答案1
这没有按预期工作的原因是因为/tmp
被 systemd 重新映射为/tmp/systemd-private-67fcab218d3d46bcb5092dd8a6d4789b-nagios-nrpe-server.service-lN2L1e/tmp
该问题与 sudo 无关,但事实是 sudo 作为在 nrpe 守护进程下运行的插件执行,而该守护进程又被配置为/tmp
在 systemd 下拥有私有进程。
为了解决这个问题,我设置了:
systemctl stop nagios-nrpe-server
set PrivateTmp=false in /etc/systemd/system/multi-user.target.wants/nagios-nrpe-server.service
systemctl daemon-reload
systemctl start nagios-nrpe-server