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

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

Первая выдаст значение переменной, а вторая ничего не выдаст.

56
задан 19 November 2013 в 00:37

8 ответов

Проблема в том, что source - это встроенная команда bash (а не программа, подобная ls или grep). Я думаю, что один из подходов - войти в систему как root и затем выполнить команду источника.

sudo -s
source /etc/bash.bashrc
0
ответ дан 19 November 2013 в 00:37

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

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

sudo bash
0
ответ дан 19 November 2013 в 00:37

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

0
ответ дан 19 November 2013 в 00:37

С помощью bash процесса замены вы можете сделать:

source <(sudo cat /etc/bash.bashrc)
0
ответ дан 19 November 2013 в 00:37

Проблема не в том, что source является встроенной командой оболочки. Факт, что это - это то, что на самом деле выдает ошибку command not found, но это не значит, что это сработает, если бы это было.

Проблема в том, как работают переменные среды. И они работают так: каждый раз, когда запускается новый процесс, если ничего не происходит, он наследует среду своего родителя. Из-за этого использование подоболочки (например, набрав bash внутри экземпляра bash) и просмотр вывода env должно дать аналогичные результаты, чем его родитель.

Однако из-за того, как работает sudo (как указано в его man-странице), sudo пытается лишить среду пользователя и создать среду «по умолчанию» для вытесняющего пользователя, так что команда run выполняется ] как если бы пользователь, который вызвал его, был вызывающим пользователем (что является ожидаемым поведением), и, таким образом, при запуске nautilus с sudo nautilus следует открыть папку в папке /root, а не /home/yourusername. [ 1117]

Итак:

Делая что-то вроде sudo source script.sh, а затем sudo command, даже если это сработало, не удастся установить любую переменную на более позднюю sudo command.

Чтобы передать переменные окружения, вы можете либо сказать sudo сохранить окружение (с помощью переключателя -E; и иметь соответствующие разрешения в вашем файле sudoers), и / или установить его для команды как sudo VAR1=VALUE1 VAR2=VALUE2 command. [ 1120]

0
ответ дан 19 November 2013 в 00:37

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

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

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

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

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

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

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

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

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

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

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

0
ответ дан 19 November 2013 в 00:37

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

. /etc/bash.bashrc

Hope, это работает

0
ответ дан 22 November 2019 в 23:44

Это не работает, потому что source является встроенной командой, а не программа. Я написал bash-скрипт, чтобы принудительно использовать sudo для встроенных команд:

#!/bin/bash

function 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 /etc/bash.bashrc.

0
ответ дан 9 January 2021 в 04:37

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

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