dimayakovlev.ru


Псевдонимы Bash и sudo

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

Например, на своём локальном веб-сервере я использую псевдонимы для управления Apache, объявив их в файле ~/.bash_aliases, подключаемом в файле ~/.bashrc.

# Запуск Apache
alias a2start='service apache2 start'
# Остановка Apache
alias a2stop='service apache2 stop'
# Перезапуск Apache
alias a2restart='service apache2 restart'

Теперь вместо трёх команд, мне достаточно выполнить одну, но для их запуска требуются права суперпользователя.

sudo a2start

Привычный вариант с использованием sudo приводит к ошибке: “sudo: a2start: command not found”. Результат ожидаем, если ознакомиться с разделом Aliases руководства Bash: первое слово каждой команды проверяется на существование одноимённого псевдонима, если псевдоним найден, то это слово заменяется текстом псевдонима. Так, в приведённом примере Bash не интерпретирует a2start, как псевдоним, вместо этого Bash обращается к команде a2start, которая не существует и поэтому не может быть выполнена.

Первый вариант решения проблемы - добавить команду sudo непосредственно в текст псевдонима.

# Запуск Apache
alias a2start='sudo service apache2 start'
# Остановка Apache
alias a2stop='sudo service apache2 stop'
# Перезапуск Apache
alias a2restart='sudo service apache2 restart'

Теперь запуск Apache выполняется одной командой с запросом ввода пароля, как в случае использования sudo:

a2start

Второй вариант универсальнее - объявить псевдоним для команды sudo. В моём случае в файл ~/.bash_aliases добавляется следующий псевдоним:

alias sudo='sudo '

Обязательно обратите внимание, что в тексте псевдонима после команды sudo необходимо добавить пробел, который скажет Bash проверить следущее в командной строке после псевдонима sudo слово. Если пробела не будет, то следующее за sudo слово будет интерпретироваться Bash, как имя команды, а не как псевдоним, что снова приведёт к ошибке.

Какой из вариантов использовать - решать вам. Для себя я использую вариант с псевдонимом sudo.

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