Apa perbedaan antara "su", "sudo -s", "sudo -i", "sudo su"?

148

Saya sudah membacanya dari manual tetapi saya tidak bisa melihat perbedaannya ..

su - ubah ID pengguna atau menjadi pengguna super

sudo -s [command]

Opsi -s(shell) menjalankan shell yang ditentukan oleh variabel lingkungan SHELL jika diatur atau shell seperti yang ditentukan dalam passwd (5). Jika suatu perintah ditentukan, itu diteruskan ke shell untuk dieksekusi. Kalau tidak, shell interaktif dijalankan.

sudo -i menghilang deskripsi dalam manual

Senyum. Pemburu
sumber
7
Juga, jangan gunakan su useruntuk login dari shell yang tidak terpercaya, tetapi su - user. Lihat unix.stackexchange.com/q/7013/8250
Lekensteyn
@ Lindensteyn wow, contoh yang bagus. thx untuk LOL :)
törzsmókus
1
selalu ingat perintah lama: janganlah kamu mengklaim nama root dengan sia-sia!
törzsmókus
Tidak mengatakan sudo -iitu buruk, tetapi Anda pasti bisa mengacaukannya dengan menggunakannya
Kolob Canyon
Hampir duplikat: askubuntu.com/questions/376199/…
Reinier Post

Jawaban:

118

Perbedaan utama antara perintah-perintah ini adalah cara mereka membatasi akses ke fungsinya.

su (yang berarti "pengguna pengganti" atau "pengguna beralih") - tidak persis seperti itu, ia memulai instance shell lain dengan hak istimewa dari pengguna target. Untuk memastikan Anda memiliki hak untuk melakukan itu, ia meminta Anda kata sandi pengguna target . Jadi, untuk menjadi root, Anda perlu tahu kata sandi root. Jika ada beberapa pengguna di mesin Anda yang perlu menjalankan perintah sebagai root, mereka semua harus tahu kata sandi root - perhatikan bahwa kata sandi itu akan sama. Jika Anda perlu mencabut izin admin dari salah satu pengguna, Anda perlu mengubah kata sandi root dan hanya memberitahukannya kepada orang-orang yang perlu menjaga akses tetap berantakan.

sudo (hmm ... apa mnemoniknya? Super-User-DO?) benar-benar berbeda. Ia menggunakan file config (/ etc / sudoers) yang mencantumkan pengguna mana yang memiliki hak untuk tindakan tertentu (jalankan perintah sebagai root, dll.) Ketika dipanggil, ia meminta kata sandi pengguna yang memulai - untuk memastikan orang di terminal adalah "joe" yang sama dengan yang terdaftar di /etc/sudoers. Untuk mencabut hak admin dari seseorang, Anda hanya perlu mengedit file konfigurasi (atau menghapus pengguna dari grup yang tercantum dalam konfigurasi itu). Ini menghasilkan pengelolaan hak istimewa yang jauh lebih bersih.

Sebagai akibatnya, di banyak sistem berbasis Debian rootpengguna tidak memiliki kata sandi - artinya tidak mungkin untuk login sebagai root secara langsung.

Juga, /etc/sudoersmemungkinkan untuk menentukan beberapa opsi tambahan - yaitu pengguna X hanya dapat menjalankan program Y dll.

Sering digunakan sudo sukombinasi bekerja sebagai berikut: pertama sudomeminta Anda untuk Anda password, dan, jika Anda diperbolehkan untuk melakukannya, memanggil perintah berikutnya ( su) sebagai super-user. Karena sudiminta oleh root, itu tidak mengharuskan Anda untuk memasukkan kata sandi pengguna target. Jadi, sudo sumemungkinkan Anda untuk membuka shell sebagai pengguna lain (termasuk root), jika Anda diizinkan akses super-pengguna oleh /etc/sudoersfile.

Sergey
sumber
2
Saya tidak pernah melihat susebagai "pengguna beralih", tetapi selalu sebagai pengguna super; perilaku default tanpa nama pengguna orang lain (meskipun masuk akal). Dari wikipedia : "Perintah su, juga disebut sebagai super user [1] pada awal 1974, juga disebut" pengguna pengganti "," pengguna spoof "atau" set pengguna "karena memungkinkan mengubah akun yang terkait dengan arus terminal (jendela). "
dr jimbob
5
@ jimbob @dr: Anda benar, tapi saya menemukan bahwa "pengguna beralih" agak menggambarkan lebih baik apa yang dilakukannya - meskipun secara historis itu singkatan dari "pengguna super". Saya juga senang menemukan bahwa artikel wikipedia sangat mirip dengan jawaban saya - saya tidak pernah melihat artikel sebelumnya :)
Sergey
11
Arti resmi "su" adalah "pengguna pengganti". Lihat: "man su".
Angel O'Sphere
1
@ AngelO'Sphere: Menariknya, manual Ubuntu tidak menyebutkan "pengganti" sama sekali. Manual di gnu.org ( gnu.org/software/coreutils/manual/html_node/su-invocation.html ) memang mengatakan "su: Jalankan perintah dengan pengguna pengganti dan ID grup". Saya pikir gnu.org adalah sumber kanonik :)
Sergey
1
Bagaimana dengan sudo su?
Kaz Wolfe
59

sudomemungkinkan Anda menjalankan perintah di akun pengguna Anda sendiri dengan hak akses root. sumemungkinkan Anda beralih pengguna sehingga Anda benar-benar masuk sebagai root.

sudo -smenjalankan shell dengan hak akses root. sudo -ijuga memperoleh lingkungan pengguna root.

Untuk melihat perbedaan antara sudan sudo -s, lakukan cd ~dan kemudian pwdsetelah masing-masing. Pada kasus pertama, Anda akan berada di direktori home root, karena Anda root. Dalam kasus kedua, Anda akan berada di direktori home Anda sendiri, karena Anda sendiri dengan hak akses root.

Ada lebih banyak diskusi tentang pertanyaan ini di sini .

Mike Scott
sumber
20
"Anda sendiri dengan hak akses root" bukan apa yang sebenarnya terjadi :) Sebenarnya, tidak mungkin menjadi "diri Anda dengan hak akses root" - baik Anda root atau Anda sendiri. Coba ketikkan whoami dalam kedua kasus. Fakta bahwa cd ~hasilnya berbeda adalah hasil dari sudo -s tidak menyetel variabel lingkungan $ HOME.
Sergey
1
@Sergey, whoami dikatakan 'root' karena Anda menjalankan cmd 'whoami' seolah-olah Anda sudo, jadi untuk sementara (selama durasi perintah itu) Anda tampaknya menjadi pengguna root, tetapi Anda mungkin masih belum memiliki penuh akses root sesuai dengan file sudoers.
Octopus
1
@Octopus: apa yang saya coba katakan adalah bahwa di Unix, suatu proses hanya dapat memiliki satu UID, dan bahwa UID menentukan izin dari proses tersebut. Anda tidak bisa menjadi "diri Anda dengan hak akses root", sebuah program dapat berjalan dengan UID Anda atau dengan UID root (0).
Sergey
5
Mengenai "Anda mungkin masih tidak memiliki akses root penuh sesuai dengan file sudoers": sudoersfile mengontrol siapa yang dapat menjalankan perintah mana sebagai pengguna lain, tetapi itu terjadi sebelum perintah dijalankan. Namun, begitu Anda diizinkan memulai proses seperti, katakanlah, root - proses yang berjalan memiliki UID root dan memiliki akses penuh ke sistem, tidak ada cara bagi sudo untuk membatasi itu. Sekali lagi, Anda selalu menjadi diri sendiri atau root, tidak ada "setengah-setengah". Jadi, jika sudoersfile memungkinkan Anda untuk menjalankan shell sebagai root - izin di shell itu tidak dapat dibedakan dari shell root "normal".
Sergey
36

Jawaban ini adalah duplikat dari jawaban saya pada duplikat dari pertanyaan ini , taruh di sini pada jawaban kanonik sehingga orang dapat menemukannya!

Perbedaan utama antara sudo -idan sudo -sadalah:

  • sudo -imemberi Anda lingkungan root, yaitu Anda ~/.bashrcdiabaikan.
  • sudo -smemberi Anda lingkungan pengguna, sehingga Anda ~/.bashrcdihormati.

Berikut ini sebuah contoh, Anda dapat melihat bahwa saya memiliki aplikasi lsldi ~/.bin/direktori saya yang dapat diakses sudo -stetapi tidak dapat diakses dengan sudo -i. Perhatikan juga bahwa Bash prompt berubah sesuai keinginan sudo -itetapi tidak dengan 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

Meskipun sudo -snyaman untuk memberi Anda lingkungan yang Anda kenal, saya merekomendasikan penggunaannyasudo -i karena dua alasan:

  1. Pengingat visual bahwa Anda berada dalam sesi 'root'.
  2. Lingkungan root jauh lebih kecil kemungkinannya untuk diracuni dengan malware, seperti garis jahat di dalamnya .bashrc.
dotancohen
sumber
Saya perhatikan sudo -s tampaknya tidak memproses / etc / profile, atau apapun yang saya miliki di /etc/profile.d/ .. ada ide kenapa?
meffect
@dotancohen - Apa maksud Anda dengan sudo -smenyediakan lingkungan yang akrab bagi pengguna?
Termotivasi
@dancancohen - Perintah sudo -s sudah memberikan isyarat visual jadi saya ingin tahu mengapa sudo -i adalah pilihan yang lebih baik.
Termotivasi
9

su meminta kata sandi pengguna "root".

sudomeminta kata sandi Anda sendiri (dan juga memeriksa apakah Anda diizinkan menjalankan perintah sebagai root, yang dikonfigurasi melalui /etc/sudoers- secara default semua akun pengguna yang termasuk dalam grup "admin" atau "sudo" diizinkan menggunakan sudo).

sudo -smeluncurkan shell sebagai root, tetapi tidak mengubah direktori kerja Anda. sudo -imensimulasikan login ke akun root: direktori kerja Anda akan /root, dan root .profiledll. akan bersumber seolah-olah saat login.

Marius Gedminas
sumber
1
untuk membuat jawaban lebih lengkap: sudo -shampir sama dengan su($ HOME berbeda) dan sudo -isama dengansu -
DJCrashdummy
@DJCrashdummy - Mengapa Anda katakan hampir sama dengan? Apa perbedaannya?
Termotivasi
2

Di Ubuntu atau sistem terkait, saya tidak menemukan banyak gunanya sudalam pengertian tradisional, super-user. sudomenangani kasing itu jauh lebih baik. Namun, subagus untuk menjadi pengguna lain dalam situasi satu kali di mana konfigurasi sudoers akan konyol.

Misalnya, jika saya memperbaiki sistem saya dari live CD / USB, saya akan sering memasang hard drive saya dan hal-hal lain yang diperlukan chrootke dalam sistem. Dalam kasus seperti itu, perintah pertama saya umumnya:

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

Dengan begitu, saya beroperasi bukan sebagai root, tetapi sebagai pengguna normal saya, dan kemudian saya gunakan sudosesuai kebutuhan.

Scott Severance
sumber
0
  • su Meminta kata sandi root, menjadi root, membuka shell non-login interaktif.
  • su - Meminta kata sandi root, menjadi root, membuka shell login interaktif.

  • sudo -s Minta kata sandi Anda, menjadi root, membuka shell non-login interaktif.
  • sudo -i Minta kata sandi Anda, menjadi root, buka shell login interaktif.

Praktik terbaik adalah menggunakan keduanya.


  • sudo suMinta kata sandi Anda, sujadikan root untuk sedetik dan jalankan sebagai root`.
  • sudo su -Minta kata sandi Anda, jadikan root untuk sedetik dan jalankan su -sebagai root.

Jadi dalam hal ini Anda menjalankan sumenggunakan sudodan Anda tidak perlu tahu kata sandi root yang sebenarnya. Hasilnya sama dengan sudan su -.

Ravexina
sumber
Apa perbedaan antara shell login dan non login?
Pilot6
1
Pertanyaan lain?
Ravexina