
Мне нужно выполнить команду 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'