我正在使用 firejail 来沙箱 Firefox。当我使用时lsof -i
,没有显示连接。 Firejail 对进程进行命名空间隔离,所以我这样做
ps aux | grep firefox | awk ' { print $2} ' | while read p ; do nsenter -t $p lsof -i ; done
输入每个命名空间并使用 lsof -i。我nsenter -t <pid> -n lsof -i
也尝试过,但什么也没有出现。但是当我以 root 身份运行时,这会起作用。用户不应该能够列出打开的套接字连接吗?
答案1
这条ps | grep | awk
管道既古老又丑陋(这是非常古老的)。
顺便说一句,grep
将匹配它自己的 pid...这就是为什么大多数变体使用一些技巧来排除 grep 的 pid。通常是一些可怕的事情,比如ps aux | grep command | grep -v grep
。其中最好的一个是使用 grep 正则表达式的括号表达式。甚至更好的版本意识到管道输入grep
几乎awk
总是多余的毫无意义,不是必需的,甚至是不必要的,因为awk
可以进行正则表达式模式匹配,并最终得到类似ps aux | awk '/[c]ommand/ {print $2}'
) 的结果。
无论如何,不要使用任何可怕的废话。它本来应该在九十年代就死掉了,但它的僵尸尸体却不断复活或重新发明。
请改用pgrep
orps
与h
(无标题)、-C
(匹配 cmdlist)和-o
(输出格式)选项。这就是他们的目的。
例如
pgrep -f firefox | xargs -I {} nsenter -n -t {} lsof -i
或者
ps h -C firefox -o pid | xargs -I {} nsenter -n -t {} lsof -i
或者,没有xargs
:
for pid in $(pgrep -f firefox) ; do
nsenter -n -t "$pid" lsof -i
done
这远非完美,但它是一个比您当前正在做的事情要好得多的起点。
顺便说一句,pgrep
可以列出命名空间中的所有 PID。还有lsns
用于检查和提取有关名称空间的各种详细信息。甚至还ps
可以选择列出与 PID 相关的各种命名空间。您可能应该阅读所有这些的手册页......特别是如果您想在没有自己的lsof
二进制文件或到系统的 lsof 和/或 /usr/bin/ 的映射的名称空间中列出网络连接目录。
不幸的是,lsof
它本身似乎没有任何内置的命名空间支持......也许在未来的某个版本中。
答案2
事实证明,firefox似乎为正在运行的和派生的firefox进程创建了另一个沙箱。因此,如果用户在命令行上使用 firefox 启动 firejail,则会显示当前用户的 lsns。
但是,如果从同一命令行我 grep 所有 firefox 进程,然后输入 net 命名空间,lsof -i
则会失败:
nsenter: cannot open /proc/8958/ns/net: Permission denied
作为 root,lsns 显示 firefox 进程以及每个命名空间的关联 pid。如果我输入所有命名空间 和lsof -i
,我会得到某些 pid 的 firefox 套接字的输出。
当我ls
/proc/pid 时,其中 pid uid 是用户并生成了 lsof -i 输出,这些文件均由 root 所有,而不是由用户所有,这就是为什么lsof -i
在所有 firefox 进程上以用户身份执行时不起作用的原因。
很难说这是否是预期的行为,因此任何意见都将不胜感激。