Sử dụng sudo su cho các lệnh?


15

Tôi đã làm việc để phát triển các kỹ năng dòng lệnh của mình đêm qua và gặp phải một vấn đề khi tôi sử dụng sudo, tôi nhận được một thông báo lỗi cho biết 'quyền bị từ chối'. Tuy nhiên khi tôi sử dụng 'sudo su' và trở thành root thì lệnh đã hoạt động.

Tại sao sudo không hoạt động trong trường hợp đầu tiên?

Đó là:

$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D

Từ phiên bản Linux Kinh Thánh 2010 trong phần thiết lập máy chủ LAMP.


Nếu bạn không đưa ra một ví dụ thì thật khó để giải quyết vấn đề.
LassePoulsen

1
Cân nhắc sudo -shơn sudo su.
Jeremy L

Câu trả lời:


18

<,> Và >> được sử dụng để chuyển hướng đầu vào / đầu ra cho các lệnh - là một tính năng được cung cấp bởi trình bao (ví dụ: bash). Vì vậy, nếu bạn gõ một lệnh như thế sudo cat > /var/www/info.phpthì shell nhận được điều này khi đầu vào cố gắng mở tệp /var/www/info.phpvà cung cấp tệp đó làm đầu ra tiêu chuẩn cho sudolệnh. Các sudolệnh là không hề biết dù sản lượng của nó đang đi đến một giao diện điều khiển hoặc chuyển hướng đến một tập tin, vì đây được đưa về chăm sóc bằng vỏ mà gọi nó.

Nếu shell bạn nhập lệnh của bạn vào là shell đăng nhập của bạn hoặc shell khác chạy trong một thiết bị đầu cuối với id người dùng của bạn, thì nó có các đặc quyền giống như id người dùng của bạn - không phải là root.

Vì vậy, trong trường hợp của bạn, trong khi lệnh cat được thực thi như root, việc sao chép đầu ra của nó /var/www/info.phpđược cố gắng bởi shell chạy như một người dùng bình thường, như mong đợi, thất bại.

Một cách giải quyết cho các tình huống như vậy là sử dụng teelệnh:

sudo tee /var/www/info.php

Điều đó sẽ có tác dụng dự định là đưa tất cả văn bản được nhập vào bàn điều khiển lên tới ^ D vào tệp được chỉ định làm tham số.

Một hiệu ứng phụ không mong muốn là nó teecũng sẽ lặp lại đầu ra cho thiết bị xuất chuẩn, vì vậy sau khi bạn nhập từng dòng và nhấn enter teesẽ xuất ra một bản sao của nó. Để tránh điều này, bạn có thể sử dụng các biến thể sau đây.

sudo tee /var/www/info.php > /dev/null

Thông tin chi tiết về teecó thể có thông qua info teetại một thiết bị đầu cuối.


2

sudo không hoạt động đối với các lệnh cần quyền để ghi tệp, chẳng hạn như:

sudo echo "vm.swappines = 100" >> /etc/sysctl.conf

Nó giải thích trong trang sudo man.


4
Đề cập rằng bạn có thể "sudo -i" hoặc "sudo -s" để nhận được một dấu nhắc gốc sẽ làm cho câu trả lời này thậm chí còn tốt hơn!
Jorge Castro

Không có đường ống trong lệnh ví dụ; có sự chuyển hướng Ngoài ra, "đôi khi không hoạt động" dường như truyền đạt hành vi không ổn định bằng cách sudo. Như đã lưu ý trong câu trả lời của koushik, hành vi này khá dễ đoán, nhất quán và "chính xác" đối với mô hình cấp phép unix.
msw

2

Vấn đề là phần "> foo.txt" được thông dịch và thực thi bởi trình thông dịch lệnh (shell) của bạn rất lâu trước khi lệnh sudo đang được chạy. Lệnh sudo không có ý tưởng rằng bạn muốn chuyển hướng đầu ra của nó sang một tệp.

Trình thông dịch lệnh của bạn không có quyền root (nhưng lệnh sudo cuối cùng sẽ muộn hơn) vì vậy nó không thể chuyển hướng đầu ra sang foo.txt.


1

Một cách khác để giải quyết vấn đề này là bắt đầu một subshell với sudo và thực thi lệnh đó trong subshell đó:

$ sudo bash -c "cat > /var/www/info.php"
<?php
phpinfo( ) ;
? >
^D

ở đây, lệnh "has sudo" là bash và bất cứ thứ gì được thực thi trong nó đều có quyền root.

$ 2c, * giống 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.