有没有办法判断进程是否已 chroot?

Pau*_*aul 5 chroot openbsd

我对理解还很陌生chroot。某些软件包安装自己的用户 ( _packagedaemon) 并创建自己的目录 ( /var/package/)。

但是,我无法判断该进程是否配置为在 a 中运行chroot,并且我不确定在哪里检查。

Zé *_*off 5

fstat将指示(正在运行的)进程的根目录。

示例1:nginx

nginx的工人运行 chrooted。您可以使用pgrep获取进程的 ID:

# pgrep -lf nginx
58845 nginx: worker process
41019 nginx: master process /usr/local/sbin/nginx
Run Code Online (Sandbox Code Playgroud)

然后用它fstat来检查它打开了哪些文件/套接字:

# fstat -p 58845 | grep -e MODE -e " root"
USER     CMD          PID   FD MOUNT        INUM  MODE         R/W    SZ|DV
www      nginx      58845 root /var/www        2  drwxr-xr-x     r      512
Run Code Online (Sandbox Code Playgroud)

这一行(列root中的FD行)表示该进程植根于INUM挂载点的 inode 2(列)/var/www。然后您可以使用以下命令找出该节点的名称find

# find -x /var/www -inum 2
/var/www
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,nginx的工人被 chroot 到/var/www. 请注意,主进程不会以 chroot 方式运行:

# fstat -p 41019 | grep " root"
Run Code Online (Sandbox Code Playgroud)

出现空的。主进程读取所有配置文件,然后分叉 chroot 的工作进程。

示例2:nsd

nsd与 有点不同nginx,因为即使主进程也以 chroot 运行/var/nsd

# pgrep -lf nsd
28155 nsd: server 1
45373 nsd: main
3681 nsd: xfrd

# fstat -p 45373 | grep -e MODE -e " root"
USER     CMD          PID   FD MOUNT        INUM  MODE         R/W    SZ|DV
_nsd     nsd        45373 root /var         8580  drwxr-xr-x     r      512

# find -x /var -inum 8580
/var/nsd
Run Code Online (Sandbox Code Playgroud)

  • 我认为作为示例,OpenBSD 默认的“httpd”可能会稍微好一些,因为“logger”的“fstat”输出和“root”的“server”输出将“MOUNT”作为“/var”和(在我的例子中)“INUM” `570240`,更清楚地说明了为什么我需要运行 `# find -x /var -inum 570240` (输出为 `/var/www`)。 (2认同)