Domanda Alias ​​non disponibili quando si utilizza sudo


Oggi stavo giocando con gli alias e ho notato che gli alias non sembrano essere disponibili durante l'utilizzo 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

C'è qualche ragione per cui non puoi usare gli alias mentre stai usando sudo?


133
2018-01-17 22:47


origine


Hai dichiarato quegli alias in .bashrc su / root / - Luciano Facchinelli
@LucianoFacchinelli: /root/.bashrc non viene letto quando si esegue un comando tramite sudo. - Flimm
serverfault.com/questions/61321/how-to-pass-alias-through-sudo - Ciro Santilli 新疆改造中心 六四事件 法轮功
@Flimm: che dire sudo -i? - Evi1M4chine


risposte:


Aggiungi la seguente linea al tuo ~/.bashrc:

alias sudo='sudo '

Dal manuale di bash:

Gli alias consentono a una stringa di essere sostituita da una parola quando viene utilizzata come prima parola di un comando semplice. La shell mantiene un elenco di alias che possono essere impostati e non impostati con i comandi incorporati di alias e uniasias.

La prima parola di ogni comando semplice, se non quotata, viene controllata per vedere se ha un alias. In tal caso, quella parola viene sostituita dal testo dell'alias. I caratteri '/', '$', '`', '=' e uno qualsiasi dei metacaratteri della shell o citando i caratteri elencati sopra potrebbero non apparire in un nome alias. Il testo di sostituzione può contenere qualsiasi input di shell valido, inclusi i metacaratteri della shell. La prima parola del testo sostitutivo viene testata per gli alias, ma una parola identica a un alias espanso non viene espansa una seconda volta. Ciò significa che si può alias ls su "ls -F", per esempio, e Bash non tenta di espandere ricorsivamente il testo sostitutivo. Se l'ultimo carattere del valore alias è uno spazio o un carattere di tabulazione, anche la successiva parola di comando che segue l'alias viene controllata per l'espansione dell'alias.

(Enfasi mia).
Bash controlla solo la prima parola di un comando per un alias, qualsiasi parola dopo quella non è selezionata. Ciò significa in un comando come sudo ll, solo la prima parola (sudo) viene verificato da bash per un alias, ll è ignorato Possiamo dire a bash di controllare la parola successiva dopo l'alias (cioè sudo) aggiungendo uno spazio alla fine del valore alias.


209
2018-01-17 23:08



Bella soluzione. - ulidtko
Quindi, in pratica, il problema si riduce al fatto che sudo è semplicemente programmato in modo tale da non controllare l'alias, quindi ll non viene trovato? - kemra102
@DannyRoberts Vedi la mia risposta aggiornata. - Isaiah
Leggendo la documentazione ovviamente ne ricava un sacco di benefici :-) - biocyberman
Si interromperà se uso un flag sudo, ad es. sudo -H ll? - Mark E. Haase


Ho scritto una funzione Bash per ciò che le ombre sudo.

Controlla se ho un alias per il comando dato ed esegue il comando alias invece di quello letterale con sudo in quel caso.

Ecco la mia funzione di one-liner:

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

O ben formattato:

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

Puoi aggiungerlo al tuo .bashrc file, non dimenticare di cercarlo o riavviare la sessione terminale in seguito per applicare le modifiche però.


5
2017-09-27 09:19





Gli alias sono specifici dell'utente: devi definirli in /root/.bashrc


3
2018-01-17 23:01



Sono già in /root/.bashrc, quindi non è un problema - kemra102
Questa risposta sarebbe corretta solo per la situazione quando si esegue la shell stessa come root, come con sudo -s o sudo -i (e solo se eseguito da solo per ottenere una shell di root, non con il sudo -s command... o sudo -i command... forme) o sudo bash o sudo su, o la situazione in cui hai abilitato i login di root e hai una shell di root in questo modo. Quando viene eseguito un utente non root sudo command... dalla propria shell, l'espansione dell'alias viene eseguita dalla propria shell non root. sudo non espande se stesso alias, quindi come applicato alla situazione descritta nella domanda, questa risposta non è corretta. - Eliah Kagan


La risposta di @Alvins è la più breve. Nessun dubbio! :-)

Tuttavia ho pensato a una soluzione da riga di comando eseguire un comando con alias in sudo dove non c'è bisogno di ridefinire sudo con un alias comando.

Ecco la mia proposta per coloro a cui potrebbe interessare:

Soluzione

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

Esempio

Nel caso del ll comando

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

Spiegazione

quando hai un alias (come ad esempio: ll) il comando type -a restituisce l'espressione aliasata:

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

con grep in questo caso selezioni il testo tra l'accento `e l'apostrofo ' ls -l

E xargs esegue il testo selezionato ls -l come parametro di sudo.

Sì, un po 'più lungo ma completamente pulito;-) Non c'è bisogno di ridefinire sudo come alias.


3
2018-02-15 19:37



Potrebbe essere più semplice se hai usato il alias incorporato, poiché la sua produzione è più pulita. alias ll uscite alias ll='ls -ahlF'. - muru
Ecco la versione che incorpora il suggerimento di @ muru: alias ll | sed "s/.*'\(.*\)'.*/\1/g" | xargs sudo. - ACK_stoverflow
Penso che il punto della domanda iniziale fosse salvare il lavoro non dovendolo sudo -iprima, per eseguire il comando con l'alias, ma farlo subito. Avere un comando così complesso lo sconfigge. Potresti semplicemente fare il primo ed essere molto più veloce. - Evi1M4chine


Ho un'altra bella soluzione, che aggiunge anche un po 'di fiducia:

Usa il completamento bash per sostituire automaticamente le parole dietro sudo con i loro alias quando si preme tab.

Salva questo come /etc/bash_completion.d/sudo-alias.bashcompe dovrebbe essere automaticamente caricato all'avvio della shell interattiva:

_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

Quindi accedi a un nuovo terminale e dovresti essere pronto.


1
2017-09-08 16:09



C'è un modo per ottenere una lista di pseudonimi, specialmente per il completamento: compgen -a - muru
@muru: Grazie, ma in questo caso ho bisogno dei valori, non delle chiavi. Quindi, quale alias che è stato inserito verrà sostituito con. Scrivi l'alias, (come in sudo ll), premere [TAB ↹] e lo script trova ll nell'elenco degli assegnamenti di alias, taglia fuori ciò che gli viene assegnato e lo inserisce. (Quindi otterrai ad es. sudo ls -lahvF --color=auto --time-style=long-iso.) - Evi1M4chine


Ho una soluzione diversa per cui non è necessario aggiungere sudo come alias. Corro Linux Mint 17.3 ma dovrebbe essere abbastanza simile a Ubuntu.

Quando sei root, allora il .profile viene eseguito dalla sua home directory. Se non sai cosa sia la directory principale sotto root, puoi verificare con:

sudo su
echo $HOME

Come puoi vedere, la casa di root è /root/. Controlla il suo contenuto:

cd $HOME
ls -al

Ci dovrebbe essere un .profile file. Apri il file e aggiungi le seguenti linee:

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

Fondamentalmente, ciò che fa questo script bash è controllare un file chiamato .bash_aliases. Se i file sono presenti, esegue il file.

Salva il .profile file e crea i tuoi alias in .bash_aliases. Se hai già il file alias pronto, copia il file in questa posizione

Riavvia il terminale e sei a posto!


0
2018-06-10 21:06





La risposta più votata è ottima. Tuttavia se si digita sudo -i ed eleva a un prompt sudo (#) non avrai gli alias che ti piace usare.

Per utilizzare i tuoi alias (e tutto il resto) al # prompt, utilizzare:

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

Dove "$ PWD" viene automaticamente espanso in "/ home / YOUR_USER_NAME"


0
2017-11-25 02:50