Linux
為什麼重定向(>)有時不起作用,而附加(>>)卻可以?
在學習 RHCE 時,我遇到了 stdin 重定向不起作用的情況
bash
:# file /tmp/users.txt /tmp/users.txt: cannot open `/tmp/users.txt' (No such file or directory) # semanage login -l > /tmp/users.txt # file /tmp/users.txt /tmp/users.txt: empty
但是,這有效:
# file /tmp/users.txt /tmp/users.txt: cannot open `/tmp/users.txt' (No such file or directory) # semanage login -l >> /tmp/users.txt # file /tmp/users.txt /tmp/users.txt: ASCII text
為什麼會這樣?
第一次更新:
權限:
# ls -ld /tmp drwxrwxrwt. 8 root root 4096 Jul 17 15:27 /tmp
ACL(不是 ACL 掛載,但以防萬一):
# getfacl /tmp getfacl: Removing leading '/' from absolute path names # file: tmp # owner: root # group: root # flags: --t user::rwx group::rwx other::rwx
而且我正在執行所有命令
root
(因此是雜湊提示)。第二次更新
根據 Caleb,完整權限列表
/tmp
:# ls -al /tmp total 40 drwxrwxrwt. 8 root root 4096 Jul 17 15:37 . dr-xr-xr-x. 26 root root 4096 Jul 17 15:07 .. drwx------. 2 melmel melmel 4096 Jul 16 21:08 .esd-500 drwxrwxrwt. 2 root root 4096 Jul 17 15:07 .ICE-unix drwx------. 2 gdm gdm 4096 Jul 17 15:08 orbit-gdm drwx------. 2 gdm gdm 4096 Jul 17 15:07 pulse-5E9i88IGxaNh drwx------. 2 melmel melmel 4096 Jul 16 21:08 pulse-329qCo13Xk -rw-------. 1 root root 0 Jul 16 14:32 tmpXd9THg -rw-------. 1 root root 0 Jul 16 12:55 tmpie0O98 -rw-------. 1 root root 0 Jul 16 20:23 tmpr10LrK -r--r--r--. 1 root root 11 Jul 17 15:07 .X0-lock drwxrwxrwt. 2 root root 4096 Jul 17 15:07 .X11-unix -rw-r--r--. 1 root root 865 Jul 16 20:20 yum.conf.security -rw-------. 1 root root 0 Jul 10 14:57 yum.log
第三次更新:
根據 Hello71:
# mount | grep /tmp # mount | grep -w '/' /dev/mapper/vg_svr-tap-lv_root on / type ext4 (rw)
吉爾斯問題的答案:
這是您在書中讀到的內容,還是您在真機上遇到過這種情況?
在真機上執行一本書中的實驗時注意到了這一點。
正在使用 SELinux 嗎?
# sestatus SELinux status: enabled SELinuxfs mount: /selinux Current mode: enforcing Mode from config file: enforcing Policy version: 24 Policy from config file: targeted
一些 Linux-on-Linux 虛擬化?
是的。KVM/QEMU 來賓。
我第二個 Hello71 的請求,除了請 grep /tmp /proc/mounts
沒有什麼匹配的。
還有環境 | 請 grep ‘^LD_’。
沒有什麼匹配的。
哦,我們可以排除主動攻擊嗎
我們可以。我是唯一可以訪問此客人的人。
它可能是 SELinux 政策中關於
semanage
二進制(有自己的上下文semanage_t
)和/tmp
目錄的錯誤,它也有自己的上下文 -tmp_t
。我能夠在我的 CentOS 5.6 上重現幾乎相同的結果。
# 文件 /tmp/users.txt /tmp/users.txt:錯誤:無法打開`/tmp/users.txt'(沒有這樣的文件或目錄) # semanage login -l > /tmp/users.txt # 文件 /tmp/users.txt /tmp/users.txt:空 # semanage login -l >> /tmp/users.txt # 文件 /tmp/users.txt /tmp/users.txt:空
當我嘗試使用不同目錄中的文件時,我得到了正常結果
# 文件 /root/users.txt /root/users.txt: 錯誤: 無法打開 `/root/users.txt' (沒有這樣的文件或目錄) # semanage login -l > /root/users.txt # 文件 /root/users.txt /root/users.txt:ASCII 文本
/tmp
和之間的區別/root
是它們的上下文#ls -Zd /root / drwxr-x--- root root root:object_r:user_home_dir_t /root/ #ls -Zd/tmp/ drwxrwxrwt root root system_u:object_r:tmp_t /tmp/
最後,在嘗試重定向到文件後,
/tmp
我遇到了以下錯誤/var/log/audit/audit.log
type=AVC msg=audit(1310971817.808:163242):avc: denied { write } for pid=10782 comm="semanage" path="/tmp/users.txt" dev=dm -0 ino=37093377 scontext=user_u:system_r:semanage_t:s0 tcontext=user_u:object_r:tmp_t:s0 tclass=file type=AVC msg=audit(1310971838.888:163255):avc: denied { append } for pid=11372 comm="semanage" path="/tmp/users.txt" dev=d m-0 ino=37093377 scontext=user_u:system_r:semanage_t:s0 tcontext=user_u:object_r:tmp_t:s0 tclass=file
有趣的說明:將
semanage
輸出重定向到管道可以正常工作#semanage 登錄 -l | 三通 /tmp/users.txt > /tmp/users1.txt # 文件 /tmp/users.txt /tmp/users.txt:ASCII 文本 # 文件 /tmp/users1.txt /tmp/users1.txt:ASCII 文本