Comment passer d'un alias à travers sudo

32

J'ai un alias qui transmet certains paramètres à un outil que j'utilise souvent. Parfois je cours seul, parfois sous sudo. Malheureusement, bien sûr, sudo ne reconnaît pas le pseudonyme.

Quelqu'un a-t-il une idée sur la façon de transmettre le pseudonyme?

Dans ce cas, j’ai un tas d’options pour perl lors du débogage:

alias pd='perl -Ilib -I/home/myuser/lib -d'

Parfois, je dois déboguer mes outils en tant que root, donc au lieu d’exécuter:

pd ./mytool --some params

J'ai besoin de l'exécuter sous sudo. J'ai essayé de nombreuses manières:

sudo eval $(alias pd)\; pd ./mytool --some params
sudo $(alias pd)\; pd ./mytool --some params
sudo bash -c "$(alias pd)\; pd ./mytool --some params"
sudo bash -c "$(alias pd); pd ./mytool --some params"
sudo bash -c eval\ "$(alias pd)\; pd ./mytool --some params"
sudo bash -c eval\ "'$(alias pd)\; pd ./mytool --some params'"

J'espérais trouver un moyen agréable et concis de s'assurer que mon alias actuel de pd était pleinement utilisé (au cas où je devrais le modifier plus tard), même si certaines de mes tentatives n'étaient pas du tout concises. Mon dernier recours est de le mettre dans un script shell et de le placer quelque part que sudo pourra trouver. Mais les pseudonymes sont tellement utiles parfois, alors c'est un dernier recours.

Tanktalus
la source

Réponses:

50

Une solution très élégante peut être trouvée dans Archlinux-Wiki:

alias sudo='sudo '
# whitespace ---^

travaille à transmettre tous les alias à sudo.

Source: http://wiki.archlinux.org/index.php/Sudo#Passing_aliases

Slizzered
la source
16
C'est un bon tour! Pour les plus curieux, l'explication de la section alias dans la page de manuel bash:A trailing space in value causes the next word to be checked for alias substitution when the alias is expanded.
Russell Davis
1
Cela devrait vraiment être la réponse acceptée.
Adrian Frühwirth
C'est dommage que cela ne fonctionne pas pour les fonctions.
Ciro Santilli a annoncé
2
Note: Supposons que vous ayez à passer une option à sudo, tout en voulant garder cette sudoastuce en même temps. Même cela peut être fait: pour utiliser à nouveau les options, utilisez \sudo. La barre oblique inverse remplacera l'alias. (Beaucoup ne semblent pas savoir à ce sujet). De cette façon, vous pouvez ( danger! ) Même supprimer des fichiers sans aucun avertissement, en remplaçant le plus alias rm='rm -i'souvent spécifié dans .bash-aliases, simplement en tapant \rm file-to-delete.
erreur de syntaxe le
11

Je ne suis pas très clair sur ce que vous essayez de faire. Je peux voir deux façons:

Le droit chemin

alias pd='sudo perl -Ilib -I/home/myuser/lib -d'

En exécutant ensuite pd ./mytool, votre commande de débogage sera exécutée en tant que root, tout en préservant les avantages de sudo (suivi d'audit, ne fonctionnant pas à partir d'un shell root).

Exemple:

insyte $ alias sid = 'sudo id'
insyte $ sid
uid = 0 (racine) gid = 0 (racine) groupes = 0 (racine)

La manière facile

Ajoutez les alias à root .bashrcet utilisez-les à sudo -ichaque fois que vous êtes en root.

root # echo 'alias fb = "echo foo bar"' >> /root/.bashrc
root # exit
sortie
insyte $ sudo -i
root # fb
foo bar
Insyte
la source
4

Juste deux alias et utiliser une variable

Je ne vois pas pourquoi utiliser awkou à cutmoins que l'alias principal ne soit défini qu'une seule fois afin de faciliter la modification. Si c'est le cas, cela fonctionne:

# ... in .bashrc ...
pd='perl -Ilib -I/home/myuser/lib -d'
alias pd="$pd"
alias spd="sudo $pd"

Voici une fonction simpliste pour créer des paires d'alias telles que celle ci-dessus:

mkap () {
    alias $1=$2
    alias s$1="sudo $2"
}

Utiliser:

mkap pd 'perl -Ilib -I/home/myuser/lib -d'
mkap ct 'cat'

Maintenant vous avez pdet spdplus ctet sct.

$ ct /etc/shadow
cat: /etc/shadow: Permission denied
$ sct /etc/shadow
[sudo] password for dennis:
root:[censored]...
$ alias
alias ct='cat'
alias pd='perl -Ilib -I/home/myuser/lib -d'
alias sct='sudo cat'
alias spd='sudo perl -Ilib -I/home/myuser/lib -d'
En pause jusqu'à nouvel ordre.
la source
4

J'aimerais pouvoir marquer deux réponses comme "correctes". En combinant le bon chemin du message perspicace d’ Insyte avec la solution awk (ou cut) de Bill Weiss , j’ai trouvé ceci:

alias spd="sudo $(alias pd | cut -d\' -f2)"

Maintenant, je vais simplement mettre cela dans une fonction shell dans mon .bashrc ou quelque chose du genre, puis créer les versions "s" de tous mes alias que je souhaite utiliser en tant que root.

Mise à jour : légère modification de la fonction simpliste de Dennis Williamson pour la rendre un peu plus facile à utiliser:

 salias()
 {
   local a c
   a=$(echo "$1" | cut -f1 -d=)
   c=$(echo "$1" | cut -f2- -d=)
   alias $a="$c"
   alias s$a="sudo $c"
 }

Cela signifie que je dois juste mettre "s" devant toute la commande. Au lieu de:

alias pd='perl -Ilib -I/home/myuser/lib -d'

Je viens d'ajouter le s à l'avant.

salias pd='perl -Ilib -I/home/myuser/lib -d'

Et j'ai fini. Bien sûr, l'ordinateur fait un peu plus de travail, mais c'est à cela que sert l'ordinateur. :-)

Merci!

Tanktalus
la source
Vous pouvez (ou devriez être en mesure) de marquer des choses comme acceptées, ce qui revient à dire qu'elles sont correctes :)
Bill Weiss
Droite - Je veux marquer deux réponses comme correctes :-P
Tanktalus le
3
Pourquoi pas la réponse de Slizzered? alias sudo="sudo "fonctionne parfaitement.
trusktr
3

Ne serait-il pas plus simple de pirater un script contenant vos options, puis de le placer quelque part dans l'un des dossiers constituant le chemin d'accès du compte et de la racine classiques? Cela ne prendrait vraiment pas beaucoup de script.

#!/bin/bash
exec perl -Ilib -I/home/myuser/lib -d $*
Zoredache
la source
En fait, il doit s'agir de "$ @" au lieu de $ *, et c'est en partie la raison pour laquelle je tente généralement de l'éviter. ;-) Cela fonctionne, cela gaspille tout un tas d’espace disque par rapport à ce qu’il contient.
Tanktalus
3

C'est rugueux, mais ça marche ici:

houdini@clanspum:~/ > alias fb
fb='echo foo bar'
houdini@clanspum:~/ > alias fb | awk -F\' '{print $2}'
echo foo bar
houdini@clanspum:~/ > sudo sh -c "$(alias fb | awk -F\' '{print $2}')"
foo bar
houdini@clanspum:~/ > sudo sh -c "$(alias fb | awk -F\' '{print $2}') a b c"
foo bar a b c
houdini@clanspum:~/ > fb
foo bar
houdini@clanspum:~/ > fb a b c
foo bar a b c
Bill Weiss
la source
J'ai collé ici une solution incomplète, puis modifié pour y remédier. L'actuel a raison. Un vote gratuit à la première personne à commenter en expliquant ce qui se passe ici :)
Bill Weiss
J'espérais un moyen plus simple que awk, mais j'espère! = Réalité parfois ;-) Apparemment, "cut -f2-d \ '" fonctionnerait aussi bien que awk, et serait un peu plus court.
Tanktalus
Ouais, couper marcherait, je l'oublie toujours.
Bill Weiss
3

Ajoutez un préfixe "sudo" aux alias sélectionnés ET aux commandes de votre ~/.bashrctype:

#a regular alias
alias pd='perl -Ilib -I/home/myuser/lib -d'

#sudofy (command id, alias pd - add others to this list)
for cmd in id pd;
      do alias "s$cmd"="sudo $cmd";
done;

la source
Cela ne fonctionne pas - c'est de là que j'ai commencé. L'avez-vous essayé?
Tanktalus
Beau concept. Je pense que alias sudo="sudo "c'est plus facile cependant.
trusktr
3

Comme posté à quelques reprises, faites dans '.bashrc':

alias sudo = 'sudo'

La raison pour laquelle est expliquée dans 'man bash' et 'help alias':

alias: alias [-p] [nom [= valeur] ...] Définissez ou affichez des alias.

Without arguments, `alias' prints the list of aliases in the reusable
form `alias NAME=VALUE' on standard output.

Otherwise, an alias is defined for each NAME whose VALUE is given.
**A trailing space in VALUE causes the next word to be checked for
alias substitution when the alias is expanded.**
Sixerjman
la source
1

Vous voulez quelque chose comme ça:

(alias; echo "exec < /dev/tty") | sudo bash  -i
géocar
la source
Je peux me tromper, mais ISTR qui bash -i(i = interactif) est uniquement v4.0. Donc, sur un serveur plus ancien où la bashv3 était toujours en cours d'exécution, cela échouerait probablement. Mais prouve-moi que j'ai tort, n'importe qui, vas-y;)
erreur de syntaxe
@ Syntaxerror - Vous vous souvenez de mal. -iBourne shell, voir: pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html
geocar le
Wow, je ne m'attendais pas à recevoir une réponse aussi tôt pour un message de plus de 6 ans ... Pourquoi, je l'aurais peut-être confondu #!/bin/bash -iaprès le shebang, ce qui n'est apparemment pas le même (?). Pour couper une longue histoire courte, en utilisant historydans un bashscénario (et non pas sur la ligne de commande « live ») va exiger de l' -ioption que je ne pouvais pas faire fonctionner sur un serveur avec « seulement » bashv3 installé. Et c'est un fait.
Erreur de syntaxe le
1

Je ne sais pas si c'est la chose la plus sage à faire sur une boîte de production, mais j'utilise localement

alias sudo="sudo -E"

L' option -E ( preserve environment ) remplacera l'option env_reset dans sudoers (5)). Il n'est disponible que lorsque la commande correspondante a la balise SETENV ou que l'option setenv est définie dans sudoers (5).

Eddie B
la source
-1

Pouvez-vous ajouter l'alias à .bashrc de la racine ou simplement exécuter .bashrc via sudo avant votre commande?

sudo (. ~yourlogin/.bashrc; pd ./mytool --some params)
Robert Swisher
la source
1
Euh, ça n'a même pas presque marché non plus. C'est en fait assez proche de certaines des choses que j'ai essayées ci-dessus, mais est plus éloigné de la syntaxe shell / sudo actuelle.
Tanktalus