Tại sao đôi khi chuyển hướng (>) không hoạt động nhưng nối thêm (>>) thì không?


7

Trong khi học về RHCE, tôi đã gặp một tình huống mà chuyển hướng stdin không hoạt động 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

Tuy nhiên, điều này hoạt động:

# 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

Tại sao điều này là trường hợp?

Cập nhật lần 1:

Quyền:

# ls -ld /tmp
drwxrwxrwt. 8 root root 4096 Jul 17 15:27 /tmp

ACL (không phải là gắn ACL mà chỉ trong trường hợp):

# getfacl /tmp
getfacl: Removing leading '/' from absolute path names
# file: tmp
# owner: root
# group: root
# flags: --t
user::rwx
group::rwx
other::rwx

Và tôi đang thực hiện tất cả các lệnh như root(do đó dấu nhắc băm).

Cập nhật lần 2

Per Caleb, danh sách quyền đầy đủ của /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

Cập nhật lần 3:

Mỗi Hello71:

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

Trả lời câu hỏi của Gilles:

Đây có phải là thứ bạn đọc trong một cuốn sách, hoặc bạn đã đạt đến tình huống này trên một chiếc máy thực sự?

Nhận thấy điều này trong khi thực hiện một phòng thí nghiệm trong một cuốn sách trên một máy thật.

Là Selinux đang sử dụng?

# sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 24
Policy from config file:        targeted

Một số ảo hóa Linux trên Linux?

Đúng. KVM / QEMU khách.

Tôi yêu cầu thứ hai của Hello71, ngoại trừ vui lòng grep / tmp / Proc / mounts

Không có gì phù hợp.

Ngoài ra env | xin vui lòng grep '^ LD_'.

Không có gì phù hợp.

Ồ, và chúng ta có thể loại trừ các cuộc tấn công hoạt động

Vâng, chúng tôi có thể. Tôi là người duy nhất có quyền truy cập vào khách này.


Bạn có thể cho chúng tôi đầu ra của ls -al/ tmp và /tmp/users.txt không?
Caleb

Chỉ cần thêm filelệnh trước và sau khi chuyển hướng IO. Như vậy đã đủ chưa?
Belmin Fernandez

Vui lòng cung cấp cho chúng tôi chế độ xem đầy đủ của thư mục.
Caleb

Thêm vào đó bây giờ. Tôi bối rối như thế nào sẽ có liên quan. Bạn có thể giải thích được không?
Belmin Fernandez

mount | grep /tmp?
Hello71

Câu trả lời:


2

Đây có thể là lỗi trong chính sách của SELinux liên quan đến semanagenhị phân (có bối cảnh riêng semanage_t) và /tmpthư mục, cũng có bối cảnh riêng - tmp_t.

Tôi đã có thể tái tạo các kết quả gần như tương tự trên CentOS 5.6 của mình.

# tập tin /tmp/users.txt 
/tmp/users.txt: ERROR: không thể mở `/tmp/users.txt '(Không có tệp hoặc thư mục như vậy)
# đăng nhập semanage -l> /tmp/users.txt
# tập tin /tmp/users.txt 
/tmp/users.txt: trống
# đăng nhập semanage -l >> /tmp/users.txt
# tập tin /tmp/users.txt 
/tmp/users.txt: trống

Khi tôi cố gắng sử dụng tập tin trong thư mục khác, tôi nhận được kết quả bình thường

# tập tin /root/users.txt
/root/users.txt: ERROR: không thể mở `/root/users.txt '(Không có tệp hoặc thư mục như vậy)
# đăng nhập semanage -l> /root/users.txt
# tập tin /root/users.txt
/root/users.txt: văn bản ASCII

Sự khác biệt giữa /tmp/rootlà bối cảnh của họ

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

Và cuối cùng, sau khi cố gắng chuyển hướng vào tập tin, /tmptôi đã gặp phải lỗi sau/var/log/audit/audit.log

type = AVC dir = aud (1310971817.808: 163242): avc: bị từ chối {write} cho 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 t class = file
type = AVC dir = aud (1310971838.888: 163255): avc: bị từ chối {append} cho 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 t class = file

Lưu ý thú vị: chuyển hướng semanageđầu ra sang đường ống hoạt động tốt

#semanage đăng nhập -l | tee /tmp/users.txt> /tmp/users1.txt
# tập tin /tmp/users.txt 
/tmp/users.txt: văn bản ASCII
# tập tin /tmp/users1.txt 
/tmp/users1.txt: văn bản ASCII

2
Điều đó không giải thích tại sao nối thêm hoạt động, nhưng cắt ngắn không. Nếu việc ghi đang bị từ chối, thì hãy nối lại vẫn để trống tệp.
psusi

Trên hệ thống của tôi chắp thêm không hoạt động quá. Điều này có thể được giải thích bằng sự khác biệt trong các chính sách của SELinux giữa CentOS của tôi và hệ thống gốc.
AlexD
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.