sudo: source: команда не найдена

Я обновлял некоторый профиль по умолчанию для 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

Первый будет выдавать значение переменной, а второй ничего не выводит.

1
задан 19 November 2013 в 02:37

5 ответов

Проблема не в том, что 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.

10
ответ дан 25 May 2018 в 23:33

Закрытие и повторное открытие терминала не должно меняться. По умолчанию sudo удаляет среду. Чтобы отключить это, добавьте -E в sudo.

2
ответ дан 25 May 2018 в 23:33

Как говорит Маркос, ваша главная проблема здесь в том, что source - это встроенная команда оболочки, которая затрагивает только процесс оболочки, в котором он запущен.

Простое решение - просто запустить новую оболочку как root, и bash автоматически прочитает /etc/bash.bashrc при ее запуске. Это так просто, как просто сказать

sudo bash
1
ответ дан 25 May 2018 в 23:33

Попробуйте запустить этот sudo su -c "source /etc/bash.bashrc"

Это позволит вам временно войти в корневой каталог источника и автоматически выйти из корневого сеанса

0
ответ дан 25 May 2018 в 23:33

Ошибка возникает из-за того, что бинарный файл, который вы пытаетесь вызвать из командной строки, является частью переменной PATH текущего пользователя, но не является частью PATH пользователя root.

Вы можете проверить это, путь к двоичному файлу, к которому вы пытаетесь получить доступ. В моем случае я пытался назвать «bestcap-ng». Итак, я побежал,

$ which bettercap-ng

output: /home/user/work/bin/bettercap

Я проверил, является ли это местоположение частью PATH моего пользователя root.

[d5 ] $ sudo env | grep ^PATH

output: 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.

Пожалуйста, обратитесь к этому видео для шага ступенчатое решение

0
ответ дан 25 May 2018 в 23:33

Другие вопросы по тегам:

Похожие вопросы: