我在 Arch Linux 计算机上运行的内核版本如下:
[root@router ~ ]$ uname -a
Linux router 4.2.5-1-ARCH #1 SMP PREEMPT Tue Oct 27 08:13:28 CET 2015
Run Code Online (Sandbox Code Playgroud)
我注意到每次我通过sysctl -a管道输入 grep 命令时我都会收到以下消息
[root@router ~ ]$ sysctl -a | grep no_meaning
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
...
Run Code Online (Sandbox Code Playgroud)
对这些文件运行 cat:
[root@router ~ ]$ cat /proc/sys/net/ipv6/conf/all/stable_secret
cat: /proc/sys/net/ipv6/conf/all/stable_secret: Input/output error
[root@router ~ ]$ ls -hl /proc/sys/net/ipv6/conf/all/stable_secret
-rw------- 1 root root 0 Dec 24 14:57 /proc/sys/net/ipv6/conf/all/stable_secret
Run Code Online (Sandbox Code Playgroud)
到目前为止我还没有看到任何不良影响,但我想知道这是否正常,特别是这些stable_secret键的功能是什么?提前致谢。
当我将 INotify 与/etc/mtab或一起使用时/proc/mounts,它在安装或卸载事物时不会检测到更改,即使当我手动检查时/etc/mtab和/proc/mounts都已更改。为什么会这样?我如何跟踪安装和卸载东西?
在调试相关问题时,我注意到 pgrep 正在为看似任意的命令行模式返回一个 PID,例如:
$ sudo pgrep -f "asdf"
13017
$ sudo pgrep -f ";lkj"
13023
$ sudo pgrep -f "qwer"
13035
$ sudo pgrep -f "poiu"
13046
$ sudo pgrep -f "blahblahblah"
14038
$ sudo pgrep -f "$(pwgen 16 1)"
14219
Run Code Online (Sandbox Code Playgroud)
没有 sudo 的相同命令没有返回任何内容(如预期):
$ pgrep -f blahblahblah
Run Code Online (Sandbox Code Playgroud)
我试图通过管道将 PID 传递给 ps 以查看命令是什么,但这不起作用:
$ sudo pgrep -f blahblahblah | xargs ps -f -p
UID PID PPID C STIME TTY TIME CMD
Run Code Online (Sandbox Code Playgroud)
看起来进程终止得太快了。然后我尝试使用 ps 和 grep,但这也不起作用(即没有结果):
$ sudo ps -e …Run Code Online (Sandbox Code Playgroud) 我明白通过安装dstat,iostat我可以获得磁盘活动统计信息。
但是,现在我希望尽量减少依赖项,因为我不想强迫我的脚本用户安装其他东西。
所以我想知道是否有任何方法可以从某个地方读取磁盘统计信息/proc/?
我知道pgrep, top, 和ps所有查询/proc文件系统。到现在为止还挺好。然而让我想到的是,过去没有/proc文件系统。即使在今天,据我所知,Mac OS X 没有/proc文件系统,但top仍然访问进程信息,这表明这些信息应该直接来自内核。但是,我的问题是针对 Linux 的。哪些库和/或系统调用可用于直接查询进程信息,绕过/proc?
作为非 root 用户,我正在运行一个进程。进程二进制文件被赋予了 cap_sys_resource 能力。即使该进程由同一用户拥有,该用户也无法读取其 /proc//fd 目录。/proc/pid 中的权限如下所示:
dr-xr-xr-x. 9 ec2-user ec2-user 0 May 12 01:03 .
dr-xr-xr-x. 249 root root 0 Apr 3 13:34 ..
dr-xr-xr-x. 2 ec2-user ec2-user 0 May 12 01:03 attr
-rw-r--r--. 1 root root 0 May 12 01:04 autogroup
-r--------. 1 root root 0 May 12 01:03 auxv
-r--r--r--. 1 root root 0 May 12 01:04 cgroup
--w-------. 1 root root 0 May 12 01:04 clear_refs
-r--r--r--. 1 root root 0 May 12 01:03 cmdline …Run Code Online (Sandbox Code Playgroud) 由给定打开的 UNIX 域套接字作为 的符号链接$PID列出。我知道它是该套接字的标识符,但它到底是什么?它是 inode 吗?它到底是一个索引节点吗?/proc/$PID/fd/X[socket:ID]sockfs
# stat /proc/15474/fd/18
File: /proc/15474/fd/18 -> socket:[100754490]
Size: 64 Blocks: 0 IO Block: 1024 symbolic link
Device: 4h/4d Inode: 100753577 Links: 1
Access: (0700/lrwx------) Uid: ( 999/mysql) Gid: ( 999/ docker)
Access: 2020-08-14 10:08:09.834593933 +0200
Modify: 2020-08-14 10:08:07.842537799 +0200
Change: 2020-08-14 10:08:07.842537799 +0200
Run Code Online (Sandbox Code Playgroud) 我想阻止用户看到其他系统用户。我已经阻止使用 hidepid=2 挂载选项列出 /proc 的进程,阻止列出其他用户的主目录,但他们仍然可以通过执行“getent passwd”或“cat /etc/passwd”来查看用户所在的位置。
“chmod 640 /etc/passwd /etc/group”安全吗?什么可能会破坏?运行 Ubuntu 20.04 或 22.04。
在研究与容器共享 PID 命名空间时,我注意到一些我不明白的有趣的事情。当容器与主机共享 PID 命名空间时,某些进程的环境变量会受到保护,而其他进程则不会。
我们以mysql为例。我将启动一个带有环境变量集的容器:
ubuntu@sandbox:~$ docker container run -it -d --env MYSQL_ROOT_PASSWORD=SuperSecret mysql
551b309513926caa9d5eab5748dbee2f562311241f72c4ed5d193c81148729a6
Run Code Online (Sandbox Code Playgroud)
我将启动另一个共享主机 PID 命名空间的容器并尝试访问该environ文件:
ubuntu@sandbox:~$ docker container run -it --rm --pid host ubuntu /bin/bash
root@1c670d9d7138:/# ps aux | grep mysql
999 18212 5.0 9.6 2006556 386428 pts/0 Ssl+ 17:55 0:00 mysqld
root 18573 0.0 0.0 2884 1288 pts/0 R+ 17:55 0:00 grep --color=auto mysql
root@1c670d9d7138:/# cat /proc/18212/environ
cat: /proc/18212/environ: Permission denied
Run Code Online (Sandbox Code Playgroud)
有些东西阻止了我读取环境变量的访问。我发现我需要CAP_SYS_PTRACE在容器中读取它:
ubuntu@sandbox:~$ docker container run -it --rm --pid host --cap-add …Run Code Online (Sandbox Code Playgroud)