Я играл вокруг с псевдонимами сегодня, и я заметил, что псевдонимы, кажется, не доступны при использовании 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
?
Добавьте следующую строку к своему ~/.bashrc
:
alias sudo='sudo '
Из руководства по использованию bash manual:
Псевдонимы позволяют заменять строку на слово, когда оно используется в качестве первого слова простой команды. Оболочка содержит список псевдонимов, которые могут быть установлены и сняты командами построения псевдонима и уналия.
Первое слово каждой простой команды, если оно не заключено в кавычки, проверяется на наличие псевдонима. Если да, то это слово заменяется текстом псевдонима. Символы '/', '$', '`', '=' и любой из мета-символов оболочки или символы в кавычках, перечисленные выше, могут не отображаться в псевдониме. Заменяющий текст может содержать любой действительный ввод оболочки, включая мета-символы оболочки. Первое слово заменяющего текста проверяется на псевдонимы, но слово, идентичное расширяемому псевдониму, не расширяется второй раз. Это означает, что, например, можно использовать псевдоним ls на "ls -F", и Бэш не пытается рекурсивно расширить заменяющий текст. Если последний символ значения псевдонима является пробелом или символом табуляции, то следующее за псевдонимом командное слово также проверяется на расширение псевдонима .
(Подчеркните мой).
Бэш проверяет только первое слово команды для псевдонима, любые слова после него не проверяются. Это означает, что в команде типа sudo ll
, только первое слово (sudo
) проверяется бэшем на псевдоним, ll
игнорируется. Мы можем попросить Баша проверить следующее слово после псевдонима (т.е. sudo
), добавив пробел в конец значения псевдонима.
Я написал для него функцию 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
файл , не забудьте установить источник или перезапустить сеанс терминала после этого, чтобы применить изменения.
Ответ @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
как псевдоним.
У меня есть еще одно хорошее решение, которое также добавляет немного доверия :
Используйте автодополнение для автоматической замены слов за 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
Затем войдите в новый терминал, и все будет в порядке.
У меня есть другое решение, в котором вам не нужно добавлять 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
. Если у вас уже есть готовый файл псевдонимов, то скопируйте файл в это место
Перезапустите терминал, и все готово!
Если вы наберете sudo -i
и повысите уровень до командной строки sudo ( #
), у вас не будет псевдонимов или функций, которые вы хотите использовать. .
Чтобы использовать свои псевдонимы и функции в приглашении #
, используйте:
sudo cp "$HOME"/.bashrc /root/.bashrc
Где «$ HOME» заменяется на «/ home / YOUR_USER_NAME»
@ WinEunuuchs2Unix: $ PWD
расширяется до «текущего рабочего каталога». Я думаю, вам нужен $ HOME
.
Кроме того, в большинстве ситуаций, вероятно, лучше всего иметь отдельный корневой файл .bashrc. На самом деле, я бы сделал его настоящим файлом в / root
, разместил бы мягкую ссылку на него в домашнем каталоге пользователя (например, .bashrc_root
) и получил бы его от пользователя .bashrc
файл. Если позже эта учетная запись привилегированного пользователя исчезнет, файл root .bashrc
по-прежнему будет доступен для других пользователей.
Псевдонимы специфичны для пользователя - их нужно определить в /root/. bashrc