Я обновлял некоторые профили по умолчанию для 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, а затем выполнить исходную команду.источник
source
встроенная оболочка.sudo su
это своего рода странный способ сказать это - лучше просто сказать,sudo -s
что это собственный способ сказать sudo «запустить оболочку от имени этого пользователя». Ваша однострочная версия не будет работать, потому что каждая из команд в ней запускается оболочкой основного пользователя в отдельном подпроцессе.su
запускает новую оболочку, а «source» запускается только после ее завершения. Первый пример работает, только если вторая строка используется внутри корневой оболочки.sudo -s
не лучшеsudo su
. Это не будет иметь никакого эффекта в любом случае.sudo -s
имеет аналогичный эффект запуска оболочки, но мне кажется неуместным сложить две команды «стать другим пользователем», когда одна из них сделает это.Проблема не в том, что
source
это встроенная команда оболочки. Факт, что это действительно то , что на самом деле выдаетcommand not found
ошибку, но это не значит, что она будет работать, если бы это было.Актуальная проблема заключается в том, как работают переменные среды. И они работают так: каждый раз, когда запускается новый процесс, если ничего не происходит, он наследует среду своего родителя. Из-за этого использование подоболочки (например, ввод
bash
внутри экземпляра bash) и просмотр выходных данныхenv
должны давать аналогичные результаты, чем его родитель.Однако из-за того, как
sudo
работает (как указано в его man-странице), sudo пытается лишить пользователя среды и создать среду «по умолчанию» для вытесняющего пользователя, чтобы команда запускалась так, как если бы пользователь, который ее вызвал, имел был вызывающим пользователем (что является ожидаемым поведением) и, таким образом, запустил nautilus, так какsudo nautilus
должен открывать папку в/root
папке, а не/home/yourusername
.Так:
Выполнение чего-то подобного,
sudo source script.sh
а затемsudo command
, даже если это сработало, не помогло бы установить любую переменную на более позднююsudo command
.Чтобы передать переменные окружения, вы можете либо сказать sudo сохранить окружение (через
-E
коммутатор; и иметь соответствующие разрешения в файле sudoers) и / или установить его для команды assudo VAR1=VALUE1 VAR2=VALUE2 command
.источник
Используя замену процесса bash, вы можете сделать:
источник
sudo
для доступа к профилю. Вышеуказанное позволяет импортировать профиль, избегаяsudo: source: command not found
упомянутой проблемы.Как говорит Маркос , ваша главная проблема в том, что
source
это встроенная команда оболочки, которая влияет только на процесс оболочки, в котором она выполняется.Простое решение - просто запустить новую оболочку с правами root, и bash автоматически прочитает ее
/etc/bash.bashrc
при запуске. Это так просто, как просто сказатьисточник
Закрытие и повторное открытие терминала не должны ничего менять. По умолчанию sudo удаляет окружение. Чтобы отключить это, добавьте -E в sudo.
источник
Ошибка возникает из-за того, что двоичный файл, который вы пытаетесь вызвать из командной строки, является только частью переменной PATH текущего пользователя, но не является частью PATH корневого пользователя.
Вы можете убедиться в этом, найдя путь к двоичному файлу, к которому вы пытаетесь получить доступ. В моем случае я пытался назвать "bettercap-ng". Итак, я побежал,
Я проверил, является ли это местоположение частью PATH моего корневого пользователя.
Поэтому sudo не может найти двоичный файл, который я пытаюсь вызвать из командной строки. Следовательно, возвращает ошибку команда не найдена.
Вы можете указать sudo использовать PATH текущего пользователя при вызове двоичного файла, как показано ниже.
На самом деле из него можно сделать псевдоним:
Также возможно назвать псевдоним сам sudo, заменив оригинальный sudo.
источник