У меня есть скрипт на сервере-А
Скрипт-А
#!/bin/bash -l
echo "script-A.sh" | change-environment.sh
Когда я ssh на server-A и запускаю его, он работает нормально. Однако когда я
ssh user@server-A ./script-A.sh
Script-A выполняется, но выдает ошибку неопределенной переменной в change-environment.sh.
change-environment.sh запускается в оболочке c (у меня нет контроля над сценарием, поэтому метод, который я использовал, - это единственный способ его использования), но все остальное находится в bash.
Нашел аналогичный вопрос на Я могу запустить сценарий локально, но не могу выполнить "ssh HOSTNAME /path/to/script.sh". Однако решения вопроса не было, и ему был год.
Скорее всего, вам понадобится терминал (tty). Вы можете просто запустить ssh и принудительно использовать псевдотерминал, и он должен работать нормально
ssh -tt удаленный_хост "ваш_скрипт"
При использовании ssh с командой он может фактически не создать оболочку входа в систему, даже если ваш сценарий использует #!/bin/bash -l
.
Пытаться ssh user@server-A bash -l
, затем запустите свой скрипт. Вы также можете создать что-то вроде
#!/bin/bash
export
Затем запустите его после входа в систему вручную (ssh user@server-A
) и при использовании ssh с командой (ssh user@server-A name-of-that-script.sh
).
Например, в Mac OS X, используя ssh martin@nathan bash -l
даже не устанавливает PS1
, тогда как обычно ssh martin@nathan
интерактивная оболочка.
Еще одно важное отличие состоит в том, что псевдотерминал выделяется только при интерактивной работе (вход в систему без команды).
Вам действительно нужно сравнивать свои среды, .profile поможет вам сохранить их неизменными. Почему бы вам не пройтись по вашему коду и не посмотреть, от каких env vars он зависит? Затем вы можете исправить эти переменные env внутри своего скрипта-A. Кстати, я также советую вам при отладке вызывать такие сценарии bash:
bash -v
(подробный)