Вопрос Псевдонимы, недоступные при использовании 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?


133
2018-01-17 22:47


происхождения


Вы объявили эти псевдонимы в .bashrc on / root / - Luciano Facchinelli
@LucianoFacchinelli: /root/.bashrc не считывается при запуске команды через sudo. - Flimm
serverfault.com/questions/61321/how-to-pass-alias-through-sudo - Ciro Santilli 新疆改造中心 六四事件 法轮功
@Flimm: Как насчет sudo -i? - Evi1M4chine


ответы:


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

alias sudo='sudo '

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

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

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

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


209
2018-01-17 23:08



Довольно приятное решение. - ulidtko
Итак, в основном проблема сводится к тому, что sudo просто запрограммирован таким образом, что он не проверяет псевдонимы, поэтому ll не найден? - kemra102
@DannyRoberts Смотрите мой обновленный ответ. - Isaiah
Чтение документации, очевидно, принесет много пользы :-) - biocyberman
Будет ли это нарушено, если я использую флаг sudo, например. sudo -H ll? - Mark E. Haase


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

Он проверяет, есть ли у меня псевдоним для данной команды и выполняется команда aliased вместо буквенного с 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
2017-09-27 09:19





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


3
2018-01-17 23:01



Они уже находятся под /root/.bashrc, так что это не проблема - kemra102
Этот ответ был бы правильным только для ситуации, когда вы запускаете оболочку как root, как в случае с sudo -s или sudo -i (а также только если запустить сам, чтобы получить корневую оболочку, не с sudo -s command... или sudo -i command... формы) или sudo bash или sudo su, или в ситуации, когда вы включили учетные записи root и имеете корневую оболочку таким образом. Когда пользователь, не являющийся пользователем root, запускает sudo command... из своей оболочки оболочка alias выполняется их собственной оболочкой без полномочий root. sudo сам не расширяет псевдонимы, поэтому применительно к ситуации, описанной в вопросе, этот ответ неверен. - Eliah Kagan


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


3
2018-02-15 19:37



Может быть проще, если вы использовали alias встроенный, поскольку его выход чище. alias ll выходы alias ll='ls -ahlF', - muru
Вот версия, включающая предложение @ muru: alias ll | sed "s/.*'\(.*\)'.*/\1/g" | xargs sudo, - ACK_stoverflow
Я думаю, что исходный вопрос заключался в том, чтобы сохранить работу, не имея sudo -iво-первых, запустить команду aliased, но сразу же это сделайте. Такая сложная команда побеждает. Вы могли бы просто сделать первое, и быть намного быстрее. - Evi1M4chine


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

Использовать завершение bash для автоматической замены слов позади 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
2017-09-08 16:09



Есть способ получить список псевдонимов, специально предназначенных для завершения: compgen -a - muru
@muru: Спасибо, но в этом случае мне нужны значения, а не ключи. Итак, какой псевдоним, который был введен, будет заменен. Вы вводите псевдоним (например, в sudo ll), нажмите [TAB ↹], и сценарий найдет ll в списке назначений псевдонима, вырезает то, что ему назначено, и вставляет это. (Таким образом, вы получите, например. sudo ls -lahvF --color=auto --time-style=long-iso.) - Evi1M4chine


У меня есть другое решение, в котором вам не нужно добавлять 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, Если у вас уже есть файл псевдонимов, скопируйте файл в это место

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


0
2018-06-10 21:06





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

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

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

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


0
2017-11-25 02:50