Как удаленно запустить скрипт узла (с префиксом shebang) с помощью ssh?

Я хочу удаленно запустить сценарий node.js, содержащий shebang line - ssh, точно так же, как при локальном запуске.

myscript файл:

#!/usr/bin/env node
var param  = process.argv[2] || 'help';
//... other js code

При работе локально на каждом хосте - например, myscript arg1 - работает успешно. При удаленной работе на «сестринском» узле в кластере (содержащем ту же структуру файлов и каталогов, включая node и myscript):

ssh -o "PasswordAuthentication no" [email protected] /path/to/myscript arg1

Я получаю /usr/bin/env: ‘node’: No such file or directory ошибку.

Мне не хватает ssh параметра / параметра?


Детали режима: Если я бегу

ssh -o "PasswordAuthentication no" [email protected] echo "hello"

Тоже нормально работает. Простите меня, это очевидно для вас, я не продвинутый пользователь Linux, руководство по ssh показался немного подавляющим, и безуспешно попробовал пару ответов, найденных здесь:

  1. Что именно делает / usr / bin / env node делать в начале файлов node?
  2. Запускать сценарии удаленно через SSH
  3. как запустить файл сценария удаленно с помощью ssh

person Ricardo    schedule 26.03.2019    source источник
comment
Вы уверены, что node одинаково установлен на всех узлах кластера?   -  person Tim Klein    schedule 26.03.2019
comment
Я получаю это сообщение, если узел не установлен или путь к узлу неверный   -  person jemiloii    schedule 26.03.2019
comment
Пожалуйста, проверьте, будет ли это работать ssh -o "PasswordAuthentication no" [email protected] bash -c "/path/to/myscript arg1"   -  person Michał Karpacki    schedule 26.03.2019
comment
Вопрос отредактирован. Да, node и myscript установлены в одном месте; и нет, bash -c ... не получил другого результата.   -  person Ricardo    schedule 27.03.2019


Ответы (2)


Если исполняемый файл node еще не находится в вашей переменной среды PATH при входе в систему, вы можете указать полный путь к нему в строке shebang вашего скрипта:

#!/usr/bin/env /full/path/to/node

Как отмечали другие, вам придется обновить свой скрипт, если путь к node когда-либо изменится. Это не идеально. В качестве альтернативы вы можете заставить ssh создать сеанс псевдотерминала, указав флаг -t и запустив свой скрипт в интерактивной оболочке bash:

ssh -t -o "PasswordAuthentication no" [email protected] 'bash -ic "/path/to/myscript arg1"'
person Sebastian Wyngaard    schedule 26.03.2019
comment
Привет, Себастьян - я думаю, что это может быть рабочее решение, но обратите внимание, что это не изящное решение - особенно если вы решите использовать разные версии узла и т. Д. Жесткое кодирование полного пути к узлу может потенциально повлиять на работу менеджеров версий, таких как nvm. .. - person Michał Karpacki; 26.03.2019
comment
PATH как локальных, так и удаленных хостов правильно указывают на местоположения node и myscript. Однако ваше предложение сработало после добавления кавычек в "/path/to/myscript arg1". Тогда есть ли способ убедиться, что путь загружен с помощью ssh вместо жесткого кодирования /full/path/to/node на myscript? Это может вызвать регресс, если местоположение узла изменится в будущем ... - person Ricardo; 27.03.2019
comment
@ Рикардо, возможно, есть решение ... можешь ли ты сделать следующее: ssh <opts> -t 'bash -ic '"'"'echo $PATH'"'"''? Я полагаю, что вывод будет несколько отличаться от _2 _..., вероятно, дело в том, где вы на самом деле задали путь. - person Michał Karpacki; 27.03.2019

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

ssh -o "PasswordAuthentication no" [email protected] "export PATH=$PATH;/path/to/myscript arg1"

Но это сработало только для меня, потому что и локальный, и удаленный серверы имеют одинаковое значение PATH, поскольку локальный PATH устанавливается на удаленный сеанс.


Здесь могут быть способы изучить другие решения, если ваш случай не похож на мой:

  1. Как мне установить $ PATH таким образом, чтобы `ssh user @ host command` работает?
  2. Как установить PATH при запуске команды ssh?
person Ricardo    schedule 27.03.2019