なぜ時々リダイレクト(>)は機能しませんが、追加(>>)は機能しますか?

なぜ時々リダイレクト(>)は機能しませんが、追加(>>)は機能しますか?

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

3番目のアップデート:

Hello71によると:

# mount | grep /tmp
# mount | grep -w '/'
/dev/mapper/vg_svr-tap-lv_root on / type ext4 (rw)

Gillesの質問に対する答え:

本で読んだ内容ですか、それとも実際のデバイスでこれが発生しましたか?

私は実際のマシンで本に出てくる実験を実行している間にこれを見つけました。

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ゲスト。

grep /tmp /proc/mountsを除き、Hello71からの要求に同意します。

一致するものはありません。

また環境grep '^LD_'と入力してください。

一致するものはありません。

ああ、積極的な攻撃を排除できますか?

私たちはできます。私はこのゲストにアクセスできる唯一の人です。

答え1

semanageこれはおそらく、バイナリ(独自のコンテキストがあるsemanage_t)と/tmpディレクトリ(独自のコンテキストがある)に関するSELinuxポリシーのバグですtmp_t

CentOS 5.6でもほぼ同じ結果を再現できました。

#file/tmp/users.txt
/tmp/users.txt: エラー: '/tmp/users.txt' を開くことができません (該当するファイルやディレクトリはありません)。
# semanage login -l > /tmp/users.txt
#file/tmp/users.txt
/tmp/users.txt: 空
# semanage login -l >> /tmp/users.txt
#file/tmp/users.txt
/tmp/users.txt: 空

別のディレクトリのファイルを使用しようとすると、正常な結果が表示されます。

#file/root/users.txt
/root/users.txt: エラー: '/root/users.txt' を開くことができません (該当するファイルやディレクトリはありません)。
# semanage login -l > /root/users.txt
#file/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 ルート system_u:object_r:tmp_t /tmp/

最後に、ファイルにリダイレクトしようとした後、/tmp次のエラーが発生しました。/var/log/audit/audit.log

type=AVC msg=audit(1310971817.808:163242): avc:deny{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=ファイル
type=AVC msg=audit(1310971838.888:163255): avc: pid=11372 comm="semanage" path="/tmp/users.txt" dev=d の {append} 拒否
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
#file/tmp/users.txt
/tmp/users.txt: ASCII テキスト
#file/tmp/users1.txt
/tmp/users1.txt: ASCII テキスト

関連情報