Sudo: источник: команда не найдена

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

sudo -ssource /etc/bash.bashrc

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

Использование bash замена процесса вы можете сделать:

source <(sudo cat /etc/bash.bashrc)

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

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

sudo bash

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

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

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

$ which bettercap-ng/home/user/work/bin/bettercap`

Я проверил, является ли это местоположение частью ПУТИ моего корневого пользователя.

$ sudo env | grep ^PATHPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

Таким образом, sudo не может найти двоичный файл, который я пытаюсь вызвать из командной строки. Следовательно, возвращается ошибка, команда не найдена.

Вы можете указать sudo использовать ПУТЬ текущего пользователя при вызове двоичного файла, как показано ниже.

sudo -E env "PATH=$PATH" [command] [arguments]

На самом деле, из него можно сделать псевдоним:

alias mysudo='sudo -E env "PATH=$PATH"'

Также можно назвать сам псевдоним sudo, заменив исходный sudo.

Некоторые оболочки UNIX не поддерживают source. вместо этого они поддерживают . Так что попробуйте это

. /etc/bash.bashrc

Надеюсь, это сработает

Это не работает, потому что 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.