Vraag 'sudo su -' vs 'sudo -i' vs 'sudo / bin / bash' - wanneer maakt het uit wat wordt gebruikt, of doet het ertoe?


Wanneer ik iets doe waarbij root tientallen keren achter elkaar moet worden getypt, schakel ik mijn sessie liever uit naar een root-sessie. In de verschillende tutorials en instructies die ik op internet heb gebruikt, zie ik sudo su, sudo su -, sudo -i en sudo /bin/bash wordt gebruikt om een ​​root-sessie te openen, maar ik ben niet duidelijk over het verschil tussen deze en wanneer of of dat verschil ertoe doet.

Kan iemand dit voor mij opruimen?


195
2017-11-12 23:30


oorsprong


Je bent vergeten te vragen sudo -s en sudo su. - Radu Rădeanu
Verwant: Verschil tussen "su", "sudo -s", "sudo -i" - Radu Rădeanu
Verwant: Wat is het verschil tussen 'sudo-opdracht' en 'sudo sh-opdracht? - Radu Rădeanu
Verwant: Wat is het functionele verschil tussen sudo su en sudo -i? - Radu Rădeanu
@ RaduRădeanu Toen ik de vraag typte, herzag ik de voorgestelde vragen en geen van die heeft echt mijn volledige vraag beantwoord. Hetzelfde geldt voor de vragen die u hebt gekoppeld. Hoewel ze veel nieuwe informatie voor mij bevatten, en bedankt voor het linken met hen, vond ik ze niet zo compleet als de chaos van het antwoordgebruik hieronder, wat veel meer overeenkomt met wat ik zocht. - Paul


antwoorden:


Om dit uit te leggen, moet je weten wat de programma's doen:

su - Het bevel su wordt gebruikt om over te schakelen naar een andere gebruiker (s heks u ser), maar u kunt ook naar de rootgebruiker schakelen door de opdracht zonder parameter in te roepen. su vraagt ​​u om het wachtwoord van de gebruiker om over te schakelen, na het invoeren van het wachtwoord dat u naar de omgeving van de gebruiker hebt geschakeld.

sudo - sudo is bedoeld om één enkele opdracht uit te voeren met rootprivileges. Maar niet zoals su het vraagt ​​u om het wachtwoord van de huidige gebruiker. Deze gebruiker moet zich in het sudoers-bestand bevinden (of een groep die zich in het sudoers-bestand bevindt). Ubuntu "onthoudt" uw wachtwoord standaard gedurende 15 minuten, zodat u niet telkens uw wachtwoord hoeft te typen.

bash - Een tekstinterface voor interactie met de computer. Het is belangrijk om het verschil te begrijpen tussen login, niet-login, interactieve en niet-interactieve shells:

  • login-shell: een login-shell meldt u aan bij het systeem als een opgegeven gebruiker, hiervoor is een gebruikersnaam en wachtwoord nodig. Wanneer je slaat ctrl+alt+F1 om in te loggen op een virtuele terminal die u krijgt na een succesvolle aanmelding van een login-shell.
  • shell die niet inlogt: een shell die wordt uitgevoerd zonder in te loggen, hiervoor is een momenteel ingelogde gebruiker vereist. Wanneer u een grafische terminal in gnome opent, is dit een shell zonder login.
  • interactieve shell: een shell (login of niet-login) waar je interactief commando's kunt typen of onderbreken. Bijvoorbeeld een kabouterterminal.
  • niet-interactieve shell: een (sub) shell die waarschijnlijk wordt uitgevoerd vanuit een geautomatiseerd proces. U zult noch input noch output zien.

sudo su gesprekken sudo met het commando su. Bash wordt genoemd als interactieve niet-login shell. Dus bash wordt alleen uitgevoerd .bashrc. Je ziet dat je na het overschakelen naar root nog steeds in dezelfde directory zit:

user@host:~$ sudo su
root@host:/home/user#

sudo su - Deze keer is het een login-shell, dus /etc/profile, .profile en .bashrc worden uitgevoerd en je zult jezelf in de hoofdmap van de root vinden met de root-omgeving.

sudo -i Het is bijna hetzelfde als sudo su - De optie -i (aanvankelijke simulatie simuleren) voert de shell uit die is opgegeven door het wachtwoorddatabase-item van de doelgebruiker als inlogshell. Dit betekent dat inlogspecifieke bronbestanden zoals .profile, .bashrc of .login wordt door de shell gelezen en uitgevoerd.

sudo /bin/bash Dit betekent dat je belt sudo met het commando /bin/bash. /bin/bash is gestart als niet-login shell, dus alle dot-bestanden worden niet uitgevoerd, maar bash zelf leest .bashrc van de bellende gebruiker. Uw omgeving blijft hetzelfde. Je huis zal niet de thuisbasis van root zijn. Dus je bent root, maar in de omgeving van de bellende gebruiker.

sudo -sleest de $SHELL variabele en voert de inhoud uit. Als $SHELL bevat /bin/bash het roept op sudo /bin/bash (zie hierboven).

Controleren: Om te controleren of u zich in een login-shell bevindt of niet (werkt alleen in bash omdat shopt is een ingebouwd commando):

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

257
2017-11-13 09:43



Gewoon een verduidelijking: sudo staat een toegestane gebruiker toe om een ​​commando uit te voeren als de superuser of een andere gebruiker. Hoe dan ook, +1 voor uw inspanningen. - Radu Rădeanu
@chaos Bedankt voor dit uitstekende antwoord! Het beantwoordt meestal mijn vragen, dus ik ging door en markeerde de vraag beantwoord, maar ik begrijp niet wanneer het wenselijk is om een ​​bepaalde shell te draaien. Ik gebruik echt alleen Ubuntu via de opdrachtregel en ik vind mijn meest voorkomende gebruik voor het openen van een root gebruikerssessie (vs. gebruik sudo) is wanneer ik iets doe dat veel gebruikt moet worden root privileges, zoals bij het installeren van iets nieuws of het uitvoeren van een belangrijke herconfiguratie. Ik heb gebruikt sudo /bin/bash, maar blijkbaar heeft die methode om de een of andere reden een slechte rap die ik niet begrijp. - Paul
Het is ook "correcter" om te zeggen dat su staat voor switchgebruiker, in plaats van supergebruiker. D.w.z. voer een php-script uit: su www-data /usr/share/script.php of alleen su www-data voor interactieve shell. Maar su zonder gebruikersnaam zal de root (super user) account zijn. - oblivian
Chaos - "shopt -q login_shell && echo 'Login shell' || echo 'Geen inlogshell'" Dit soort suggesties zie ik vaak, maar waarom zou het zo lang duren? De && operator betekent als exit code 0 en vervolgens "next commando" en de dubbele pipe (||) betekent else (if not 0) en voer dan deze opdracht uit. Dus wat het eigenlijk zegt als exit code 0 dan "Login Shell" echo, als exit code 1 (mislukt) dan echo "Geen login". Waarom niet gewoon "shopt -q login_shell; echo $?" $? betekent de resultaat- / eindcode van de voorgaande opdracht. In de meeste, zo niet alle, programma's 0 betekent succes, 1 of meer middelen falen. Dus als de echo 0 = succes is ... - oblivian
@Paul: sudo -i wordt voorgesteld. Lees hier: ubuntuforums.org/showthread.php?t=1817402 en hier: unix.stackexchange.com/questions/98531/... - Marco Sulla