'sudo su -' vs 'sudo -i' vs 'sudo / bin / bash' - kapan itu penting yang digunakan, atau apakah itu penting sama sekali?


254

Ketika saya melakukan sesuatu yang membutuhkan root untuk diketik puluhan kali berturut-turut, saya lebih suka mengalihkan sesi saya ke sesi root. Dalam berbagai tutorial dan petunjuk saya telah digunakan di Internet, saya melihat sudo su, sudo su -, sudo -idan sudo /bin/bashdigunakan untuk membuka sesi root, tapi aku tidak jelas tentang perbedaan antara ini dan kapan atau apakah yang penting perbedaan.

Bisakah seseorang membersihkan ini untuk saya?


11
Anda lupa bertanya tentang sudo -sdan sudo su.
Radu Rădeanu




3
@ RaduRădeanu Ketika saya mengetik pertanyaan di saya meninjau pertanyaan yang disarankan dan tidak ada yang benar-benar menjawab pertanyaan lengkap saya. Hal yang sama berlaku untuk pertanyaan yang Anda tautkan. Meskipun mereka berisi banyak informasi baru untuk saya, dan terima kasih telah menautkannya, saya menemukan mereka tidak selengkap yang diberikan oleh kekacauan yang diberikan pengguna di bawah ini, yang jauh lebih sesuai dengan apa yang saya cari.
Paul

Jawaban:


325

Untuk menjelaskan ini, Anda perlu tahu apa yang dilakukan program:

  • su- Perintah suini digunakan untuk beralih ke pengguna lain ( s witch u ser), tetapi Anda juga dapat beralih ke pengguna root dengan menjalankan perintah tanpa parameter. sumeminta Anda untuk mengganti kata sandi pengguna, setelah mengetik kata sandi yang Anda alihkan ke lingkungan pengguna.
  • sudo- sudoDimaksudkan untuk menjalankan satu perintah dengan hak akses root. Tetapi tidak seperti suitu meminta Anda untuk kata sandi pengguna saat ini. Pengguna ini harus dalam file sudoers (atau grup yang ada di file sudoers). Secara default, Ubuntu "mengingat" kata sandi Anda selama 15 menit, sehingga Anda tidak perlu mengetik kata sandi setiap kali.
  • bash- Antarmuka teks untuk berinteraksi dengan komputer. Penting untuk memahami perbedaan antara shell login, non-login, interaktif, dan non-interaktif:

Jenis kerang:

  • shell login : Shell login membuat Anda masuk ke sistem sebagai pengguna tertentu, yang diperlukan untuk ini adalah nama pengguna dan kata sandi. Ketika Anda menekan ctrl+ alt+ F1untuk masuk ke terminal virtual yang Anda dapatkan setelah berhasil login shell login.
  • shell non-login : Shell yang dieksekusi tanpa login, yang diperlukan untuk ini adalah pengguna yang saat ini login. Ketika Anda membuka terminal grafik di gnome, itu adalah shell non-login.
  • shell interaktif : Shell (login atau non-login) di mana Anda dapat mengetik atau menginterupsi perintah secara interaktif. Misalnya terminal gnome.
  • shell non-interaktif : Shell (sub) yang mungkin dijalankan dari proses otomatis. Anda tidak akan melihat input maupun output.

Jadi kasusnya adalah:

  • sudo suPanggilan sudodengan perintah su. Bash disebut sebagai shell non-login interaktif. Jadi bash hanya mengeksekusi .bashrc. Anda dapat melihat bahwa setelah beralih ke root, Anda masih berada di direktori yang sama:

    user@host:~$ sudo su
    root@host:/home/user#
    
  • sudo su -Kali ini adalah shell login, jadi /etc/profile, .profiledan .bashrcdieksekusi dan Anda akan menemukan diri Anda di direktori home root dengan lingkungan root.

  • sudo -iIni hampir sama dengan sudo su -opsi -i (mensimulasikan login awal) menjalankan shell yang ditentukan oleh entri basis data kata sandi pengguna target sebagai shell login. Ini berarti bahwa file sumber daya khusus masuk seperti .profile, .bashrcatau .loginakan dibaca dan dieksekusi oleh shell.

  • sudo /bin/bashIni berarti Anda menelepon sudodengan perintah /bin/bash. /bin/bashdimulai sebagai shell non-login sehingga semua file dot tidak dieksekusi, tetapi bash sendiri membaca .bashrcdari pengguna panggilan. Lingkungan Anda tetap sama. Rumah Anda tidak akan menjadi rumah root. Jadi Anda root, tetapi di lingkungan pengguna panggilan.

  • sudo -smembaca $SHELLvariabel dan mengeksekusi konten. Jika $SHELLberisi /bin/bashitu memanggil sudo /bin/bash(lihat di atas).

Memeriksa:

Untuk memeriksa apakah Anda berada di shell login atau tidak (hanya berfungsi dalam bash karena shoptmerupakan perintah bawaan):

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

18
Hanya klarifikasi: sudomemungkinkan pengguna yang diizinkan untuk mengeksekusi perintah sebagai superuser atau pengguna lain . Pokoknya, +1 untuk upaya Anda.
Radu Rădeanu

2
@chaos Terima kasih atas jawaban yang luar biasa ini! Sebagian besar menjawab pertanyaan saya, jadi saya melanjutkan dan menandai pertanyaan dijawab, tapi saya tidak mengerti ketika diinginkan untuk menjalankan shell tertentu. Saya benar-benar hanya menggunakan Ubuntu melalui command line dan saya menemukan penggunaan saya yang paling umum untuk membuka rootsesi pengguna (vs menggunakan sudo) adalah ketika saya melakukan sesuatu yang membutuhkan penggunaan rootkhusus hak istimewa, seperti ketika menginstal sesuatu yang baru atau melakukan konfigurasi ulang besar . Saya sudah menggunakan sudo /bin/bash, tetapi ternyata metode itu memiliki rap buruk karena beberapa alasan saya tidak mengerti.
Paul

2
Juga, itu lebih "benar" untuk mengatakan bahwa su singkatan untuk pengguna switch, bukan pengguna super. Yaitu menjalankan skrip php: su www-data / usr/share/script.php atau hanya su www-data untuk shell interaktif. Tetapi su tanpa nama pengguna akan mengasumsikan akun root (pengguna super).
Oblivian

Chaos - "shopt -q login_shell && echo 'Login shell' || echo 'No shell login'" Saran seperti ini sering saya lihat, tapi mengapa membuatnya begitu lama? Operator && berarti jika kode keluar 0 maka "lakukan perintah berikutnya" dan pipa ganda (||) berarti yang lain (jika bukan 0) maka lakukan perintah ini. Jadi apa yang pada dasarnya dikatakan jika kode keluar 0 kemudian gema "Login Shell", jika kode keluar 1 (gagal) kemudian gema "Tidak masuk". Kenapa tidak "shopt -q login_shell; echo $?" $? berarti kode hasil / keluar dari perintah sebelumnya. Dalam sebagian besar, jika tidak semua program, 0 berarti berhasil, 1 atau lebih berarti gagal. Jadi jika echo adalah 0 = sukses ...
oblivian


0

Untuk mencari perbedaan, Anda dapat mengubah lingkungan yang dihasilkan di antara doa yang berbeda.

Anda bisa menemukan beberapa perbedaan "kecil" dalam beberapa variabel kritis:

  • PATH, LD_LIBRARY_PATH,LD_PRELOAD

atau perbedaan ~ /. penanganan dotfiles ( ~/.config).

Pertimbangkan juga kepemilikan $ HOME berdasarkan logfile ( ~/.xsession.errors, dll ...) atau cookie xauth ( ~/.Xauthority) yang dihasilkan oleh perintah.

Coba perintah ini:


# '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)


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.