TL; DR: Vous pouvez utiliser sudo -i
pour exécuter une fonction définie /root/.bashrc
(mais pas un alias) et également avoir accès aux variables exportées à partir de ce fichier:
arguments de la commande sudo -i
Cependant, les alias ne fonctionnent pas, mais vous pouvez facilement les convertir en fonctions si vous souhaitez les rendre disponibles sudo -i
.
Lisez la suite pour une analyse complète et plus de détails.
Il y a quelques problèmes ici, certains dans le fonctionnement de sudo et d'autres dans le fonctionnement de bash lui-même ...
Par défaut, sudo
ne recherchera que les commandes et contournera le shell, donc la simple exécution sudo ll
ne fonctionnera que s'il y a un ll
exécutable dans l'un des répertoires de $PATH
. Donc, pour utiliser des alias (ou des fonctions), vous devez vous assurer qu'un shell est invoqué dans le cadre du processus.
Une façon serait d'exécuter quelque chose comme sudo sh
ou sudo bash
, bien que moderne sudo
(je teste ceci sur sudo 1.8.19p1) a des options -s
et -i
à cet effet.
Donc, un essai serait quelque chose comme sudo -s ll
(ce qui équivaut à sudo bash -c 'll'
, en supposant que votre $SHELL
est Bash, ce qui semble être le cas sur la base de ce que rcfile
vous avez mentionné.) Mais cela ne fonctionne pas non plus, car il démarre le shell dans un environnement non interactif, mode sans connexion, qui ne lit aucun de ses fichiers de démarrage. C'est essentiellement la même chose que si vous écrivez un script shell et l'utilisez #!/bin/bash
pour l'exécuter. Les alias (et fonctions) que vous avez dans votre ~/.bashrc
ne seront pas accessibles à partir de ce script ...
La prochaine -i
option est donc de créer un shell de connexion. C'est plus prometteur, car il va lire vos fichiers de démarrage! Et pourtant, sudo -i ll
(équivalent à sudo bash -l -c 'll'
) ne fonctionnera toujours pas. Alors, comment est-ce possible, étant donné qu'il a lu la définition de l' ll
alias?
Eh bien, l'explication suivante ici est que, par défaut, bash ne développera pas les alias, sauf lorsque le shell est interactif ... Ce shell démarré par sudo -i
(ou bash -l
) est un shell de connexion , mais toujours pas interactif.
La prochaine étape consiste donc à obtenir un shell interactif , qui fonctionne alors :
sudo bash -i -c 'll'
(Avoir à la fois une connexion et une interaction est également très bien, bien sûr, bash -l -i -c ...
fonctionnera.)
Une autre alternative est de continuer à utiliser un shell de connexion (non interactif) mais lui demander explicitement d'étendre les alias, donc cela fonctionnera également:
sudo bash -l -O expand_aliases -c 'll'
(Le cas où bash était interactif n'avait pas besoin d'un shell de connexion , car cela suffit pour lire les fichiers d'initialisation, mais celui-ci doit -l
les lire.)
Ce sont des lignes de commande assez longues ... Et elles nécessitent également que vous citiez la commande shell entière, donc si vous appelez un alias avec des arguments, vous devrez transformer tout cela en une chaîne ... Donc c'est un peu maladroit à utiliser ...
Notez que plus tôt, je parlais d'alias et de fonctions ... C'était exprès, car les fonctions sont en fait beaucoup plus pratiques ici. Vous n'avez besoin de rien de spécial (comme avoir un shell interactif ou définir une option spécifique) pour exécuter des fonctions sur un shell, tant que vous vous approvisionnez en définition.
Donc, si vous définissez ll
une fonction au lieu d'un alias, vous pourrez l'utiliser directement avec le -i
raccourci de sudo :
sudo -i ll
Et si vous avez une ligne de commande plus longue, avec des arguments, vous pouvez également les passer directement ici:
sudo -i ll -C -R /etc
(Comparez avec sudo bash -i -c 'll -C -R /etc'
.)
Les fonctions sont également beaucoup plus flexibles et généralement plus faciles à gérer ... Il est généralement facile de convertir un alias en fonction, la seule mise en garde est de toujours utiliser "$@"
là où vous vous attendez à ce que des arguments supplémentaires soient pris (généralement à la fin de la alias.)
Par exemple, cet alias:
alias ll='ls $LS_OPTIONS -l'
Pourrait être transformé en cette fonction:
ll () {
ls $LS_OPTIONS -l "$@"
}
Ils sont, dans la plupart des cas, équivalents. Et, comme mentionné précédemment, la fonction doit être accessible directement depuis sudo -i
, c'est donc un bonus supplémentaire.
J'espère que cette réponse et cette explication vous seront utiles!
/root/.bashrc
mais vraiment ce que le Q est après, ce sont les alias de ce fichier - ce n'est pas possible par cela - unix.stackexchange.com/questions/1496/… .