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

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

197
задан 18 January 2011 в 02:02

8 ответов

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

alias sudo='sudo '

Из руководства по использованию bash manual:

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

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

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

294
ответ дан 18 January 2011 в 02:02

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

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

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

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

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

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

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

5
ответ дан 18 January 2011 в 02:02

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

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

Вот мое предложение для тех, кого это может заинтересовать:

Решение

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 как псевдоним.

4
ответ дан 18 January 2011 в 02:02

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

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

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

_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

Затем войдите в новый терминал, и все будет в порядке.

1
ответ дан 18 January 2011 в 02:02

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

Когда Вы находитесь в корневом каталоге, то .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. Если у вас уже есть готовый файл псевдонимов, то скопируйте файл в это место

Перезапустите терминал, и все готово!

0
ответ дан 18 January 2011 в 02:02

Если вы наберете sudo -i и повысите уровень до командной строки sudo ( # ), у вас не будет псевдонимов или функций, которые вы хотите использовать. .

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

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

Где «$ HOME» заменяется на «/ home / YOUR_USER_NAME»

1
ответ дан 18 January 2011 в 02:02

@ WinEunuuchs2Unix: $ PWD расширяется до «текущего рабочего каталога». Я думаю, вам нужен $ HOME .

Кроме того, в большинстве ситуаций, вероятно, лучше всего иметь отдельный корневой файл .bashrc. На самом деле, я бы сделал его настоящим файлом в / root , разместил бы мягкую ссылку на него в домашнем каталоге пользователя (например, .bashrc_root ) и получил бы его от пользователя .bashrc файл. Если позже эта учетная запись привилегированного пользователя исчезнет, ​​файл root .bashrc по-прежнему будет доступен для других пользователей.

1
ответ дан 18 January 2011 в 02:02

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

5
ответ дан 18 January 2011 в 02:02

Другие вопросы по тегам:

Похожие вопросы: