'sudo su -' vs 'sudo -i' vs 'sudo / bin / bash' - hangisinin kullanıldığı önemli veya ne önemi var?


254

Kök gerektiren bir şeyi üst üste düzinelerce defa yazarken, oturumumu kök oturumuna çevirmeyi tercih ederim. Çeşitli öğreticiler ve talimatlarda Gördüğüm, internette kullanmış sudo su, sudo su -, sudo -ive sudo /bin/bashbir kök oturumu açmak için kullanılan, ancak bu ve ne zaman arasında veya o fark konularda eğer farkı net değilim.

Birisi bunu benim için temizleyebilir mi?


11
Yaklaşık sormayı unuttum sudo -sve sudo su.
Radu Rădeanu




3
@ RaduRădeanu Soruyu yazdığımda önerilen soruları gözden geçirdim ve hiçbiri tam olarak sorumu ele almadı. Aynısı, bağlantı kurduğunuz sorular için de geçerlidir. Benim için çok fazla yeni bilgi içermelerine rağmen, onlarla bağlantı kurduğunuz için teşekkür eder, onları aşağıdaki kullanıcı kaosunun sağladığı kadar eksiksiz bulmadım, aradığım şeyle daha uyumlu.
Paul

Yanıtlar:


325

Bunu açıklamak için programların ne yaptığını bilmeniz gerekir:

  • su- Komut subaşka bir kullanıcıya (geçmek için kullanılır lar cadı u ser), ama aynı zamanda hiçbir parametre ile komutu çağırarak kök kullanıcıya geçebilirsiniz. suSizden kullanıcı ortamına geçtiğiniz şifreyi yazdıktan sonra kullanıcının şifresini değiştirmenizi ister.
  • sudo- sudoroot yetkileriyle tek bir komut çalıştırmak içindir. Fakat aksine su, geçerli kullanıcının şifresini ister. Bu kullanıcı sudoers dosyasında (veya sudoers dosyasında olan bir grupta) bulunmalıdır. Varsayılan olarak, Ubuntu şifrenizi 15 dakika boyunca "hatırlar", böylece her seferinde şifrenizi girmek zorunda kalmazsınız.
  • bash- Bilgisayarla etkileşim kurmak için bir metin arayüzü. Giriş, giriş yapma, etkileşimli ve etkileşimli olmayan kabuklar arasındaki farkı anlamak önemlidir:

Kabukları türleri:

  • login shell : Login shell sisteme belirli bir kullanıcı olarak giriş yapar, bunun için gerekli bir kullanıcı adı ve şifredir. Eğer vurduğunda ctrl+ alt+ F1sanal terminale giriş yapmak size başarılı giriş Giriş kabuğu sonra olsun.
  • oturum açmayan kabuk : Oturum açmadan çalıştırılan, şu anda oturum açmış olan kullanıcı için gerekli olan kabuk. GNOME'da bir grafik terminali açtığınızda, giriş yapılmayan bir kabuktur.
  • etkileşimli kabuk : Etkileşimli olarak komut yazabileceğiniz veya kesebileceğiniz bir kabuk (giriş veya giriş olmayan). Örneğin bir gnome terminali.
  • etkileşimli olmayan kabuk : Büyük olasılıkla otomatik bir işlemden çalıştırılan bir (alt) kabuk. Ne girdi ne de çıktı göreceksiniz.

Yani davalar:

  • sudo suKomutla sudoçağırır su. Bash etkileşimli giriş olmayan kabuk olarak adlandırılır. Yani bash sadece çalıştırır .bashrc. Köke geçtikten sonra hala aynı dizinde olduğunuzu görebilirsiniz:

    user@host:~$ sudo su
    root@host:/home/user#
    
  • sudo su -Bu sefer bir giriş kabuğu, yani /etc/profile, .profileve .bashrcyürütülür ve root çevre ile root ana dizininde bulacaksınız.

  • sudo -iNeredeyse aynıdır sudo su --i (başlangıç ​​oturum açma simülasyonu) seçeneği, hedef kullanıcının parola veritabanı girişi tarafından oturum açma kabuğu olarak belirtilen kabuğu çalıştırır. Bu oturum özgü kaynak gibi dosyaları anlamına gelir .profile, .bashrcya da .loginokuma ve kabuk tarafından çalıştırılacaktır.

  • sudo /bin/bashBu sudo, komutla aradığınız anlamına gelir /bin/bash. /bin/bashoturum açma dışı kabuk olarak başlatılır, böylece tüm nokta dosyaları yürütülmez, ancak .bashrcarama yapan kullanıcının bash kendisini okur . Ortamınız aynı kalıyor. Eviniz kökün evi olmayacak. Demek kök, ama arayan kullanıcının ortamında.

  • sudo -s$SHELLdeğişkeni okur ve içeriği yürütür. Eğer $SHELLiçeriyorsa /bin/bashbu çağırır sudo /bin/bash(yukarıya bakınız).

Kontrol:

Giriş kabuğu olup olmadığını kontrol etmek için ( shoptyerleşik bir komut olduğundan yalnızca bash'te çalışır ):

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

18
Sadece bir açıklama: sudoizin verilen bir kullanıcının süper kullanıcı veya başka bir kullanıcı olarak bir komut çalıştırmasına izin verir . Neyse, çaban için + 1.
Radu Rădeanu,

2
@chaos Bu mükemmel cevap için teşekkür ederiz! Çoğunlukla sorularıma cevap veriyor, ben de devam ettim ve cevaplanan soruyu işaretledim, ancak belirli bir kabuğu çalıştırmanın ne zaman istenebileceğini anlamıyorum. Ubuntu'yu komut satırından gerçekten kullanıyorum ve bir rootkullanıcı oturumu açmak için (kullanmaya karşı sudo) en yaygın kullanımımı root, yeni bir şey yüklerken veya büyük bir yeniden yapılandırma gerçekleştirirken olduğu gibi , çok fazla ayrıcalık gerektiren bir şey yaptığım zaman buluyorum. . Kullanıyorum sudo /bin/bash, ama görünüşe göre bu yöntemin anlamadığım bir nedenden dolayı kötü bir rap var.
Paul

2
Ayrıca, su'nun süper kullanıcı yerine anahtar kullanıcısı anlamına geldiğini söylemek daha doğrudur. Bir php betiği çalıştırın: su www-data /usr/share/script.php veya etkileşimli kabuk için sadece www-data. Ancak herhangi bir kullanıcı adı olmadan su, root (super user) hesabını üstlenecektir.
oblivian

Kaos - "shopt -q login_shell && echo 'Giriş kabuğu' || echo 'Giriş kabuğu yok'" Bu tür öneriler çok sık görüyorum, ancak neden bu kadar uzun sürüyorsunuz? && işleci, eğer çıkış kodu 0 ise "sonraki komutu yap" anlamına gelir ve çift borular (||) başka anlamına gelir (eğer 0 değilse) bu komutu yapın. Peki, temelde ne diyorsa, eğer çıkış kodu 0 ise, daha sonra "Giriş Kabuğu", çıkış kodu 1 ise (başarısız), sonra da "Giriş yok" şeklinde yankılanır. Neden sadece "shopt -q login_shell; echo $?" , $? önceki komutun sonuç / çıkış kodunu ifade eder. Çoğunlukla bütün programlar 0 başarı değilse, 1 veya daha fazlası başarısız olur. Yani yankı 0 ise = başarı ...
oblivian


0

Farklılıkları aramak için, ortaya çıkan çevreyi farklı çağrılar arasında kovalayabilirsiniz.

Bazı kritik değişkenlerde bazı "küçük" farklılıklar bulabilirsiniz :

  • PATH, LD_LIBRARY_PATH,LD_PRELOAD

veya ~ / cinsinden bir miktar fark. dotfiles işleme ( ~/.config).

Ayrıca, $ HOME tabanlı günlük dosyalarının ( ~/.xsession.errors, etc ...) veya ~/.Xauthoritykomutların ürettiği xauth çerezlerinin ( ) sahipliğini de göz önünde bulundurun .

Bu komutları deneyin:


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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.