我们有一个 [Ubuntu 20.04] Docker 映像,用作测试系统的一部分,我需要在其中运行pppd
(以测试拨号连接),其中pppd
通过循环连接到物理调制解调器socat
。我的问题是,当 Docker 容器的 [非 root] 用户(我们称之为用户usera
)执行时pppd
(即setuid
,该部分工作正常),pppd
无法访问相同的 用户刚刚使用设置socat
。usera
成功执行:
socat pty,link=/tmp/ppp0,echo=0,raw,b115200 pty,link=/tmp/tty0,echo=0,raw,b115200
...运行良好,其中 Dockerfile 已设置权限/tmp
为:
chmod 1777 /tmp
...即tmp
具有权限drwxrwxrwt
。
命令socat
行成功创建:
ls -l /tmp
total 0
lrwxrwxrwx 1 ubxlib ubxlib 10 Mar 8 15:33 ppp0 -> /dev/pts/1
lrwxrwxrwx 1 ubxlib ubxlib 10 Mar 8 15:33 tty0 -> /dev/pts/2
...但是当usera
执行pppd
连接到循环的一端时,我们得到:
pppd /tmp/ppp0 115200 passive debug local nodetach
pppd: Couldn't stat /tmp/ppp0: Permission denied
相反,如果usera
知道/dev/pts/x
刚刚socat
创建的,而不是使用通过的链接/tmp/ppp0
,那么就pppd
可以工作:
pppd /dev/pts/1 115200 passive debug local nodetach
using channel 1
Using interface ppp0
Connect: ppp0 <--> /dev/pts/1
...
我如何使用用户提供的pppd
链接进行工作,而不必知道做了什么?socat
usera
usera
socat
为了完整起见,的权限pppd
是-rwsr-xr-x
。 sudo
这里不是一个选项,因为这是在 Jenkins 通过 SSH 运行的 Docker 容器内,所以没有密码的 TTY/响应器。
答案1
答案是,我需要sudo sysctl fs.protected_symlinks=0
在主机 Linux 系统中进行设置(在 中永久设置/usr/lib/sysctl.d/protect-links.conf
)。至于这是否是一个明智的无论是否该做,但对于我们的测试系统而言,这样做是可以的。