su vs sudo -s vs sudo -i vs sudo bash


89

Sự khác biệt giữa các lệnh sau là gì:

su
sudo -s
sudo -i
sudo bash

Tôi biết vì sutôi cần biết mật khẩu gốc, và vì sudotôi phải ở trong sudoerstệp, nhưng một khi đã thực hiện thì có gì khác biệt?

Tôi biết có một sự khác biệt giữa susudo -sbởi vì thư mục chính của tôi là /rootsau khi tôi thực thi su, nhưng thư mục chính của tôi vẫn còn /home/mynamesau đó sudo -s. Nhưng tôi nghi ngờ đây chỉ là một triệu chứng của một sự khác biệt tiềm ẩn mà tôi đang thiếu.


3
Tôi thích sử dụng 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.
Jens Timmerman

Câu trả lời:


114

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 suvớ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 đó. :)

  • sudorấ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 dumptarmỗ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 -shoặc sudo bashkhả 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 đó suhọ đã 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 vivà 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, sudocô 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. sudocho 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 bashsudo -s-sngắ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:

  1. Bạn có thể nói sudo -s some-commandcái nào chạy some-commanddưới vỏ của bạn. Về cơ bản nó là tốc ký sudo $SHELL -c some-command.

  2. 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 sudocuộc gọi, tránh việc phải gõ sudoliên tục.

Cả hai hành vi đó là tùy chọn. Thông thường hơn, bạn cung cấp -smộ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 SHELLbiế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 -skế 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 -isudo -snhư su -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 -ian 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 PAGERnếu bạn nói man footrong 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 sudochươ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.

sudo -icũ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 -scho 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 đã cdvào khi bạn chạy sudo. Dù vậy, nó vẫn an toàn hơn sudo -icdtrở lại nơi bạn đang ở.


2
Bạn có ý nghĩa gì khi 'bóc ra khỏi vi'?
crisron

11
@crisron: Từ bên trong vi, nhập :shvà nhấn Enter. Bây giờ bạn đang ở trong một vỏ phụ, với tất cả các đặc quyền của viquá trình sinh ra lớp vỏ đó. Nếu viđang chạy với quyền root, thì shell cũng vậy. Hoặc, bạn có thể chạy một cái gì đó không phải là shell thông qua :!cmd, đọc đầu ra từ lệnh vào bộ đệm chỉnh sửa thông qua :r !cmd, v.v. Nếu tất cả những cái đó bị khóa, Makefilemục tiêu là các kịch bản shell và Vim có :makelệnh, cho phép bạn chạy shell tùy ý kịch bản từ bên trong trình soạn thảo. Các khả năng cho sự nghịch ngợm là quá lớn đối với hộp bình luận này để giữ.
Warren Young

2
nếu ai đó có thể đặt giả trong bash của bạn thì ai đó có thể đặt sudo giả trong PATH của bạn. để thực sự chắc chắn rằng bạn phải gọi sudo bằng đường dẫn đầy đủ:/usr/bin/sudo
lesmana

1
@lesmana: Tôi đã giải quyết điều đó trong một chỉnh sửa; về cơ bản, PATHđây không phải là vấn đề duy nhất.
Warren Young

6
Giải thích tuyệt vời; rất đau đầu khi đọc nó.
lobi

27

Từ một bài đăng ubuntuforums tôi đã thực hiện một lúc trước:

Hãy xem xét thí nghiệm sau:

applic@ion:~% sudo su
[sudo] password for applic:
root@ion:/home/applic# env > /tmp/sudo_su_env
root@ion:/home/applic# exit
exit
applic@ion:~% sudo -s
applic .bashrc read...
root@ion:~% env >/tmp/sudo_s

Dưới đây là những khác biệt tôi tìm thấy:

Với sudo -s:

HOME=/home/applic
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
reads $USER's ~/.bashrc

Với sudo su:

HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
reads /etc/environment
reads /root/.bashrc

Lưu ý sự khác biệt trong $HOME. Việc root và $HOMEđặt ở nhà người dùng bình thường có thể gây ra sự cố. Ví dụ: nếu bạn chạy một ứng dụng đồ họa, người dùng bình thường ~/.Xauthoritycó thể bị ghi đè bằng root. Điều này gây ra các vấn đề người dùng bình thường sau này như không thể chạy các ứng dụng đồ họa nhất định thông qua cron.

Để tóm tắt:

                                     corrupted by user's 
        HOME=/root  uses root's PATH     env vars
sudo -i     Y       Y[2]                 N
sudo -s     N       Y[2]                 Y
sudo bash   N       Y[2]                 Y
sudo su     Y       N[1]                 Y
  1. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games có lẽ được thiết lập bởi /etc/environment
  2. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Điểm mấu chốt là sudo -ilệnh thích hợp để chạy khi bạn muốn một vỏ gốc không được phát hiện bởi môi trường của người dùng.


1
Bao nhiêu môi trường 'bị ô nhiễm' cũng phụ thuộc vào cấu hình của sudo(trong /etc/sudoersvà các tệp liên quan). Thiết lập cấu hình như always_set_home, env_reset, env_keep, env_checkenv_reset, và chúng có thể thay đổi tùy theo người sử dụng và lệnh. Xem phần 'Môi trường lệnh' và phần TÙY CHỌN SUDOERS của trang chủ sudoers (5) .
Curt J. Sampson

Cá nhân, tôi đi cùng sudo -Hskhi tôi muốn một môi trường không được làm sáng tỏ bởi cài đặt của mình, vì tôi sử dụng zsh và tất cả các tài khoản ứng dụng mà tôi có thể đang thay đổi để sử dụng bash. Điều này không cho phép một số biến môi trường nhất định vượt qua, nhưng tôi thường tìm thấy các biến quan trọng bị ghi đè bởi /etc/profile.d/*.
Ed Grimm

7

su( s witch u ser hoặc s ubstolarship u ser) cho phép bạn chuyển người dùng. suvề cơ bản bắt đầu một thể hiện shell khác với các đặc quyền của người dùng dự định. Theo mặc định, nó chuyển bạn sang rootngười dùng, nếu chúng tôi muốn chuyển người dùng cụ thể, chúng tôi cần chuyển người dùng như sau:

$ su bob  # switches to bob (requires bob's password)

su -có nghĩa là các biến môi trường sẽ được đặt lại thành root và sucó nghĩa là các biến môi trường như người dùng cũ.

ví dụ: thư mục gốc của root nếu bạn sử dụng su -hoặc thư mục gốc của người dùng cũ nếu bạn sử dụng su.

sudo ( s uper u ser do ) là một tiện ích dòng lệnh cho phép người dùng chạy các chương trình với các đặc quyền bảo mật của người dùng khác, theo mặc định là superuser tức là root. Nó sử dụng tệp cấu hình /etc/sudoersliệt kê những người dùng có quyền đối với các hành động cụ thể

sudo nên được đọc là / ˈsuːduː / . cú pháp sudo commandtức là s witch u ser và thực hiện lệnh này.

  • sutương đương sudo -ivà mô phỏng đăng nhập vào tài khoản root. Thư mục làm việc của bạn sẽ là /root, và nó sẽ đọc root, .profilev.v. Dấu nhắc sẽ thay đổi từ $ thành #, cho biết bạn có quyền truy cập root.

  • sudo -s khởi chạy một shell như root, nhưng không thay đổi thư mục làm việc của bạn.

  • sudo bash nơi bashlà lệnh để chạy với sudo. Lệnh này chạy bashnhư một siêu người dùng.

  • Sử dụng sudocó thể được ghi lại tất cả mọi thứ ai đó làm.
  • Việc sử dụng sudongăn người dùng phải biết mật khẩu root.
  • Sử dụng sudochúng ta có thể giới hạn các lệnh được phép chạy.
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.