我需要在Linux中记录所有终端命令。我在C中找到了正确的工作库,但它只在我运行LD_PRELOAD=/usr/local/bin/bashpreload.so /bin/bash
时才有效:
# ldd /bin/bash
linux-vdso.so.1 => (0x00007ffef59f8000)
/usr/local/bin/bashpreload.so (0x00007fe691323000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fe691102000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fe690efe000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe690b6a000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe691524000)
如果我在此之后再次登录系统,我将不会看到带有ldd的lib:
[root@XXX ~]# LD_PRELOAD=/usr/local/bin/bashpreload.so /bin/bash
[root@XXX ~]# ldd /bin/bash
linux-vdso.so.1 => (0x00007ffe481f6000)
/usr/local/bin/bashpreload.so (0x00007f3f1b808000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f3f1b5e7000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f3f1b3e3000)
libc.so.6 => /lib64/libc.so.6 (0x00007f3f1b04f000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3f1ba09000)
[root@XXX ~]# exit
[root@XXX ~]# logout
Connection to XXX closed.
[sahaquiel@sahaquiel-PC ~]$ ssh root@XXX
root@XXX's password:
Last login: Tue Dec 19 11:28:22 2017 from YYY
[root@XXX ~]# ldd /bin/bash
linux-vdso.so.1 => (0x00007ffca2f98000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f19a13ff000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f19a11fb000)
libc.so.6 => /lib64/libc.so.6 (0x00007f19a0e67000)
/lib64/ld-linux-x86-64.so.2 (0x00007f19a1620000)
还有一个麻烦:如果我使用这个库,我当前的PID正在改变:
Last login: Tue Dec 19 11:28:54 2017 from YYY
[root@XXX ~]# echo "Library is not uploaded"
Library is not uploaded
[root@XXX ~]# echo $$
4639
[root@XXX ~]# LD_PRELOAD=/usr/local/bin/bashpreload.so /bin/bash
[root@XXX ~]# echo $$
4654
[root@212-24-57-104 ~]# ps awwufx | grep -B5 [4]654
root 1706 0.0 0.0 66256 1192 ? Ss 10:54 0:00 /usr/sbin/sshd
root 4517 0.0 0.0 104636 4644 ? Ss 11:27 0:00 \_ sshd: root@pts/1
root 4519 0.0 0.0 108320 1872 pts/1 Ss+ 11:27 0:00 | \_ -bash
root 4637 0.0 0.0 104636 4624 ? Ss 11:30 0:00 \_ sshd: root@pts/0
root 4639 0.0 0.0 108320 1872 pts/0 Ss 11:30 0:00 | \_ -bash
root 4654 0.0 0.0 110376 1956 pts/0 S 11:31 0:00 | \_ /bin/bash
所以,我需要两件事:
LD_PRELOAD
的方法;/bin/bash
过程中工作。谢谢!
这是一个经典的XY problem。您需要记录用户操作,确定解决方案,并询问有关该解决方案的问题。
即使解决方案不起作用。
因为使用LD_PRELOAD
库不是记录用户命令的可靠方法。
readonly
doesn't work。因为它只是用户控制的进程内存中的变量。LD_PRELOAD
设置为64位共享对象。现在每个32位程序都无法运行。如果您需要记录用户的操作,请使用旨在安全执行此操作的系统:auditing。
- 找到为每个登录用户安静地执行LD_PRELOAD的方法
您需要为所有用户设置共同点,例如/etc/profile
或/etc/environment
。有关更多选项/详细信息,请参阅How to set environment variable for everyone under my linux system?。
- 知道为什么在这之后我在child / bin / bash过程中工作。
这是直截了当的 - 每当你创建一个进程时,它的PID与它的父进程不同:)当你运行/bin/bash
时,你显然会创建另一个shell,这就是$$
不同的原因。这与LD_PRELOAD
无关。如果你在没有/bin/bash
的情况下运行LD_PRELOAD
,你会发现完全相同的行为。
如果有人需要和我一样:你可以在用户通过/etc/security/pam_env.conf
中的SSH登录之前添加环境变量,语法如下:
LD_PRELOAD DEFAULT= OVERRIDE="/usr/local/bin/bashpreload.so"