'sudo su -' vs 'sudo -i' vs 'sudo / bin / bash' - khi nào nó quan trọng được sử dụng, hay nó có vấn đề gì không?


254

Khi tôi đang làm một cái gì đó yêu cầu root được gõ hàng chục lần liên tiếp, tôi thích chuyển phiên của mình sang phiên root. Trong các hướng dẫn khác nhau và hướng dẫn Tôi đã sử dụng trên Internet, tôi thấy sudo su, sudo su -, sudo -isudo /bin/bashđược sử dụng để mở một phiên root, nhưng tôi không rõ ràng về sự khác biệt giữa những điều này và khi nào hoặc nếu đó là vấn đề khác biệt.

Ai đó có thể làm rõ điều này cho tôi?


11
Bạn quên hỏi về sudo -ssudo su.
Radu Rădeanu




3
@ RaduRădeanu Khi tôi gõ câu hỏi vào, tôi đã xem lại các câu hỏi được đề xuất và không có câu hỏi nào thực sự giải quyết được câu hỏi hoàn chỉnh của tôi. Điều này cũng đúng với các câu hỏi bạn liên kết đến. Mặc dù chúng chứa rất nhiều thông tin mới cho tôi và cảm ơn bạn đã liên kết với chúng, tôi thấy chúng không đầy đủ như câu trả lời hỗn loạn của người dùng dưới đây, phù hợp hơn với những gì tôi đang tìm kiếm.
Paul

Câu trả lời:


325

Để giải thích điều này, bạn cần biết các chương trình làm gì:

  • su- Lệnh suđược sử dụng để chuyển sang người dùng khác ( s witch u ser), nhưng bạn cũng có thể chuyển sang người dùng root bằng cách gọi lệnh không có tham số. suyêu cầu bạn chuyển mật khẩu của người dùng, sau khi nhập mật khẩu bạn chuyển sang môi trường người dùng.
  • sudo- sudocó nghĩa là để chạy một lệnh duy nhất với quyền root. Nhưng không giống như sunó nhắc bạn nhập mật khẩu của người dùng hiện tại. Người dùng này phải ở trong tệp sudoers (hoặc một nhóm trong tệp sudoers). Theo mặc định, Ubuntu "nhớ" mật khẩu của bạn trong 15 phút, do đó bạn không phải nhập mật khẩu mỗi lần.
  • bash- Giao diện văn bản để tương tác với máy tính. Điều quan trọng là phải hiểu sự khác biệt giữa các vỏ đăng nhập, không đăng nhập, tương tác và không tương tác:

Các loại vỏ:

  • vỏ đăng nhập : Một vỏ đăng nhập đăng nhập bạn vào hệ thống với tư cách là một người dùng được chỉ định, cần thiết cho việc này là tên người dùng và mật khẩu. Khi bạn nhấn ctrl+ alt+ F1để đăng nhập vào thiết bị đầu cuối ảo, bạn sẽ nhận được sau khi đăng nhập thành công shell đăng nhập.
  • Shell không đăng nhập : Shell được thực thi mà không cần đăng nhập, cần thiết cho việc này là người dùng hiện đang đăng nhập. Khi bạn mở một thiết bị đầu cuối đồ họa trong gnome, nó là một vỏ không đăng nhập.
  • shell tương tác : Một shell (đăng nhập hoặc không đăng nhập) trong đó bạn có thể gõ hoặc ngắt các lệnh tương tác. Ví dụ một thiết bị đầu cuối gnome.
  • Shell không tương tác : Shell (phụ) có thể được chạy từ một quy trình tự động. Bạn sẽ không thấy đầu vào cũng như đầu ra.

Vì vậy, các trường hợp là:

  • sudo suGọi sudobằng lệnh su. Bash được gọi là vỏ không đăng nhập tương tác. Vì vậy, bash chỉ thực hiện .bashrc. Bạn có thể thấy rằng sau khi chuyển sang root, bạn vẫn ở trong cùng một thư mục:

    user@host:~$ sudo su
    root@host:/home/user#
  • sudo su -Lần này, nó là một vỏ đăng nhập, vì vậy /etc/profile, .profile.bashrcđược thực thi và bạn sẽ thấy mình trong thư mục gốc của root với môi trường của root.

  • sudo -iNó gần giống như sudo su -tùy chọn -i (mô phỏng đăng nhập ban đầu) chạy shell được chỉ định bởi mục nhập cơ sở dữ liệu mật khẩu của người dùng đích dưới dạng shell đăng nhập. Điều này có nghĩa là các tệp tài nguyên dành riêng cho đăng nhập như .profile, .bashrchoặc .loginsẽ được đọc và thực thi bởi trình bao.

  • sudo /bin/bashĐiều này có nghĩa là bạn gọi sudobằng lệnh /bin/bash. /bin/bashđược bắt đầu dưới dạng shell không đăng nhập để tất cả các tệp chấm không được thực thi, nhưng chính bash sẽ đọc .bashrccủa người dùng đang gọi. Môi trường của bạn vẫn như cũ. Nhà của bạn sẽ không phải là nhà của root. Vì vậy, bạn đã root, nhưng trong môi trường của người dùng gọi.

  • sudo -sđọc $SHELLbiến và thực hiện nội dung. Nếu $SHELLcó chứa /bin/bashnó gọi sudo /bin/bash(xem ở trên).

Kiểm tra:

Để kiểm tra xem bạn có ở trong vỏ đăng nhập hay không (chỉ hoạt động trong bash vì shoptlà lệnh dựng sẵn):

shopt -q login_shell && echo 'Login shell' || echo 'No login shell'

18
Chỉ cần làm rõ: sudocho phép người dùng được phép thực thi một lệnh như siêu người dùng hoặc người dùng khác . Dù sao, +1 cho nỗ lực của bạn.
Radu Rădeanu

2
@chaos Cảm ơn bạn vì câu trả lời tuyệt vời này! Nó chủ yếu trả lời các câu hỏi của tôi, vì vậy tôi đã tiếp tục và đánh dấu câu hỏi đã trả lời, nhưng tôi không hiểu khi nào nên chạy một lớp vỏ cụ thể. Tôi thực sự chỉ sử dụng Ubuntu thông qua dòng lệnh và tôi thấy cách sử dụng phổ biến nhất của tôi để mở rootphiên người dùng (so với sử dụng sudo) là khi tôi đang làm một việc gì đó đòi hỏi sử dụng nhiều rootđặc quyền, chẳng hạn như khi cài đặt một cái gì đó mới hoặc thực hiện cấu hình lại chính . Tôi đã sử dụng sudo /bin/bash, nhưng rõ ràng phương pháp đó có phần rap tệ vì một số lý do tôi không hiểu.
Paul

2
Ngoài ra, sẽ đúng hơn khi nói rằng su là viết tắt của người dùng chuyển đổi, thay vì siêu người dùng. Tức là chạy tập lệnh php: su www-data /usr/share/script.php hoặc chỉ sử dụng dữ liệu www cho shell tương tác. Nhưng su không có bất kỳ tên người dùng nào sẽ lấy tài khoản gốc (siêu người dùng).
Oblivian

Chaos - "shopt -q login_shell && echo 'Vỏ đăng nhập' || echo 'Không có vỏ đăng nhập'" Những loại đề xuất này tôi thường thấy, nhưng tại sao lại quá lâu? Toán tử && có nghĩa là nếu mã thoát 0 thì "thực hiện lệnh tiếp theo" và ống đôi (||) có nghĩa là khác (nếu không phải 0) thì thực hiện lệnh này. Vì vậy, về cơ bản nó nói gì nếu mã thoát 0 thì lặp lại "Đăng nhập Shell", nếu mã thoát 1 (thất bại) thì lặp lại "Không đăng nhập". Tại sao không chỉ là "shopt -q login_shell; echo $?" $? nghĩa là mã kết quả / thoát của lệnh trước. Trong hầu hết nếu không phải tất cả các chương trình 0 có nghĩa là thành công, 1 hoặc nhiều hơn có nghĩa là thất bại. Vì vậy, nếu tiếng vang là 0 = thành công ...
oblivian

2
@Paul: sudo -iđược đề xuất. Đọc ở đây: ubuntuforums.org/showthread.php?t=1817402 và tại đây: unix.stackexchange.com/questions/98531/ phỏng
Marco Sulla

0

Để tìm kiếm sự khác biệt, bạn có thể phá vỡ môi trường kết quả giữa các yêu cầu khác nhau.

Bạn có thể tìm thấy một số khác biệt "nhỏ" trong một số biến quan trọng:

  • PATH, LD_LIBRARY_PATH,LD_PRELOAD

hoặc một số khác biệt trong ~ /. xử lý dotfiles ( ~/.config).

Cũng xem xét quyền sở hữu của các logfiles dựa trên $ HOME ( ~/.xsession.errors, v.v ...) hoặc cookie xauth ( ~/.Xauthority) mà các lệnh tạo ra.

Hãy thử các lệnh sau:


# 'su -' vs 'su'

diff <(sudo su - -c env | sort) <(sudo su -c env | sort)


# 'su -' vs 'sudo -i'

diff <(sudo su - -c env | sort) <(sudo -i env | sort)

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.