Với su
, bạn trở thành một người dùng khác - root theo mặc định, nhưng có khả năng là một người dùng khác. Nếu bạn nói su -
, môi trường của bạn cũng được thay thế bằng môi trường đăng nhập của người dùng đó, do đó những gì bạn thấy không thể phân biệt được khi đăng nhập với tư cách người dùng đó. Không có cách nào hệ thống có thể cho biết bạn làm gì trong khi su
với người dùng khác từ hành động của người dùng đó khi họ đăng nhập.
Mọi thứ rất khác với sudo
:
Các lệnh bạn chạy qua sudo
thực thi với tư cách là người dùng đích - theo mặc định, nhưng có thể thay đổi bằng -u
- nhưng nó ghi nhật ký các lệnh bạn chạy qua nó, gắn thẻ chúng với tên người dùng của bạn để có thể gán lỗi sau đó. :)
sudo
rất linh hoạt. Ví dụ, bạn có thể giới hạn các lệnh mà một người dùng hoặc nhóm người dùng nhất định được phép chạy. Với su
, đó là tất cả hoặc không có gì.
Tính năng này thường được sử dụng để xác định vai trò. Chẳng hạn, bạn có thể định nghĩa một nhóm "sao lưu" được phép chạy dump
và tar
mỗi nhóm cần truy cập root để sao lưu đúng cách vào đĩa hệ thống.
Tôi đề cập đến điều này ở đây bởi vì nó có nghĩa là bạn có thể cho ai đó sudo
đặc quyền mà không cần cho họ sudo -s
hoặc sudo bash
khả năng. Họ chỉ có quyền mà họ cần để thực hiện công việc của mình, trong khi đó su
họ đã chạy toàn bộ hệ thống. Tuy nhiên, bạn phải cẩn thận với điều này: nếu bạn cho ai đó khả năng nói sudo vi
, chẳng hạn, họ có thể thoát ra vi
và có sức mạnh tương tự như với sudo -s
.
Bởi vì nó lấy mật khẩu của sudoer thay vì mật khẩu gốc, sudo
cô lập quyền giữa nhiều sudoers.
Điều này giải quyết một vấn đề hành chính su
, đó là khi mật khẩu gốc thay đổi, tất cả những người phải biết sử dụng nó su
đều phải nói. sudo
cho phép mật khẩu của sudoers thay đổi độc lập. Trên thực tế, thông thường khóa mật khẩu tài khoản người dùng root trên một hệ thống sudo
để buộc tất cả các tác vụ sysadmin phải được thực hiện thông qua sudo
. Trong một tổ chức lớn có nhiều sudoers đáng tin cậy, điều này có nghĩa là khi một trong những sysadins rời đi, bạn không phải thay đổi mật khẩu gốc và phân phối nó cho những quản trị viên còn lại.
Sự khác biệt chính giữa sudo bash
và sudo -s
là -s
ngắn hơn và cho phép bạn truyền lệnh để thực thi trong trình bao mặc định của người dùng theo một số cách:
Bạn có thể nói sudo -s some-command
cái nào chạy some-command
dưới vỏ của bạn. Về cơ bản nó là tốc ký sudo $SHELL -c some-command
.
Thay vào đó, bạn có thể chuyển các lệnh đến đầu vào tiêu chuẩn của shell sudo -s < my-shell-script
. Bạn có thể sử dụng điều này với một di sản để gửi một số lệnh cho một sudo
cuộc gọi, tránh việc phải gõ sudo
liên tục.
Cả hai hành vi đó là tùy chọn. Thông thường hơn, bạn cung cấp -s
một mình, do đó, nó chỉ chạy vỏ người dùng của bạn một cách tương tác. Trong chế độ đó, nó khác với sudo bash
ở chỗ nó có thể chạy một lớp vỏ khác so với bash
, vì nó trông đầu tiên trong SHELL
biến môi trường, và sau đó nếu không được đặt, ở cài đặt vỏ đăng nhập của người dùng, thường là trong /etc/passwd
.
Shell chạy bằng sudo -s
kế thừa môi trường người dùng hiện tại của bạn. Nếu những gì bạn thực sự muốn là một môi trường sạch sẽ, như bạn nhận được ngay sau khi đăng nhập, thì điều bạn muốn thay vào đó là sudo -i
, một sự bổ sung tương đối gần đây sudo
. Nói đại khái, sudo -i
là sudo -s
như su -
là su
: nó reset tất cả ngoại trừ một vài biến môi trường trọng điểm và gửi cho bạn trở lại thư mục chính của người dùng. Nếu bạn cũng không cung cấp cho nó lệnh chạy dưới lớp vỏ đó thông qua đầu vào tiêu chuẩn hoặc sudo -i some-command
, nó sẽ chạy lớp vỏ đó như một vỏ đăng nhập tương tác, vì vậy các tập lệnh khởi động trình bao của người dùng của bạn (ví dụ .bash_profile
) sẽ được chạy lại.
Tất cả điều này làm cho sudo -i
an toàn hơn đáng kể hơn sudo -s
. Tại sao? Bởi vì nếu ai đó có thể sửa đổi môi trường của bạn trước đó sudo -s
, họ có thể khiến các lệnh ngoài ý muốn được thực thi. Trường hợp rõ ràng nhất là sửa đổi SHELL
, nhưng nó cũng có thể xảy ra ít trực tiếp hơn, chẳng hạn như thông qua PAGER
nếu bạn nói man foo
trong khi bên dưới sudo -s
.
Bạn có thể nói: "Nếu họ có thể sửa đổi PAGER
, họ có thể sửa đổi PATH
, và sau đó họ chỉ có thể thay thế một sudo
chương trình tà ác ", nhưng ai đó đủ hoang tưởng có thể nói /usr/bin/sudo /bin/bash
để tránh cái bẫy đó. Có lẽ bạn không hoang tưởng đến mức bạn cũng tránh được bẫy trong tất cả các biến môi trường dễ bị ảnh hưởng khác . Bạn có nhớ kiểm tra EDITOR
, ví dụ, trước khi chạy bất kỳ lệnh VCS nào không? Như vậy sudo -i
.
Vì sudo -i
cũng thay đổi thư mục làm việc của bạn thành thư mục chính của người dùng, bạn vẫn có thể muốn sử dụng sudo -s
cho những tình huống mà bạn biết bạn muốn ở lại cùng thư mục mà bạn đã cd
vào khi bạn chạy sudo
. Dù vậy, nó vẫn an toàn hơn sudo -i
và cd
trở lại nơi bạn đang ở.
sudo su -
theo cách này bạn không cần mật khẩu gốc và-
đảm bảo thư mục chính được đặt đúng.