Псевдонимы, недоступные при использовании sudo

115

Сегодня я играл с псевдонимами, и я заметил, что псевдонимы недоступны при использовании 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

Есть ли причина, по которой вы не можете использовать псевдонимы, используя sudo ?

    
задан kemra102 17.01.2011 в 22:47
источник

7 ответов

186

Добавьте следующую строку в свой ~/.bashrc :

alias sudo='sudo '

Из руководства bash :

  

Псевдонимы позволяют заменить строку на слово, когда оно используется как первое слово простой команды. Оболочка поддерживает список псевдонимов, которые могут быть установлены и не установлены с помощью встроенных команд псевдонима и unalias.

     

Первое слово каждой простой команды, если оно не указано, проверяется, имеет ли он псевдоним . Если это так, это слово заменяется текстом псевдонима. Символы '/', '$', '' ',' = 'и любые метасимволы оболочки или цитируемые выше символы могут не отображаться в псевдониме. Текст замены может содержать любой допустимый ввод оболочки, включая метасимволы оболочки. Первое слово заменяющего текста проверяется на псевдонимы, но слово, которое совпадает с расширяемым псевдонимом, не разворачивается во второй раз. Это означает, что можно, например, псевдоним ls -F, и Bash не пытается рекурсивно расширять заменяющий текст. Если последним символом псевдонима является пробел или символ табуляции, тогда следующее командное слово, следующее за псевдонимом, также проверяется на расширение псевдонима .

(Акцент мой).
Bash только проверяет первое слово команды для псевдонима, любые слова после этого не проверяются. Это означает, что в команде, такой как sudo ll , только первое слово ( sudo ) проверяется bash для псевдонима, ll игнорируется. Мы можем сказать bash, чтобы проверить следующее слово после псевдонима (i.e sudo ), добавив пробел в конец значения псевдонима.

    
ответ дан Isaiah 17.01.2011 в 23:08
источник
4

Я написал для него функцию Bash, которая затеняет sudo .

Он проверяет, есть ли у меня псевдоним для данной команды и запускает команду aliased вместо буквенного с sudo в этом случае.

Вот моя функция как однострочный:

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

Или красиво отформатирован:

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

Вы можете добавить его в файл .bashrc , не забудьте указать его или перезапустить сеанс терминала после этого, чтобы применить изменения.

    
ответ дан Byte Commander 27.09.2016 в 09:19
3

Алиасы являются специфичными для пользователя - вам нужно определить их в /root/.bashrc

    
ответ дан Ragnar123 17.01.2011 в 23:01
2
Ответ на

@Alvins - самый короткий. Без сомнений! : -)

Однако я подумал о решении командной строки для выполнить команду aliased в sudo , где нет необходимости переопределять sudo с помощью команды alias .

Вот мое предложение для тех, кому это может быть интересно:

Решение

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

Пример

В случае команды ll

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

Описание

, когда у вас есть псевдоним (например, ll ), команда type -a возвращает выражение с псевдонимом:

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

с grep вы выбираете текст между акцентом 'и апострофом' в этом случае ls -l

И xargs выполняет выделенный текст ls -l как параметр sudo .

Да, немного дольше, но полностью чист ;-) Нет необходимости переопределять sudo как псевдоним.

    
ответ дан loved.by.Jesus 15.02.2015 в 19:37
1

У меня есть еще одно приятное решение, которое добавляет немного доверия:

Использовать завершение bash для автоматической замены слов позади sudo со своими псевдонимами при нажатии вкладки.

Сохраните это как /etc/bash_completion.d/sudo-alias.bashcomp , и он должен автоматически загружаться при запуске интерактивной оболочки:

_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

Затем войдите в новый терминал, и вам должно быть хорошо идти.

    
ответ дан Evi1M4chine 08.09.2017 в 16:09
0

У меня есть другое решение, в котором вам не нужно добавлять sudo в качестве псевдонима. Я запускаю Linux Mint 17.3, но он должен быть очень похож на Ubuntu.

Когда вы являетесь пользователем root, то .profile запускается из его домашнего каталога. Если вы не знаете, что такое домашний каталог под root, вы можете проверить:

sudo su
echo $HOME

Как вы можете видеть, дом root равен /root/ . Проверьте его содержимое:

cd $HOME
ls -al

Должен быть файл .profile . Откройте файл и добавьте следующие строки:

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

В принципе, этот скрипт bash - это проверить файл с именем .bash_aliases . Если файлы присутствуют, он выполняет файл.

Сохраните файл .profile и создайте свои псевдонимы в .bash_aliases . Если у вас уже есть файл псевдонимов, скопируйте файл в это место

Запустите терминал, и вы хорошо пойдете!

    
ответ дан Karthik Ramakrishnan 10.06.2016 в 21:06
0

Главный голосовой ответ - отличный. Однако, если вы наберете sudo -i и поднимитесь на приглашение sudo ( # ), у вас не будет псевдонимов, которые вы хотели бы использовать.

Чтобы использовать свои псевдонимы (и все остальное) в приглашении # , используйте:

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

Где «$ PWD» автоматически расширяется в «/ home / YOUR_USER_NAME»

    
ответ дан WinEunuuchs2Unix 25.11.2016 в 02:50

Ознакомьтесь с другими вопросами по меткам