Có gì khác nhau giữa những thứ khác nhau, sự kiện của sudo -s,


148

Tôi đã đọc nó từ hướng dẫn nhưng tôi không thể thấy sự khác biệt ..

su - thay đổi ID người dùng hoặc trở thành siêu người dùng

sudo -s [command]

Các -s(vỏ) tùy chọn chạy vỏ xác định bởi các biến môi trường SHELL nếu nó được thiết lập hoặc vỏ theo quy định tại passwd (5). Nếu một lệnh được chỉ định, nó được chuyển đến shell để thực thi. Mặt khác, một vỏ tương tác được thực thi.

sudo -i mô tả biến mất trong hướng dẫn


7
Ngoài ra, không sử dụng su userđể đăng nhập từ vỏ không đáng tin cậy, nhưng su - user. Xem unix.stackexchange.com/q/7013/8250
Lekensteyn

@Lekensteyn wow, ví dụ tuyệt vời. thx cho LOL :)
törzsmókus

1
luôn luôn nhớ điều răn cũ: ngươi sẽ không yêu cầu tên gốc vô ích!
törzsmókus 30/1/2015

Không nói sudo -ilà xấu, nhưng bạn chắc chắn có thể sử dụng nó
Kolob Canyon

Câu trả lời:


118

Sự khác biệt chính giữa các lệnh này là ở cách chúng hạn chế quyền truy cập vào các chức năng của chúng.

su (có nghĩa là "người dùng thay thế" hoặc "người dùng chuyển đổi") - thực hiện chính xác điều đó, nó bắt đầu một phiên bản shell khác với các đặc quyền của người dùng đích. Để đảm bảo bạn có quyền làm điều đó, nó sẽ hỏi bạn mật khẩu của người dùng mục tiêu . Vì vậy, để trở thành root, bạn cần biết mật khẩu root. Nếu có một vài người dùng trên máy của bạn cần chạy các lệnh với quyền root, tất cả họ đều cần biết mật khẩu root - lưu ý rằng đó sẽ là cùng một mật khẩu. Nếu bạn cần thu hồi quyền quản trị viên từ một trong những người dùng, bạn cần thay đổi mật khẩu root và chỉ nói với những người cần giữ quyền truy cập - lộn xộn.

sudo (hmm ... những gì ghi nhớ? Siêu người dùng-DO?) là hoàn toàn khác nhau. Nó sử dụng tệp cấu hình (/ etc / sudoers) để liệt kê những người dùng nào có quyền đối với các hành động cụ thể (chạy các lệnh như root, v.v.) Khi được gọi, nó yêu cầu mật khẩu của người dùng đã khởi động nó - để đảm bảo người ở thiết bị đầu cuối thực sự là cùng một "joe" người được liệt kê trong /etc/sudoers. Để thu hồi đặc quyền quản trị viên từ một người, bạn chỉ cần chỉnh sửa tệp cấu hình (hoặc xóa người dùng khỏi một nhóm được liệt kê trong cấu hình đó). Điều này dẫn đến việc quản lý đặc quyền sạch hơn nhiều.

Do đó, trong nhiều hệ thống dựa trên Debian, rootngười dùng không có mật khẩu được đặt - tức là không thể đăng nhập trực tiếp bằng root.

Ngoài ra, /etc/sudoerscho phép chỉ định một số tùy chọn bổ sung - tức là người dùng X chỉ có thể chạy chương trình Y, v.v.

Kết hợp thường được sử dụng sudo suhoạt động như sau: trước tiên sudohỏi bạn mật khẩu của bạn và, nếu bạn được phép làm như vậy, hãy gọi lệnh tiếp theo ( su) là siêu người dùng. Bởi vì suđược gọi bởi root, nó không yêu cầu bạn nhập mật khẩu của người dùng đích. Vì vậy, sudo sucho phép bạn mở một shell như một người dùng khác (bao gồm cả root), nếu bạn cho phép siêu người dùng truy cập bằng /etc/sudoerstệp.


2
Tôi chưa bao giờ xem sulà "người dùng chuyển đổi", nhưng luôn luôn là siêu người dùng; hành vi mặc định không có tên người dùng của người khác (mặc dù nó có ý nghĩa). Từ wikipedia : "Lệnh su, còn được gọi là siêu người dùng [1] vào đầu năm 1974, cũng được gọi là" người dùng thay thế "," người dùng giả mạo "hoặc" người dùng thiết lập "vì nó cho phép thay đổi tài khoản được liên kết với hiện tại thiết bị đầu cuối (cửa sổ). "
dr jimbob

5
@dr jimbob: bạn nói đúng, nhưng tôi thấy rằng "người dùng chuyển đổi" là mô tả tốt hơn những gì nó làm - mặc dù trong lịch sử nó là viết tắt của "siêu người dùng". Tôi cũng rất vui khi thấy rằng bài viết trên wikipedia rất giống với câu trả lời của tôi - Tôi chưa bao giờ thấy bài viết này trước đây :)
Sergey

11
Ý nghĩa chính thức của "su" là "người dùng thay thế". Xem: "người đàn ông su".
Thiên thần O'Sphere

1
@ AngelO'Sphere: Thật thú vị, trang chủ của Ubuntu hoàn toàn không đề cập đến "thay thế". Trang chủ tại gnu.org ( gnu.org/software/coreutils/manual/html_node/su-invocation.html ) thực sự nói "su: Chạy lệnh với ID người dùng và nhóm thay thế". Tôi nghĩ gnu.org là một nguồn chính tắc :)
Sergey

1
Thế còn sudo su?
Kaz Wolfe

59

sudocho phép bạn chạy các lệnh trong tài khoản người dùng của riêng bạn với quyền root. sucho phép bạn chuyển người dùng để bạn thực sự đăng nhập bằng root.

sudo -schạy shell với quyền root. sudo -icũng có được môi trường người dùng root.

Để thấy sự khác biệt giữa susudo -s, làm cd ~và sau đó pwdsau mỗi người trong số họ. Trong trường hợp đầu tiên, bạn sẽ ở trong thư mục gốc của root, vì bạn đã root. Trong trường hợp thứ hai, bạn sẽ ở trong thư mục nhà của chính mình, vì bạn là chính mình với quyền root.

Có nhiều thảo luận về câu hỏi chính xác này ở đây .


20
"Bạn là chính mình với quyền root" không phải là điều thực sự xảy ra :) Thật ra, không thể là "chính bạn với quyền root" - bạn là root hoặc là chính bạn. Hãy thử gõ whoami trong cả hai trường hợp. Thực tế là các cd ~kết quả khác nhau là kết quả của sudo -s không đặt biến môi trường $ HOME.
Serge

1
@Sergey, whoami nói là 'root' vì bạn đang chạy cmd 'whoami' như thể bạn đã sudo nó, vì vậy tạm thời (trong thời gian của lệnh đó) bạn dường như là người dùng root, nhưng bạn vẫn có thể không đầy đủ truy cập root theo tập tin sudoers.
Bạch tuộc

1
@Octopus: điều tôi đã cố gắng nói là trong Unix, một quy trình chỉ có thể có một UID và UID đó xác định các quyền của quy trình. Bạn không thể là "chính mình với quyền root", một chương trình chạy với UID của bạn hoặc với UID gốc (0).
Sergey

5
Về "bạn vẫn có thể không có quyền truy cập root đầy đủ theo tệp sudoers": sudoerstệp điều khiển ai có thể chạy lệnh nào với tư cách người dùng khác, nhưng điều đó xảy ra trước khi lệnh được thực thi. Tuy nhiên, một khi bạn được phép bắt đầu một quy trình, giả sử, root - quy trình đang chạy có UID gốc và có quyền truy cập đầy đủ vào hệ thống, không có cách nào để sudo hạn chế điều đó. Một lần nữa, bạn luôn là chính mình hoặc root, không có "nửa n nửa". Vì vậy, nếu sudoerstệp cho phép bạn chạy shell dưới dạng root - các quyền trong shell đó sẽ không thể phân biệt được với shell gốc "bình thường".
Sergey

36

Câu trả lời này là một bản sao của câu trả lời của tôi về một bản sao của câu hỏi này , đặt ở đây vào câu trả lời chính tắc để mọi người có thể tìm thấy nó!

Sự khác biệt chính giữa sudo -isudo -slà:

  • sudo -icung cấp cho bạn môi trường gốc, tức là bạn ~/.bashrcbị bỏ qua.
  • sudo -smang đến cho bạn môi trường của người dùng, vì vậy bạn ~/.bashrcđược tôn trọng.

Dưới đây là một ví dụ, bạn có thể thấy rằng tôi có một ứng dụng lsltrong ~/.bin/thư mục của mình có thể truy cập thông qua sudo -snhưng không thể truy cập được sudo -i. Cũng lưu ý rằng dấu nhắc Bash thay đổi theo ý muốn sudo -inhưng không phải với sudo -s:

dotancohen@melancholy:~$ ls .bin
lsl

dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl

dotancohen@melancholy:~$ sudo -i

root@melancholy:~# which lsl

root@melancholy:~# exit
logout

dotancohen@melancholy:~$ sudo -s
Sourced .bashrc

dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl

dotancohen@melancholy:~$ exit
exit

Mặc dù sudo -sthuận tiện cho bạn môi trường mà bạn quen thuộc, tôi khuyên bạn nên sử dụngsudo -i vì hai lý do:

  1. Lời nhắc trực quan rằng bạn đang ở trong phiên 'gốc'.
  2. Môi trường gốc ít có khả năng bị nhiễm độc phần mềm độc hại, chẳng hạn như một dòng lừa đảo trong .bashrc.

Tôi nhận thấy sudo -s dường như không xử lý / etc / profile, hoặc bất cứ điều gì tôi có trong /etc/profile.d/ .. có ý tưởng nào tại sao không?
meffect

@dotancohen - Ý bạn là gì khi sudo -scung cấp một môi trường mà người dùng quen thuộc?
Động lực

@dotancohen - Lệnh sudo -s đã cung cấp tín hiệu trực quan vì vậy tôi tò mò về lý do tại sao sudo -i là một lựa chọn tốt hơn.
Động lực

9

su hỏi mật khẩu của người dùng "root".

sudoyêu cầu mật khẩu của riêng bạn (và cũng kiểm tra xem bạn có được phép chạy các lệnh dưới quyền root hay không, được cấu hình thông qua /etc/sudoers- theo mặc định tất cả các tài khoản người dùng thuộc nhóm "admin" hoặc "sudo" đều được phép sử dụng sudo).

sudo -skhở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 -imô phỏng đăng nhập vào tài khoản root: thư mục làm việc của bạn sẽ được /root, và root của .profilenó sẽ có nguồn gốc như thể khi đăng nhập.


1
để làm cho câu trả lời đầy đủ hơn: sudo -sgần như bằng su($ HOME thì khác) và sudo -ibằngsu -
DJCrashdummy

@DJCrashdummy - Tại sao bạn nói gần như bằng? Có gì khác nhau?
Động lực

2

Trong Ubuntu hoặc một hệ thống liên quan, tôi không tìm thấy nhiều sử dụng sutheo nghĩa truyền thống, siêu người dùng. sudoxử lý trường hợp đó tốt hơn nhiều. Tuy nhiên, suthật tuyệt khi trở thành người dùng khác trong các tình huống một lần trong đó việc định cấu hình sudoers sẽ là ngớ ngẩn.

Ví dụ: nếu tôi đang sửa chữa hệ thống của mình từ đĩa CD / USB trực tiếp, tôi sẽ thường gắn ổ cứng và các thứ cần thiết khác chrootvào hệ thống. Trong trường hợp như vậy, lệnh đầu tiên của tôi thường là:

su - myuser  # Note the '-'. It means to act as if that user had just logged in.

Bằng cách đó, tôi đang hoạt động không phải là root, mà là người dùng bình thường của tôi, và sau đó tôi sử dụng sudokhi thích hợp.


0
  • su Yêu cầu mật khẩu gốc, trở thành root, mở một vỏ không đăng nhập tương tác.
  • su - Yêu cầu mật khẩu root, trở thành root, mở một vỏ đăng nhập tương tác.

  • sudo -s Hỏi mật khẩu của bạn, trở thành root, mở một vỏ không đăng nhập tương tác.
  • sudo -i Hỏi mật khẩu của bạn, trở thành root, mở một vỏ đăng nhập tương tác.

Thực hành tốt nhất là sử dụng hai.


  • sudo suYêu cầu mật khẩu của bạn, trở thành root trong một giây và chạy sunhư root`.
  • sudo su -Yêu cầu mật khẩu của bạn, trở thành root trong một giây và chạy su -như root.

Vì vậy, trong trường hợp này bạn đang chạy subằng cách sử dụng sudovà bạn không cần phải biết mật khẩu thực của root. Các kết quả giống như susu -.


Sự khác biệt giữa đăng nhập và không đăng nhập shell là gì?
Pilot6

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.