как выполнить команду sudo и загрузить переменные среды текущего вошедшего в систему пользователя?

как выполнить команду sudo и загрузить переменные среды текущего вошедшего в систему пользователя?

Мне нужно выполнить команду ssh sudo.

команда выглядит следующим образом:

ssh -i keyfile [email protected]  'sh -v /opt/dir/script'

Скрипт содержит следующее:

sudo -E node some.js

Причина, по которой я использую аргумент -E, заключается в том, что команда выполняется пользователем userA.Изапускаемый процесс должен загрузить определения из

/user/userA/.bashrc

приведенная выше команда НЕ загружает переменные, определенные в /user/userA/.bashrc

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

Если я войду на удаленную машину интерактивно как пользователь A и выполню ту же команду, а именно:

sudo -E node some.js

переменные загружены правильно, и я вижу ожидаемое поведение.

Может ли кто-нибудь увидеть, что мне нужно сделать по-другому?

решение1

Вы ожидаете, что оболочка будет source ~/.bashrc, поэтому я предполагаю, что оболочка — Bash.

Поворот номер 1: SSH-сервер передает код оболочки в неинтерактивную оболочку. Неинтерактивный Bashнечитать ~/.bashrc.

Поворот номер 2: Bash пытается определить, когда он запускается со своим стандартным вводом, подключенным к сетевому соединению, как при запуске SSH-сервером. Если bash определяет, что он запускается таким образом, онделаетчитать и выполнять команды из ~/.bashrc.

Поворот номер 3: Во многих дистрибутивах (включая Ubuntu) по умолчанию (скелетный) ~/.bashrcначинается с кода, который возвращает, если оболочка неинтерактивна. По сути, остальная часть файлане получено.

Я полагаю, что в вашем случае соответствующие переменные окружения определены после этого фрагмента кода. Код может выглядеть так:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

Простое решение — переместить задания так, чтобы они былидоэтот код. Если вы хотите переместить команды, которые делают больше (например, echoчто-то, запускают что-то), то будьте очень осторожны, потому что вы можете нарушить удаленную передачу файлов. ЧитатьЗачем bashrcпроверять, является ли текущая оболочка интерактивной?Если речь идет только о переменных, то вы в безопасности.

В целом окружающая средадолжно быть определено в~/.profileа не в ~/.bashrc, но если бы вы переместили задания в , ~/.profileто вы бы столкнулись с этим:~/.profileне загружается при использовании SSH. Тогда их присутствие вполне разумно ~/.bashrc.

В качестве альтернативы вы можете поместить их в отдельный файл, например ~/.special_env, и взять файл из ~/.bashrcили ~/.profileили что-то еще. Преимущество в том, что вы можете взять файл по запросу, независимо от причуд и поворотов:

ssh -i keyfile [email protected]  '. ~/.special_env; sh -v /opt/dir/script'

Связанный контент