Việc chuyển hướng đầu ra được thực hiện bởi trình bao mà lệnh đã được gọi . Vì vậy, chia mọi thứ thành bit, đây là những gì đang xảy ra *:
shell invokes sudo echo "options drm_kms_helper poll=N"
, thực thi sudo
lệnh với echo "options drm_kms_helper poll=N"
dòng lệnh
sudo yêu cầu nhập mật khẩu, mở shell superuser và gọi echo "options drm_kms_helper poll=N"
, chạy echo
lệnh truyền nó"options drm_kms_helper poll=N"
echo, chạy với root
đặc quyền, in chuỗi thành đầu ra tiêu chuẩn của nó.
echo
lệnh chấm dứt, thoát superuser shell, sudo
chấm dứt
shell mà lệnh đã được gọi sẽ thu thập đầu ra và cố gắng chuyển hướng nó tới /etc/modprobe.d/local.conf
, chỉ có thể ghi được bằng root. Nó bị lỗi "cho phép từ chối".
Để biết cách khắc phục, hãy xem @shantanu trả lời.
(*) - trong khi trình tự nêu trên giúp chúng ta hiểu tại sao lệnh thất bại, trong thực tế sự việc xảy ra hơi out-of-trật tự: vỏ gốc thông báo chuyển hướng và cố gắng để mở tập tin cho văn bản trước khi viện dẫn sudo ...
lệnh. Khi mở tệp không thành công, shell thậm chí không gọi lệnh được cho là ghi vào tệp (cảm ơn @PanosRontogianni vì đã chỉ ra điều này).
Đây là một bài kiểm tra nhanh:
$ touch ./onlyroot.txt
$ sudo chown root:root ./onlyroot.txt
$ sudo bash -c "whoami | tee who.txt" > onlyroot.txt
bash: onlyroot.txt: Permission denied
Trong thử nghiệm ở trên, chúng whoami | tee who.txt
ta sẽ tạo một tệp có tên who.txt
chứa từ "root". Tuy nhiên, khi chuyển hướng đầu ra không thành công trong vỏ gọi, tệp "who.txt" cũng bị thiếu do lệnh không được gọi.
saji@laptop:~$ sudo echo "Hi" [sudo] password for saji: Hi