Que fait la commande «sudo -s» et comment est-elle utilisée dans cet exemple?

8

J'ai le doute suivant. Dans un tutoriel lié à une installation logicielle que je suis, disons que je dois exécuter les commandes suivantes (je le fais dans un shell ssh , donc cette liste d'étapes se termine par la exitcommande):

sudo -s
apt-get update
apt-get install -y build-essential libtool libcurl4-openssl-dev libncurses5-dev libudev-dev autoconf automake screen
exit

Mes doutes sont:

Que fait exactement le -sparamètre après la sudocommande?

En recherchant sur le web, j'ai trouvé que:

‑S [commande] L'option ‑s (shell) exécute le shell spécifié par la variable d'environnement SHELL s'il est défini ou le shell comme spécifié dans la base de données de mots de passe. Si une commande est spécifiée, elle est transmise au shell pour exécution via l'option ‑c du shell. Si aucune commande n'est spécifiée, un shell interactif est exécuté

Il me semble que l'on sudo -sexécute une commande en utilisant la variable d'environnement du shell.

Mais ce n'est pas clair pour moi: dans ce cas quelle est la commande exécutée avec la variable d'environnement? (il s'exécute uniquement sudo -set non sudo -s [command]).

AndreaNobili
la source

Réponses:

7

La réponse simple est qu'elle vous donne un shell racine. C'est à cela qu'il sert ici. Il y a une bonne comparaison technique entre les su, sudo -i, sudo -set des sudo suméthodes sur Unix.SE mais c'est vraiment pas pertinent. Le code aurait pu utiliser n'importe lequel et aurait fonctionné.

Le nugget d'aide signifie plusieurs choses:

  • Il recherche une commande dans la $SHELLvariable d'environnement. Si vous courez, echo $SHELLvous verrez probablement /bin/bash. Cela signifie que vous obtiendrez une instance racine de Bash. Je suis sûr que si vous y étiez, zshcela signifierait que vous obtenez une instance racine de zsh.

  • Si $SHELLest vide, il revient au shell par défaut défini dans /etc/passwdpour cet utilisateur.

  • Si vous fournissez une commande (par exemple sudo -s whoami), elle s'exécute en fait:sudo /bin/bash -c "whoami"

  • Si vous ne passez pas de commande, elle ne passe pas d' -cargument, vous obtenez donc un shell interactif.

J'ai utilisé l'expression "root" plusieurs fois. Par défaut, il sudo s'agit d'exécuter des choses en tant que root, mais sudo(et su) peut exécuter des choses en tant que d'autres utilisateurs (si vous êtes autorisé à le faire). Je ne le dis que pour les pédants qui vont crier, ce sudo -s -u $USERqui ne leur donne pas de racine comme je l'ai promis -sci-dessus.


Et à mon humble avis, il est vraiment stupide de devenir root pour seulement deux commandes, sans oublier que cela pourrait laisser un utilisateur exécuter accidentellement d'autres commandes en tant que root. Si vous voulez ou devez exécuter quelque chose en tant que root, créez simplement la commande avec sudo:

sudo apt-get update
sudo apt-get install -y build-essential libtool libcurl4-openssl-dev libncurses5-dev libudev-dev autoconf automake screen

Je serais douteux de tout tutoriel qui suggère d'obtenir un shell root, sauf dans les cas où vous avez des bucketloads de commandes à exécuter ... Et même là, il y a des scripts.

Oli
la source
Explication parfaite. Maintenant, c'est plus clair. Un dernier doute. Si je pré-ajoute sudo à toutes les commandes précédentes, j'obtiendrai le même résultat final? est-ce vrai ou est-ce que je manque quelque chose?
AndreaNobili
@Oli vous avez raison à 100% sur Zsh, "sudo -s" se connecte dans un shell "root" en tant que "root" et non super utilisateur.
RCF
@AndreaNobili Ouais, c'est à ça que sudosert généralement; exécuter une commande en tant que root sans avoir à vous connecter manuellement en tant que root.
Oli
Pour info j'ai posté une réponse en dessous de la vôtre et mon point de vue sudo -sest radicalement différent en raison de mes connaissances limitées et se produisant dans la situation par accident. Vous voudrez peut-être encore lire ma "humble" réponse et éventuellement rafraîchir votre réponse vieille de 1/2 décennie.
WinEunuuchs2Unix
0

sudo -sexécutera une commande dans le répertoire courant comme le ferait un utilisateur normal. Par exemple:

rick@alien:~/askubuntu$ suspendtime
Nov 12 14:06:27 to Nov 12 17:22:21 lasting 11,754 seconds
Nov 12 22:23:37 to Nov 13 04:24:37 lasting 21,660 seconds
(... SNIP ...)
Dec 02 21:58:49 to Dec 03 04:20:52 lasting 22,923 seconds
Dec 03 05:52:43 to Dec 03 16:37:44 lasting 38,701 seconds

Linux uptime 1,859,356 seconds (21 days, 12 hours, 29 minutes, 16 seconds)
45 Suspends 1,173,341 seconds (13 days, 13 hours, 55 minutes, 41 seconds)
Real uptime 686,015 seconds (7 days, 22 hours, 33 minutes, 35 seconds)

rick@alien:~/askubuntu$ sudo suspendtime
sudo: suspendtime: command not found

rick@alien:~/askubuntu$ sudo -H suspendtime
sudo: suspendtime: command not found

rick@alien:~/askubuntu$ sudo -s suspendtime
Nov 12 14:06:27 to Nov 12 17:22:21 lasting 11,754 seconds
(...SNIP...)
Dec 03 05:52:43 to Dec 03 16:37:44 lasting 38,701 seconds

Linux uptime 1,859,431 seconds (21 days, 12 hours, 30 minutes, 31 seconds)
45 Suspends 1,173,341 seconds (13 days, 13 hours, 55 minutes, 41 seconds)
Real uptime 686,090 seconds (7 days, 22 hours, 34 minutes, 50 seconds)

Bien sûr, utiliser -sau lieu de préfixer la commande avec ./peut ne pas être un si grand gain de temps.

WinEunuuchs2Unix
la source