为什么有时重定向 (>) 不起作用,但附加 (>>) 却起作用?

为什么有时重定向 (>) 不起作用,但附加 (>>) 却起作用?

在学习 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_'。

没有任何匹配。

哦,我们可以排除主动攻击吗

我们可以。我是唯一有权接触这位客人的人。

答案1

这可能是 SELinux 政策中关于semanage二进制文件(有自己的上下文semanage_t)和/tmp目录(也有自己的上下文)的 错误tmp_t

我能够在 CentOS 5.6 上重现几乎相同的结果。

# 文件/tmp/users.txt
/tmp/users.txt:错误:无法打开“/tmp/users.txt”(没有这样的文件或目录)
# semanage 登录 -l > /tmp/users.txt
# 文件/tmp/users.txt
/tmp/users.txt:空
# semanage 登录 -l >> /tmp/users.txt
# 文件/tmp/users.txt
/tmp/users.txt:空

当我尝试使用不同目录中的文件时,我得到了正常结果

# 文件/root/users.txt
/root/users.txt:错误:无法打开“/root/users.txt”(没有这样的文件或目录)
# semanage 登录 -l > /root/users.txt
# 文件/root/users.txt
/root/users.txt:ASCII 文本

/tmp和之间的区别/root是它们的上下文

# ls -Zd /根目录/
drwxr-x--- root root root:object_r:user_home_dir_t /root/
# ls -Zd /tmp/
drwxrwxrwt 根 根 system_u:object_r:tmp_t /tmp/

最后,在尝试重定向到文件后,/tmp我遇到了以下错误/var/log/audit/audit.log

类型=AVC msg=audit(1310971817.808:163242): avc:拒绝{写入} 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=文件
类型=AVC msg=audit(1310971838.888:163255): avc: 拒绝{追加} 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=文件

有趣的注意:将semanage输出重定向到管道工作正常

#semanage 登录 -l |三通 /tmp/users.txt > /tmp/user1.txt
# 文件/tmp/users.txt
/tmp/users.txt:ASCII 文本
# 文件/tmp/users1.txt
/tmp/users1.txt:ASCII 文本

相关内容