Я обновлял некоторый профиль по умолчанию для bash и видел из обучающих программ, которые я выполнял, чтобы перезагрузить новый профиль новыми настройками среды, используя:
source /etc/bash.bashrc
Единственное: - новые переменные среды были доступны только моему текущему пользователю - и были проигнорированы, когда я использовал sudo.
Когда я пытаюсь использовать:
sudo source /etc/bash.bashrc
Я получаю сообщение об ошибке:
sudo: source: command not found
Есть ли простой способ загрузить в новые настройки профиля bash для sudo без закрытия терминала и перезагрузки?
- Вначале я использовал некоторые сценарии установки, которые ссылались на переменные. Я обнаружил, что, хотя они могут обращаться к переменным, когда я вызывал скрипты напрямую (хотя это приведет к возникновению проблемы с созданием каталогов, поскольку мне нужно было быть root), вызов сценариев установки с использованием sudo не будет.
Я доказал это, протестировав с помощью этих простых команд:
echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE
Первый будет выдавать значение переменной, а второй ничего не выводит.
Проблема не в том, что source является встроенной командой оболочки. Тот факт, что это то, что на самом деле бросает вам ошибку command not found, но это не значит, что он будет работать, если бы это было.
Реальная проблема заключается в том, как работают переменные среды. И они работают следующим образом: каждый раз, когда запускается новый процесс, если ничего не происходит, он наследует среду своего родителя. Из-за этого использование подоболочки (например, набрав bash внутри экземпляра bash) и просмотр результата env должен давать аналогичные результаты, чем его родитель.
Однако из-за того, как sudo работает (как указано в его man-странице), sudo пытается отключить среду пользователя и создать среду «по умолчанию» для вытесняющего пользователя, так что запуск команды выполняется . Тот факт, что это пользователь, который его вызвал, был вызывающим пользователем (что является ожидаемым поведением) и, таким образом, запускает nautilus, поскольку sudo nautilus должен открыть папку в папке /root, а не /home/yourusername.
So :
Выполняя что-то вроде sudo source script.sh, а затем sudo command, даже если бы это сработало, было бы неуспешно при установке какой-либо переменной на более позднюю sudo command.
In для передачи переменных окружения вы можете сказать sudo о сохранении среды (через переключатель -E и иметь соответствующие разрешения в вашем файле sudoers) и / или установить его для команды как sudo VAR1=VALUE1 VAR2=VALUE2 command.
Закрытие и повторное открытие терминала не должно меняться. По умолчанию sudo удаляет среду. Чтобы отключить это, добавьте -E в sudo.
Как говорит Маркос, ваша главная проблема здесь в том, что source - это встроенная команда оболочки, которая затрагивает только процесс оболочки, в котором он запущен.
Простое решение - просто запустить новую оболочку как root, и bash автоматически прочитает /etc/bash.bashrc при ее запуске. Это так просто, как просто сказать
sudo bash
Попробуйте запустить этот sudo su -c "source /etc/bash.bashrc"
Это позволит вам временно войти в корневой каталог источника и автоматически выйти из корневого сеанса
Ошибка возникает из-за того, что бинарный файл, который вы пытаетесь вызвать из командной строки, является частью переменной PATH текущего пользователя, но не является частью PATH пользователя root.
Вы можете проверить это, путь к двоичному файлу, к которому вы пытаетесь получить доступ. В моем случае я пытался назвать «bestcap-ng». Итак, я побежал,
$ which bettercap-ng
output: /home/user/work/bin/bettercap
Я проверил, является ли это местоположение частью PATH моего пользователя root.
[d5 ] $ sudo env | grep ^PATHoutput: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
Так что sudo не может найти двоичный файл, который я пытаюсь вызвать из командной строки. Следовательно, команда error не найдена.
Вы можете направить sudo на использование PATH текущего пользователя при вызове двоичного файла, как показано ниже.
$ sudo -E env "PATH=$PATH" [command] [arguments]
На самом деле можно сделать псевдоним из этого:
$ alias mysudo='sudo -E env "PATH=$PATH"'
Также можно назвать сам псевдоним sudo, заменив исходное sudo.
Пожалуйста, обратитесь к этому видео для шага ступенчатое решение