Linux

為什麼重定向(>)有時不起作用,而附加(>>)卻可以?

  • May 4, 2015

在學習 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 文本

引用自:https://unix.stackexchange.com/questions/16845