Я обновил часть профиля по умолчанию для bash и увидел из руководств, которым я следовал, что я могу перезагрузить новый профиль с новыми настройками среды, используя:
source /etc/bash.bashrc
Единственное - новые переменные окружения были доступны только моему текущему пользователю - и были проигнорированы, когда я использовал sudo. Они стали доступны для sudo только тогда, когда я закрыл свой терминальный сеанс и снова подключился.
Когда я пытаюсь использовать:
sudo source /etc/bash.bashrc
Я получаю сообщение об ошибке:
sudo: source: command not found
Есть ли простой способ загрузить новые настройки профиля bash для sudo без необходимости закрывать терминал и перезагружать?
-- Изначально я использовал несколько сценариев установки, которые ссылались на переменные. Я обнаружил, что, хотя они могли получить доступ к переменным, когда я вызывал скрипты напрямую (хотя позже это вызвало бы проблему с созданием каталогов, поскольку мне нужно было быть root), вызов скриптов установки с помощью sudo этого не сделал бы.
Я доказал это, протестировав с помощью этих простых команд:
echo $ENV_VARIABLEsudo echo $ENV_VARIABLE
Первый выводил бы значение переменной, но второй ничего не выводил бы.
Проблема в том, что source является встроенной командой bash (не программной ls или grep). Я думаю, что один из подходов заключается в том, чтобы войти в систему как root, а затем выполнить исходную команду.
Проблема не в том, что source это встроенная в оболочку команда. Тот факт, что это это то, что на самом деле бросает вас в command not found ошибка, но это не значит, что это сработало бы, если бы это было так.
Реальная проблема заключается в том, как работают переменные среды. И они работают следующим образом: каждый раз, когда запускается новый процесс, если ничего не происходит, он наследует среду своего родителя. В связи с этим, используя подоболочку (например, ввод bash внутри экземпляра bash) и просматривая выходные данные env должен давать аналогичные результаты, чем его родительский.
Однако из-за того, как sudo работает (как указано в его справочной странице), sudo пытается удалить среду пользователя и создать среду "по умолчанию" для заменяющего пользователя, чтобы выполнить команду run будто пользователь, который вызвал его, был вызывающим пользователем (что является ожидаемым поведением) и, таким образом, запускал nautilus как sudo nautilus должен открыть папку в /root папку, а не /home/yourusername.
Так:
Делать что-то вроде sudo source script.sh и затем sudo command, даже если бы это сработало, это не увенчалось бы успехом при установке какой-либо переменной на более поздний sudo command.
Чтобы передать переменные среды, вы можете либо указать sudo сохранить среду (через -E переключатель; и наличие соответствующих разрешений в вашем файле sudoers) и / или установка его для команды как sudo VAR1=VALUE1 VAR2=VALUE2 command.
Как Маркос говорит, ваша главная проблема здесь заключается в том, что source это встроенная команда оболочки, которая влияет только на процесс оболочки, в котором она выполняется.
Простое решение - просто запустить новую оболочку от имени root, и bash автоматически прочитает /etc/bash.bashrc когда это начнется. Это так же просто, как просто сказать
Ошибка возникает из-за того, что двоичный файл, который вы пытаетесь вызвать из командной строки, является только частью переменной PATH текущего пользователя, но не частью ПУТИ пользователя root.
Вы можете убедиться в этом, найдя путь к двоичному файлу, к которому вы пытаетесь получить доступ. В моем случае я пытался вызвать "bettercap-ng". Поэтому я побежал,
$ which bettercap-ng/home/user/work/bin/bettercap`
Я проверил, является ли это местоположение частью ПУТИ моего корневого пользователя.
Таким образом, sudo не может найти двоичный файл, который я пытаюсь вызвать из командной строки. Следовательно, возвращается ошибка, команда не найдена.
Вы можете указать sudo использовать ПУТЬ текущего пользователя при вызове двоичного файла, как показано ниже.
sudo -E env "PATH=$PATH" [command] [arguments]
На самом деле, из него можно сделать псевдоним:
alias mysudo='sudo -E env "PATH=$PATH"'
Также можно назвать сам псевдоним sudo, заменив исходный sudo.
Это не работает, потому что source это встроенная команда, а не программа. Я написал сценарий bash для принудительного выполнения sudo для встроенных команд:
#!/bin/bashfunction 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 source /etc/bash.bashrc.
Как вы пытались использовать переменные из sudo? Пожалуйста, обратите внимание, что если вы используете “sudo command $variable”, она заменит переменную из вашей оболочки, а не из среды sudo.