왜 때때로 리디렉션(>)은 작동하지 않지만 추가(>>)는 작동합니까?

왜 때때로 리디렉션(>)은 작동하지 않지만 추가(>>)는 작동합니까?

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)

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에서도 거의 같은 결과를 재현할 수 있었습니다.

# 파일/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: 비어 있음

다른 디렉터리의 파일을 사용하려고 하면 정상적인 결과가 나타납니다.

# 파일/루트/users.txt
/root/users.txt: 오류: '/root/users.txt'를 열 수 없습니다(해당 파일이나 디렉터리가 없습니다).
# semanage login -l > /root/users.txt
# 파일/루트/users.txt
/root/users.txt: ASCII 텍스트

/tmp와 의 차이점은 /root해당 컨텍스트입니다.

# ls -Zd /루트/
drwxr-x--- 루트 루트 루트: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
# 파일/tmp/users.txt
/tmp/users.txt: ASCII 텍스트
# 파일/tmp/users1.txt
/tmp/users1.txt: ASCII 텍스트

관련 정보