it-swarm.com.ru

Почему удаленная команда SSH получает меньше переменных среды, чем при запуске вручную?

У меня есть команда, которая работает нормально, если я ssh к машине и запускаю ее, но не удается, когда я пытаюсь запустить ее с помощью удаленной команды ssh, например

ssh [email protected] <command>

Сравнение вывода "env" с использованием обоих методов приводит к различным средам. Когда я вручную захожу на компьютер и запускаю env, я получаю гораздо больше переменных окружения, чем при запуске:

ssh [email protected] "env"

Есть идеи почему?

214
Tom Feiner

Существуют разные типы снарядов. Оболочка выполнения команды SSH - это неинтерактивная оболочка, тогда как обычная оболочка - это либо оболочка входа в систему, либо интерактивная оболочка. Описание следует из man bash:

 Оболочка входа - это тот, чей первый символ аргумента 
 Ноль равен -, или тот, который начинается с опции --login. 
 
 Интерактивная оболочка - это запускается без аргументов без опции 
 и без опции -c, чей стандартный ввод 
 и ошибка связаны с терминалами (как определено 
 с помощью isatty (3)), или один запущен с опцией -i. PS1 установлен 
 И $ - включает i, если bash интерактивен, что позволяет скрипту 
 Или файлу запуска проверить это состояние. 
 
 В следующих параграфах описывается как bash выполняет свои 
 загрузочные файлы. Если какой-либо из файлов существует, но не может быть прочитан 
, Bash сообщает об ошибке. Тильды раскрываются в именах файлов 
, Как описано ниже в разделе "Расширение тильды" в разделе 
 РАСШИРЕНИЕ. 
 
 Когда bash вызывается как интерактивная оболочка входа в систему или как 
 Неинтерактивная оболочка с параметром --login, она сначала 
 читает и выполняет команды из файла/etc/profile, если 
 этот файл существует. После прочтения этого файла он ищет 
 ~/.Bash_profile, ~/.bash_login и ~/.profile в этом 
 Порядке, а также читает и выполняет команды из первого 
, который существует и доступен для чтения. Опция --noprofile может использоваться 
 При запуске командной консоли, чтобы запретить это поведение. 
 Ior. 
 
 При выходе из командной консоли входа bash читает и выполняет команды 
 из файла ~/.bash_logout, если он существует. 
 
 Когда запускается интерактивная оболочка, которая не является оболочкой входа в систему 
, bash читает и выполняет команды из ~/.bashrc, 
, если этот файл существует. Это может быть запрещено с помощью опции 
 --Norc. Опция --rcfile file заставит bash 
 Читать и выполнять команды из файла вместо 
 ~/.Bashrc. 
 
 Когда bash запускается неинтерактивно например, для запуска сценария Shell 
 он ищет переменную BASH_ENV в 
 среде, расширяет ее значение, если оно там появляется, 
 и использует расширенное значение в качестве имя файла для чтения 
 и выполнения. Bash ведет себя так, как будто была выполнена следующая команда 
: 
 If [-n "$ BASH_ENV"]; затем . "$ BASH_ENV"; fi 
, но значение переменной PATH не используется для поиска 
 имени файла. 
 
159
Vinko Vrsalovic

Как насчет поиска профиля перед запуском команды?

ssh [email protected] "source /etc/profile; /path/script.sh"

Возможно, вам будет лучше изменить это на ~/.bash_profile, ~/.bashrc или что-то еще.

(Как здесь (linuxquestions.org) )

109
Ian Vaughan

Среда оболочки не загружается при запуске удаленной команды ssh. Вы можете редактировать файл окружения ssh:

vi ~/.ssh/environment

Его формат:

VAR1=VALUE1
VAR2=VALUE2

Кроме того, проверьте конфигурацию sshd для опции PermitUserEnvironment = yes.

81
dpedro

У меня была похожая проблема, но в итоге я узнал, что ~/.bashrc - это все, что мне нужно.

Однако в Ubuntu мне пришлось прокомментировать строку, которая останавливает обработку ~/.bashrc:

#If not running interactively, don't do anything
[ -z "$PS1" ] && return
60
tomaszbak

Я нашел простое решение этой проблемы - добавить исходный файл/etc/profile в начало файла script.sh, который я пытался запустить в целевой системе. В системах здесь это привело к тому, что переменные окружения, которые были необходимы для script.sh, были настроены так, как будто они запускались из командной консоли входа в систему.

В одном из предыдущих ответов было предложено использовать ~/.bashr_profile и т.д. Я не тратил много времени на это, но проблема в том, что если вы используете ssh для другого пользователя в целевой системе, а не для командной консоли в исходной системе, из которой вы вошли, мне показалось, что это вызывает пользователя исходной системы. имя, которое будет использоваться для ~.

4
Chuck

Просто экспортируйте переменные среды, которые вы хотите, выше проверки для неинтерактивной оболочки в ~/.bashrc.

3
Michael MacDonald