Alias ​​non disponibile quando si utilizza sudo

133

Oggi stavo giocando con gli alias e ho notato che gli alias non sembrano disponibili mentre si utilizza 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 usi sudo ?

    
posta kemra102 17.01.2011 - 23:47
fonte

7 risposte

209

Aggiungi la seguente riga 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 tutti i metacaratteri della shell o le virgolette elencate 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 sulla mia).
Bash controlla solo la prima parola di un comando per un alias, qualsiasi parola dopo quella non è selezionata. Ciò significa che in un comando come sudo ll , solo la prima parola ( sudo ) viene controllata da bash per un alias, ll viene ignorata. Possiamo dire a bash di controllare la parola successiva dopo l'alias (cioè sudo ) aggiungendo uno spazio alla fine del valore alias.

    
risposta data Isaiah 18.01.2011 - 00:08
fonte
5

Ho scritto una funzione di Bash per questo che ombreggia sudo .

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

Ecco la mia funzione di one-liner:

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

O ben formattato:

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

Puoi aggiungerlo al tuo file .bashrc , non dimenticare di inviarlo o riavviare successivamente la sessione del terminale per applicare le modifiche.

    
risposta data Byte Commander 27.09.2016 - 11:19
fonte
3

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

    
risposta data Ragnar123 18.01.2011 - 00:01
fonte
3

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

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

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 comando ll

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

Spiegazione

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

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

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

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

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

    
risposta data loved.by.Jesus 15.02.2015 - 20:37
fonte
1

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 premi la scheda.

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

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

Quindi accedi a un nuovo terminale e dovresti andare.

    
risposta data Evi1M4chine 08.09.2017 - 18:09
fonte
0

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, il .profile viene eseguito dalla sua home directory. Se non sai quale 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

Dovrebbe esserci un file .profile . Apri il file e aggiungi le seguenti righe:

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 file .profile 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!

    
risposta data Karthik Ramakrishnan 10.06.2016 - 23:06
fonte
0

La risposta più votata è ottima. Tuttavia, se digiti sudo -i e elevi a un prompt sudo ( # ) non avrai gli alias che desideri utilizzare.

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

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

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

    
risposta data WinEunuuchs2Unix 25.11.2016 - 03:50
fonte

Leggi altre domande sui tag