Я обновлял некоторые профили по умолчанию для bash, и из руководств, за которыми я следил, я увидел, что могу перезагрузить новый профиль с новыми настройками среды, используя:
source /etc/bash.bashrc
Дело в том, что новые переменные окружения были доступны только моему текущему пользователю и игнорировались, когда я использовал sudo. Они стали доступны для sudo только после того, как я закрыл сеанс терминала и присоединился к нему.
Когда я пытаюсь использовать:
sudo source /etc/bash.bashrc
я получаю сообщение об ошибке:
sudo: source: command not found
Существует ли простой способ загрузки в новых настройках профиля bash для sudo без необходимости закрыть терминал и перезапустить?
- Изначально я использовал несколько сценариев установщика, которые ссылались на переменные. Я обнаружил, что, хотя они могли обращаться к переменным, когда я вызывал сценарии напрямую (хотя это могло вызвать более позднюю проблему с созданием каталогов, поскольку мне требовалось быть пользователем root), вызов сценариев установки с использованием sudo не позволял бы.
Я доказал это, протестировав с помощью следующих простых команд:
echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE
Первая выдаст значение переменной, а вторая ничего не выдаст.
Проблема в том, что source
- это встроенная команда bash (а не программа, подобная ls
или grep
). Я думаю, что один из подходов - войти в систему как root и затем выполнить команду источника.
sudo -s
source /etc/bash.bashrc
Как Маркос говорит , ваша главная проблема в том, что source
- это встроенная команда оболочки, которая влияет только на процесс оболочки, в котором она выполняется.
Простое решение - просто запустить новую оболочку от имени root, и bash автоматически прочитает /etc/bash.bashrc
при запуске. Это так же просто, как просто сказать
sudo bash
Закрытие и повторное открытие терминала не должны ничего менять. По умолчанию sudo удаляет окружение. Чтобы отключить это, добавьте -E к sudo.
С помощью bash процесса замены вы можете сделать:
source <(sudo cat /etc/bash.bashrc)
Проблема не в том, что source
является встроенной командой оболочки. Факт, что это - это то, что на самом деле выдает ошибку command not found
, но это не значит, что это сработает, если бы это было.
Проблема в том, как работают переменные среды. И они работают так: каждый раз, когда запускается новый процесс, если ничего не происходит, он наследует среду своего родителя. Из-за этого использование подоболочки (например, набрав bash
внутри экземпляра bash) и просмотр вывода env
должно дать аналогичные результаты, чем его родитель.
Однако из-за того, как работает sudo
(как указано в его man-странице), sudo пытается лишить среду пользователя и создать среду «по умолчанию» для вытесняющего пользователя, так что команда run выполняется ] как если бы пользователь, который вызвал его, был вызывающим пользователем (что является ожидаемым поведением), и, таким образом, при запуске nautilus с sudo nautilus
следует открыть папку в папке /root
, а не /home/yourusername
. [ 1117]
Итак:
Делая что-то вроде sudo source script.sh
, а затем sudo command
, даже если это сработало, не удастся установить любую переменную на более позднюю sudo command
.
Чтобы передать переменные окружения, вы можете либо сказать sudo сохранить окружение (с помощью переключателя -E
; и иметь соответствующие разрешения в вашем файле sudoers), и / или установить его для команды как sudo VAR1=VALUE1 VAR2=VALUE2 command
. [ 1120]
Ошибка возникает из-за того, что двоичный файл, который вы пытаетесь вызвать из командной строки, является только частью переменной PATH текущего пользователя, но не частью PATH корневого пользователя.
Вы можете убедиться в этом, найдя путь к двоичному файлу, к которому вы пытаетесь получить доступ. В моем случае я пытался назвать "bettercap-ng". Итак, я побежал,
$ which bettercap-ng
/home/user/work/bin/bettercap`
Я проверил, является ли это местоположение частью PATH моего корневого пользователя.
$ sudo env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
Итак, sudo не может найти двоичный файл, который я пытаюсь вызвать из командной строки. Следовательно, возвращает ошибку команда не найдена.
Вы можете указать sudo использовать PATH текущего пользователя при вызове двоичного файла, как показано ниже.
sudo -E env "PATH=$PATH" [command] [arguments]
Фактически, из него можно сделать псевдоним:
alias mysudo='sudo -E env "PATH=$PATH"'
Также можно назвать псевдоним самим sudo, заменив оригинальный sudo.
Некоторая оболочка UNIX не поддерживает source
. вместо этого, они поддерживают .
, Так попробуйте это
. /etc/bash.bashrc
Hope, это работает
Это не работает, потому что source
является встроенной командой, а не программа. Я написал bash-скрипт, чтобы принудительно использовать sudo для встроенных команд:
#!/bin/bash
function forceSudo()
{
command="${@}"
file="${@: -1}"
if ! $command 2>/dev/null
then
permission=$(stat -c '%a' $file)
sudo chmod o+rx $file
result=$command 2>/dev/null
sudo chmod $permission $file
if ! $result
then
echo $result
fi
fi
}
Сохраните файл как forceSudo
и сохраните его в местоположении ваших скриптов, возможно, ~/.local/bin
. Чтобы избежать необходимости исходного файла перед использованием функции, добавьте alias forceSudo='unalias forceSudo && . forceSudo && forceSudo "$@"'
в ~/.bashrc
.
Теперь вы можете использовать исходный код forceSudo /etc/bash.bashrc
.