Я настроил .bashrc
несколько псевдонимов, в частности, ll
иexport LS_OPTIONS='--color=auto'
К сожалению, это не работает при использовании с sudo
, поэтому я также изменил /root/.bashrc
, но это, кажется, не имеет значения.
sudo env
показывает HOME=/root
иSHELL=/bin/bash
Как я могу получить sudo
команды для использования настроек в /root/.bashrc
?
Я понимаю, что это происходит только тогда, когда bash
выполняется в интерактивном режиме, поэтому я открыт для любых других предложений о том, как настроить.
/root/.bashrc
но на самом деле то, что Q следует за псевдонимами из этого файла - это невозможно по этому вопросу - unix.stackexchange.com/questions/1496/… .-r
опции дляcrontab
:crontab () { [[ $@ =~ -[iel]*r ]] && echo '"r" not allowed' || command crontab "$@" ;}
. Это работает, когда вы вошли в систему как любой пользователь, однако, когда я выполняю,sudo crontab -r
он все еще выполняется.Ответы:
sudo
запускает исполняемый файл, а не команду оболочки Так что он не знает об псевдонимах. Если вы запускаетеsudo ls
, это какsudo /bin/ls
, он не используетls
псевдоним, который у вас может быть.Вы можете
sudo ls
расширить псевдоним, добавив в свой файл следующее.bashrc
:Обратите внимание на завершающий пробел, который указывает оболочке продолжить расширение псевдонима со словом, которое следует после
sudo
. Помните, что расширение псевдонимов после sudo не всегда может быть хорошей идеей, это зависит от того, какие псевдонимы у вас есть.Кроме того, sudo удаляет большинство переменных из окружения. Это не повлияет на псевдоним, например
alias ls='ls $LS_OPTIONS'
, потому что это переменная оболочки, используемая оболочкой, когда она расширяет команду (и экспорт из нее.bashrc
не имеет смысла). Но это повлияет на переменные, которые используются командой, такие какLS_COLORS
. Вы можете настроить sudo для сохранения определенных переменных среды, отредактировав его конфигурацию: запуститеvisudo
и добавьте строкуС этими настройками,
sudo ll
даст цвета, к которым вы привыкли.Кроме того, вы можете запустить корневую оболочку с
sudo -s
. Эта оболочка загрузит свой конфигурационный файл (~/.bashrc
для bash). В зависимости от того, как сконфигурирован sudo, он может остатьсяHOME
в вашем домашнем каталоге или изменить его на/root
. Вы можете принудительно установить домашний каталог в корневой каталог с помощьюsudo -Hs
; и наоборот, чтобы сохранить исходный домашний каталог, запуститеsudo env HOME="$HOME" bash
.источник
Спасибо тем, кто ответил, кто побудил меня прочитать
man sudo
более внимательно.sudo -s
Если команда не указана, выполняется интерактивная оболочка.Эта интерактивная оболочка использует
/root/.bashrc
и, следовательно, включает в себя мои настройки.Требуется, чтобы команда вводилась отдельно, но это нормально.
источник
Фон
Я всегда чувствовал, что этот вопрос - проблема XY . Название подразумевает, что они хотят что-то из этого,
/root/.bashrc
но на самом деле вопрос заключается в том, какие псевдонимы из этого файла - как полагают, это невозможно - почему мой сценарий Bash не распознает псевдонимы? ,В принципе, ваши псевдонимы не будут использоваться в
sudo
других местах, потому что они не переносимы, и это мое мнение о них.Все, что находится в среде пользователя, не должно восприниматься сценариями и любым программным обеспечением, которое может работать на данном устройстве. Но я понимаю, что есть сценарии, в которых могут быть псевдонимы в определенной учетной записи пользователя,
$HOME/.bashrc
которые другие могут использовать в интерактивных сценариях.Для этого вы можете просто сказать интерпретатору Bash расширить любые псевдонимы, которые он обнаруживает в процессе входа в систему, за пределами обычного поведения оболочки, с которым вы сталкиваетесь при использовании
sudo
.пример
Настроить
Для настройки я добавил следующие псевдонимы, переменные среды и функции для моего пользователя root
/root/.bashrc
и/root/.bash_profile
файлов.Ничего не делая ни одной из этих работ (без сюрпризов)
Мы видим, что
alias
команда не показывает псевдонимов при запуске вsudo
:Такое поведение - ваш намек на то, что вы не должны ожидать, что псевдонимы будут доступны. Но мы продолжаем ...
Шаг № 1 - псевдонимы видны
Если мы запустим,
bash -ci
мы можем заставить Bash хотя бы прочитать наш$HOME/.bashrc
:Круто, так может мы сможем запустить его?
Шаг 2 -
shopt -s expand_aliases
Нет. Опять же, это сделано намеренно, мы делаем что-то, чего не должны делать, поэтому есть ряд «безопасных» функций, которые мы должны отключить. другая «безопасность» - это Bash.
Здесь мы можем увидеть наше сообщение от
/root/.bashrc
, мы успешно выполнили псевдоним пользователя rootbrc_smurf
.Шаг № 3 - как насчет env vars?
Если вы используете метод, показанный выше, теперь это должно работать.
Шаг № 4 - как насчет функций?
Эти работы тоже, как и ожидалось:
TLDR;
Вы можете сделать это, чтобы получить доступ к переменным среды + псевдонимам из
/root/.bashrc
:Убирайся
Этот метод позволяет содержимое
/root/.bashrc
, он не забирает содержимое/root/.bash_profile
.Ссылки
источник
.bashrc
с помощью sudo; специально убрав-r
опцию изcrontab
?sudo bash -ci 'alias; shopt -s expand_aliases; echo $brc_smurf_env'
вместо простогоsudo echo $brc_smurf_env
?alias
, что нужно было просто показать им, что вам нужно будет сделатьsudo bash -ci 'shopt -s expand_aliases; <cmds>'
В файле / etc / sudoers есть несколько настроек, специально предназначенных для настройки среды, в которой запускаются команды sudo (например, проверка того, что PATH имеет только надежные расположения), но в зависимости от того, что вы надеетесь получить из этого. вы не сможете делать то, что вам нужно, если для запуска среды необходимо выполнить реальные команды в оболочке. В частности, Sudoing не дает вам оболочки для входа в систему, поэтому он не настроит для вас обычный профиль.
источник
Допустим, мы редактируем /root/.bashrc так:
Выйдите из системы и войдите снова, чтобы bash прочитал файл:
Как видите, файл был прочитан, переменная PATH была изменена, а псевдонимы установлены. Все работает по вашему желанию.
Тем не менее, sudo по-прежнему не будет работать, как вы ожидаете.
ПУТЬ не изменился. Могут быть способы изменить путь в sudoers, но я настоятельно рекомендую вам избегать этого. И, в любом случае, псевдонимы, функции и некоторые другие изменения по-прежнему не будут применены при изменении только PATH. Файл должен быть получен. Выполнение этого для каждого сценария или команды попросит компьютер выполнить больше работы без какой-либо реальной выгоды. Скрипты не используют псевдонимы (для них нет практического применения внутри скриптов).
Так что, просто войдите в систему,
.bashrc
файл будет автоматически загружен и приступит к работе.Вы можете начать bash так:
Но, как вы видите выше, pwd (рабочий каталог) не изменился, и, если вы проверите немного больше, некоторые другие настройки также не изменились. Вот почему правильная команда должна использовать:
Если эта команда слишком длинна для ввода, создайте псевдоним или функцию в пользователе (не root), где будет использоваться эта команда, что-то вроде:
источник
TL; DR: Вы можете использовать
sudo -i
для запуска функции , определенной/root/.bashrc
(но не псевдоним) , а также имеет доступ к переменным , экспортируемым из этого файла:Псевдонимы там не работают, но вы можете легко преобразовать их в функции, если хотите сделать их доступными
sudo -i
.Читайте дальше для полного анализа и более подробной информации.
Здесь есть несколько проблем, некоторые в том, как работает sudo, а некоторые в том, как работает сам bash ...
По умолчанию
sudo
будет искать только команды и обходить оболочку, поэтому простой запускsudo ll
будет работать, только еслиll
в одном из каталогов находится исполняемый файл$PATH
. Итак, чтобы использовать псевдонимы (или функции), вы должны убедиться, что оболочка вызывается как часть процесса.Одним из способов было бы запустить что-то вроде
sudo sh
илиsudo bash
, хотя современныйsudo
(я тестирую это на sudo 1.8.19p1) имеет опции-s
и-i
для этой цели.Таким образом, одна попытка будет выглядеть примерно так
sudo -s ll
(что эквивалентноsudo bash -c 'll'
предположению, что вы$SHELL
- Bash, что, кажется, имеет место на основеrcfile
упомянутой вами информации). Но это тоже не работает, так как запускает оболочку в неинтерактивном режиме, не входящий в систему режим, который не читает ни один из его файлов запуска. По сути, это то же самое, что если вы пишете сценарий оболочки и используете его#!/bin/bash
для запуска. Псевдонимы (и функции), которые у вас есть~/.bashrc
, не будут доступны из этого скрипта ...Итак, следующий
-i
вариант, который создает оболочку входа в систему. Это более перспективно, так как он будет читать ваши файлы запуска! И все жеsudo -i ll
(эквивалентноsudo bash -l -c 'll'
) все равно не будет работать. Так как это возможно, учитывая, что он прочитал определениеll
псевдонима?Что ж, следующим объяснением здесь является то, что по умолчанию bash не будет расширять псевдонимы, кроме случаев, когда оболочка является интерактивной ... Эта оболочка, запущенная
sudo -i
(илиbash -l
), является оболочкой входа , но все же не интерактивной.Поэтому следующим шагом является получение интерактивной оболочки, которая затем работает :
(Иметь логин и интерактив тоже хорошо, конечно,
bash -l -i -c ...
будет работать.)Другая альтернатива - продолжать использовать оболочку входа в систему (неинтерактивную), но явно попросить ее расширить псевдонимы, так что это также будет работать:
(В случае, когда bash был интерактивным , не требовалась оболочка входа в систему , поскольку этого достаточно для чтения файлов инициализации, но для этого нужно
-l
их прочитать.)Это довольно длинные командные строки ... И они также требуют, чтобы вы указали всю команду оболочки в кавычках, поэтому, если вы вызываете псевдоним с аргументами, вам придется превратить все это в строку ... неуклюжий в использовании ...
Обратите внимание, что ранее я говорил об псевдонимах и функциях ... Это было сделано специально, поскольку функции здесь намного удобнее. Вам не нужно ничего особенного (например, наличие интерактивной оболочки или установка определенной опции) для выполнения функций в оболочке, если вы используете их определение.
Таким образом , если вы определили
ll
как функцию вместо псевдонима, вы сможете использовать его непосредственно SUDO в-i
ярлыке:И если у вас более длинная командная строка с аргументами, вы можете передать их прямо здесь:
(Сравнить с
sudo bash -i -c 'll -C -R /etc'
.)Функции также более гибкие и, как правило, проще в обслуживании ... Обычно псевдоним легко преобразовать в функцию, единственное предостережение - всегда использовать
"$@"
там, где вы ожидаете получить дополнительные аргументы (обычно в конце псевдоним.)Например, этот псевдоним:
Может быть превращен в эту функцию:
Для большинства целей они эквивалентны. И, как упоминалось ранее, функция должна быть доступна непосредственно из
sudo -i
, так что это дополнительный бонус.Я надеюсь, что вы найдете этот ответ и объяснение полезным!
источник
sudo -i command arguments
чтобы иметь возможность запускать функции из/root/.bashrc
и имеют экспортируемые переменные доступны. Но я вижу, что мой ответ был, возможно, слишком длинным, и эта информация была несколько похоронена там ... Поэтому я добавил TL; DR, чтобы подвести его итог (при этом сохраняя технические детали расследования). Пожалуйста, взгляните еще раз.