Làm thế nào để chạy một lệnh liên quan đến chuyển hướng hoặc đường ống với sudo?


60

Tôi đang cố gắng làm theo những gì tôi cho là cách sử dụng sudo tốt nhất thay vì tài khoản root.

Tôi đang chạy một hoạt động tập tin concat đơn giản như:

sudo echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

Điều này không thành công ở bên phải của ">>" nó đang chạy như người dùng bình thường. Việc thêm sudos cũng không thành công (hành vi dự kiến ​​kể từ khi chuyển sang lệnh sudo và không vào tệp).

Ví dụ chỉ có vậy nhưng nó đã được xác minh và thử nghiệm dưới tài khoản root.

Câu trả lời:


75

Bạn có thể gọi một shell mới là root:

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Bạn cũng có thể nâng cao một quy trình để ghi vào tệp:

sudo tee -a /etc/conf.d/hwclock > /dev/null << EOF
clock_hctosys="YES"
EOF

8
Nói chung, tùy chọn thứ hai an toàn hơn vì chỉ các teelệnh chạy dưới quyền root, không phải lệnh chính có thể phức tạp và dễ bị sai. (không phải trường hợp echo)
pabouk

19

Một lựa chọn khác, không kém phần an toàn, là sử dụng sudo's -ichuyển sang đăng nhập như là root:

$ sudo -i
# echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Điều này vẫn tuân theo các quy tắc thực hành tốt nhất vì tài khoản root không thực sự được kích hoạt như vậy nhưng cho phép bạn thực hiện mọi việc như root một cách an toàn. Từ man sudo:

The -i (simulate initial login) option runs the shell
    specified by the password database entry of the target user
    as a login shell.  This means that login-specific resource
    files such as .profile or .login will be read by the shell.
    If a command is specified, it is passed to the shell for
    execution via the shell's -c option.  If no command is
    specified, an interactive shell is executed. 

Một cách khác làsudo bash
starbeamrainbowlabs

11

Nếu bạn thể hiện lệnh của mình mà không có dấu ngoặc đơn, bạn có thể đặt nó bên trong dấu ngoặc đơn và thực hiện lệnh đó thông qua lớp vỏ trung gian.

Để thực hiện điều này như root:

echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

Viết lệnh theo một cách khác mà không sử dụng ':

echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock

Sau đó gọi sudo sh -c …:

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Ngoài ra, để ghi đầu ra vào một tệp mà chỉ root mới có thể ghi vào, gọi sudo tee. Vượt qua -atùy chọn để teenối vào tệp đích, nếu không tệp bị cắt ngắn.

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

Để biết thêm sửa đổi tập tin phức tạp, bạn có thể gọi sudo sed, sudo ed, sudo perl, ...

Ngoài ra, sử dụng một trình soạn thảo phong nha và làm cho nó gọi sudo. Trong Emacs, mở /sudo:/etc/conf.d/hwclock. Trong Vim, gọi :w !sudo tee %để ghi vào tệp đã mở dưới dạng root hoặc sử dụng plugin sudo.vim . Hoặc đi từ cuối sudo và gọi sudoedit /etc/conf.d/hwclock.

Hoặc bạn có thể nhượng bộ mặt tối và chạy shell như root.

$ sudo -i
# echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

5

Lệnh không thành công do các quyền trên tệp được chuyển hướng đến. Việc chuyển hướng xảy ra ngay cả trước khi sudolệnh được gọi.

Bạn sẽ phải đảm bảo rằng đó là root thực sự mở tệp để viết.

Cách đơn giản nhất để làm điều đó:

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

echothể được chạy như người dùng thông thường vì nó chỉ tạo ra một chuỗi văn bản. Các teetiện ích sẽ phải chạy với quyền root mặc dù, và tee -asẽ nối dữ liệu. Chúng tôi chuyển hướng đầu ra đến /dev/nullbởi vì teetheo mặc định, sẽ sao chép dữ liệu đầu vào của nó thành đầu ra tiêu chuẩn của nó ngoài việc ghi vào các tệp được chỉ định.

Với bashhoặc bất kỳ shell nào hiểu "chuỗi-đây":

sudo tee -a /etc/conf.d/hwclock >/dev/null <<<'clock_hctosys="YES"'

Điều này là giống hệt nhau ở trên. Chỉ có cách chúng tôi sản xuất chuỗi được thay đổi.


Một cách khác, hơi vòng vo để làm điều đó:

sudo sh -c 'echo clock_hctosys=\"YES\" >>/etc/conf.d/hwclock'

Ở đây, sự chuyển hướng xảy ra trong một sh -cvỏ con chạy dưới quyền root.


4

sudo dd of=

Để thêm như bạn muốn:

echo inbytes | sudo dd of=outfile oflag=append conv=notrunc

hoặc để tạo lại tập tin từ đầu:

echo inbytes | sudo dd of=outfile

Ưu điểm:

  • đẹp hơn teetừ khi không /dev/nullchuyển hướng
  • đẹp hơn shvì không có subshell
  • ddcó nhiều tùy chọn mạnh mẽ, ví dụ status=progressđể xem tiến trình chuyển

Hoạt động vì sudo chuyển stdin cho lệnh.

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.