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

<p>у меня есть команда, которая работает нормально, если я ssh к машине и запускаю ее, но не удается, когда я пытаюсь запустить ее с помощью удаленной команды ssh, например</p><pre><code>ssh user@ip <command> </code></pre><p>сравнение вывода "env" с использованием обоих методов приводит к различным средам. когда я вручную захожу на компьютер и запускаю env, я получаю гораздо больше переменных окружения, чем при запуске:</p><pre><code>ssh user@ip "env" </code></pre><p>есть идеи почему?</p>

<p>существуют разные типы снарядов. оболочка выполнения команды ssh - это неинтерактивная оболочка, тогда как обычная оболочка - это либо оболочка входа в систему, либо интерактивная оболочка. описание следует из man bash:</p><pre> оболочка входа - это тот, чей первый символ аргумента ноль равен -, или тот, который начинается с опции --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 не используется для поиска имени файла. 

как насчет поиска профиля перед запуском команды?ssh user@host "source /etc/profile; /path/script.sh"возможно, вам будет лучше изменить это на ~/.bash_profile, ~/.bashrc или что-то еще.(как <a href="http://www.linuxquestions.org/questions/linux-enterprise-47/simple-rsh-issue-621882/?posted=1#post3695616">здесь (linuxquestions.org) )

среда оболочки не загружается при запуске удаленной команды ssh. вы можете редактировать файл окружения ssh:vi ~/.ssh/environment его формат:var1=value1 var2=value2 кроме того, проверьте конфигурацию sshd для опции permituserenvironment = yes.

у меня была похожая проблема, но в итоге я узнал, что ~/.bashrc - это все, что мне нужно.однако в ubuntu мне пришлось прокомментировать строку, которая останавливает обработку ~/.bashrc:#if not running interactively, don't do anything [ -z "$ps1" ] && return </code></pre>

<p>я нашел простое решение этой проблемы - добавить исходный файл/etc/profile в начало файла script.sh, который я пытался запустить в целевой системе. в системах здесь это привело к тому, что переменные окружения, которые были необходимы для script.sh, были настроены так, как будто они запускались из командной консоли входа в систему.</p><p>в одном из предыдущих ответов было предложено использовать ~/.bashr\_profile и т.д. я не тратил много времени на это, но проблема в том, что если вы используете ssh для другого пользователя в целевой системе, а не для командной консоли в исходной системе, из которой вы вошли, мне показалось, что это вызывает пользователя исходной системы. имя, которое будет использоваться для ~.</p>

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