Как удаленно запустить сценарий узла (с префиксом Шебанга), используя ssh? - PullRequest
1 голос
/ 26 марта 2019

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

myscript файл:

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

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

ssh -o "PasswordAuthentication no" bob@123.1.2.3 /path/to/myscript arg1

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

Я пропускаю ssh параметр / параметр?


Сведения о режиме: если я запускаю

ssh -o "PasswordAuthentication no" bob@123.1.2.3 echo "hello"

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

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

Ответы [ 2 ]

1 голос
/ 26 марта 2019

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

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

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

ssh -t -o "PasswordAuthentication no" bob@123.1.2.3 'bash -ic "/path/to/myscript arg1"'
0 голосов
/ 27 марта 2019

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

ssh -o "PasswordAuthentication no" bob@123.1.2.3 "export PATH=$PATH;/path/to/myscript arg1"

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


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

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