Vraag Aliassen niet beschikbaar bij gebruik van sudo


Ik speelde vandaag met aliassen en ik merkte dat aliassen tijdens het gebruik niet beschikbaar lijken te zijn sudo:

danny@kaon:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

danny@kaon:~$ ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //

danny@kaon:~$ sudo -i
root@kaon:~# ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
root@kaon:~# exit
logout

danny@kaon:~$ sudo ll -d /
sudo: ll: command not found

Is er een reden waarom u geen aliassen kunt gebruiken tijdens het gebruik sudo?


133
2018-01-17 22:47


oorsprong


Heb je die alias aangegeven in .bashrc on / root / - Luciano Facchinelli
@LucianoFacchinelli: /root/.bashrc wordt niet gelezen bij het uitvoeren van een opdracht via sudo. - Flimm
serverfault.com/questions/61321/how-to-pass-alias-through-sudo - Ciro Santilli 新疆改造中心 六四事件 法轮功
@Flimm: hoe zit het? sudo -i? - Evi1M4chine


antwoorden:


Voeg de volgende regel toe aan uw ~/.bashrc:

alias sudo='sudo '

Van de bash handleiding:

Met aliassen kan een tekenreeks worden vervangen door een woord als dit wordt gebruikt als het eerste woord van een eenvoudige opdracht. De shell onderhoudt een lijst met aliassen die kunnen worden in- en uitgeschakeld met de ingebouwde opdrachten alias en unalias.

Het eerste woord van elke eenvoudige opdracht, indien niet vermeld, wordt gecontroleerd om te zien of het een alias heeft. Als dat zo is, wordt dat woord vervangen door de tekst van de alias. De tekens '/', '$', '`', '=' en de metatekens in de schaal of de bovenstaande citaten kunnen niet in een aliasnaam worden weergegeven. De vervangende tekst kan elke geldige shell-invoer bevatten, inclusief shell-metatekens. Het eerste woord van de vervangende tekst wordt getest op aliassen, maar een woord dat identiek is aan een alias dat wordt uitgebreid, wordt niet een tweede keer uitgebreid. Dit betekent dat iemand bijvoorbeeld ls kan zijn voor "ls-F", en Bash probeert de vervangende tekst niet recursief uit te breiden. Als het laatste teken van de aliaswaarde een spatie of tabteken is, wordt ook het volgende opdrachtwoord na de alias gecontroleerd op aliasuitbreiding.

(Nadruk van mij).
Bash controleert alleen het eerste woord van een commando voor een alias, alle woorden daarna worden niet gecontroleerd. Dat betekent in een commando zoals sudo ll, alleen het eerste woord (sudo) wordt gecontroleerd door bash voor een alias, ll wordt genegeerd. We kunnen bash vertellen om het volgende woord na het alias te controleren (d.w.z. sudo) door een spatie toe te voegen aan het einde van de aliaswaarde.


209
2018-01-17 23:08



Best mooie oplossing. - ulidtko
Dus eigenlijk komt het probleem neer op het feit dat sudo eenvoudigweg zodanig is geprogrammeerd dat het geen alias's controleert en daarom niet wordt gevonden? - kemra102
@DannyRoberts Zie mijn bijgewerkte antwoord. - Isaiah
Het lezen van de documentatie is natuurlijk heel nuttig :-) - biocyberman
Zal dit breken als ik een sudo-vlag gebruik, bijvoorbeeld sudo -H ll? - Mark E. Haase


Ik heb er een Bash-functie voor geschreven die schaduwen geeft sudo.

Het controleert of ik een alias heb voor het opgegeven commando en voert het gealiaste commando uit in plaats van het letterlijke commando sudo in dat geval.

Hier is mijn functie als one-liner:

sudo() { if alias "$1" &> /dev/null ; then $(type "$1" | sed -E 's/^.*`(.*).$/\1/') "${@:2}" ; else command sudo $@ ; fi }

Of mooi geformatteerd:

sudo() { 
    if alias "$1" &> /dev/null ; then 
        $(type "$1" | sed -E 's/^.*`(.*).$/\1/') "${@:2}"
    else 
        command sudo "$@"
    fi 
}

U kunt het toevoegen aan uw .bashrc bestand, vergeet niet om het te bron- len of herstart uw terminalsessie achteraf om de wijzigingen door te voeren.


5
2017-09-27 09:19





De aliassen zijn gebruikersspecifiek - u moet ze definiëren /root/.bashrc


3
2018-01-17 23:01



Ze staan ​​al onder /root/.bashrc, dus dat is geen probleem - kemra102
Dit antwoord zou alleen correct zijn voor de situatie waarin je de shell zelf als root draait, zoals met sudo -s of sudo -i (en enkel en alleen als het alleen wordt uitgevoerd om een ​​rootshell te krijgen, niet met de sudo -s command... of sudo -i command... formulieren) of sudo bash of sudo suof de situatie waarbij u rootaanmeldingen hebt ingeschakeld en op die manier een rootshell hebt. Wanneer een niet-rootgebruiker wordt uitgevoerd sudo command... van hun eigen shell, alias uitbreiding wordt gedaan door hun eigen niet-root shell. sudo breidt zelf niet aliassen uit, dus zoals toegepast op de situatie beschreven in de vraag, dit antwoord is onjuist. - Eliah Kagan


@Alvins-antwoord is het kortste antwoord. Ongetwijfeld! :-)

Ik dacht echter aan een opdrachtregeloplossing voor voer een alias-opdracht uit in sudo waar het niet nodig is om opnieuw te definiëren sudo Met een alias opdracht.

Dit is mijn voorstel voor diegenen voor wie het interessant is:

Oplossing

type -a <YOUR COMMAND HERE> | grep -o -P "(?<=\`).*(?=')" | xargs sudo

Voorbeeld

In het geval van de ll opdracht

type -a ll | grep -o -P "(?<=\`).*(?=')" | xargs sudo

Uitleg

wanneer je een alias hebt (zoals: ll) het bevel type -a retourneert de aliased expressie:

$type -a ll
ll is aliased to `ls -l'

met grep je selecteert in dat geval de tekst tussen het accent `en apostrof ' ls -l

En xargs voert de geselecteerde tekst uit ls -l als parameter van sudo.

Ja, een beetje langer maar helemaal schoon;-) Het is niet nodig om opnieuw te definiëren sudo als alias.


3
2018-02-15 19:37



Is misschien eenvoudiger als u de alias ingebouwd, omdat de uitvoer schoner is. alias ll uitgangen alias ll='ls -ahlF'. - muru
Hier is de versie waarin de suggestie van @ muru is verwerkt: alias ll | sed "s/.*'\(.*\)'.*/\1/g" | xargs sudo. - ACK_stoverflow
Ik denk dat het punt van de oorspronkelijke vraag was om werk te besparen door het niet te hoeven doen sudo -iten eerste om het aliased-commando uit te voeren, maar dit meteen te doen. Het hebben van zo'n complexe opdracht verslaat dat. Je kunt het eerste doen, en veel sneller zijn. - Evi1M4chine


Ik heb nog een leuke oplossing, die ook een beetje vertrouwen toevoegt:

Gebruik bash completion om woorden achter automatisch te vervangen sudo met hun aliassen bij het indrukken van het tabblad.

Bewaar deze als /etc/bash_completion.d/sudo-alias.bashcomp, en het zou automatisch geladen moeten worden bij het opstarten van een interactieve shell:

_comp_sudo_alias() { from="$2"; COMPREPLY=()
  if [[ $COMP_CWORD == 1 ]]; then
    COMPREPLY=( "$( alias -p | grep "^ *alias $from=" | sed -r "s/^ *alias [^=]+='(.*)'$/\1/" )" )
    return 0
  fi
  return 1
}
complete -o bashdefault -o default -F _comp_sudo_alias sudo

Meld u vervolgens aan bij een nieuwe terminal en u moet goed zijn om te gaan.


1
2017-09-08 16:09



Er is een manier om een ​​lijst met aliassen te krijgen, speciaal bedoeld voor voltooiing: compgen -a - muru
@muru: bedankt, maar in dit geval heb ik de waarden nodig, niet de sleutels. Dus wat de alias die werd ingevoerd zal worden vervangen door. Je typt de alias, (zoals in sudo ll), druk op [TAB ↹] en het script vindt ll in de lijst met alias-toewijzingen, verwijdert wat eraan is toegewezen en voegt dat toe. (Dus je zou b. sudo ls -lahvF --color=auto --time-style=long-iso.) - Evi1M4chine


Ik heb een andere oplossing waarbij je niet hoeft toe te voegen sudo als een alias. Ik gebruik Linux Mint 17.3, maar het zou behoorlijk moeten lijken op Ubuntu.

Wanneer je root bent, dan is de .profile wordt uitgevoerd vanuit de homedirectory. Als u niet weet wat de homedirectory onder root is, kunt u dit controleren met:

sudo su
echo $HOME

Zoals je kunt zien, de thuisbasis van root is /root/. Controleer de inhoud:

cd $HOME
ls -al

Er zou een moeten zijn .profile het dossier. Open het bestand en voeg de volgende regels toe:

if [ "$BASH" ]; then
    if [ -f ~/.bash_aliases];then
        . ~/.bash_aliases 
    fi
fi

Kortom, wat dit bash-script doet, is controleren op een bestand met de naam .bash_aliases. Als de bestanden aanwezig zijn, wordt het bestand uitgevoerd.

Red de .profile bestand en maak je aliassen in .bash_aliases. Als u het aliases-bestand al hebt, kopieert u het bestand naar deze locatie

Herlanceer de terminal en je bent klaar om te gaan!


0
2018-06-10 21:06





Het beste gestemde antwoord is geweldig. Maar als je typt sudo -i en verheffen naar een sudo prompt (#) zult u niet de aliassen hebben die u graag gebruikt.

Om uw aliassen (en al het andere) te gebruiken bij de # prompt, gebruik:

sudo cp "$PWD"/.bashrc /root/.bashrc

Waar "$ PWD" automatisch wordt uitgebreid naar "/ home / YOUR_USER_NAME"


0
2017-11-25 02:50