GNU/Linux >> Znalost Linux >  >> Linux

bash nenačte uzel při vzdáleném příkazu ssh

Myslím, že problém je v nesprávné interpretaci, že uzel spouštějící shell má plné prostředí jako interaktivní relace ssh. S největší pravděpodobností tomu tak není.

Když relace SSH vytvoří shell, prochází mnoha změnami, aby se vytvořilo prostředí vhodné pro interaktivní práci. Věci jako dědění z procesu přihlášení, čtení /etc/profile , čtení ~/.profile . Ale v případech, kdy provádíte bash přímo, to není vždy zaručeno. Ve skutečnosti $PATH může být úplně prázdný.

Když /usr/bin/env node spustí, hledá uzel ve vašem $PATH který v neinteraktivním shellu může být cokoli nebo prázdný.

Většina systémů má výchozí PATH=/bin:/usr/bin obvykle /usr/local/bin není součástí výchozího prostředí.

Můžete se pokusit vynutit přihlášení pomocí ssh pomocí ssh … '/bin/bash -l -c "…"' .

Můžete také napsat specializovaný skript na serveru, který ví, jak by mělo prostředí vypadat při spuštění mimo interaktivní shell:

#!/bin/bash
# Example shell script; filename: /usr/local/bin/my_script.sh
export PATH=$PATH:/usr/local/bin
export NODE_PATH=/usr/local/share/node
export USER=myuser
export HOME=/home/myuser
source $HOME/.nvm/nvm.sh
cd /usr/bin/share/my_script
nvm use 0.12
/usr/bin/env node ./script_name.js

Pak to zavolejte přes ssh:ssh … '/usr/local/bin/my_script.sh' .

Kromě těchto nápadů nevidím, jak dále pomoci.


Jak řekl Sukima, je pravděpodobné, že je to způsobeno problémem s prostředím - připojení SSH na server nenastaví úplné prostředí. Většinu z toho však můžete obejít jednoduše zavoláním /etc/profile na začátku vašeho příkazu pomocí . operátor (který je stejný jako příkaz "source"):

ssh [email protected] '. /etc/profile ; cd project; pm2 restart app.js -x -- --prod'

/etc/profile by měl být nastaven tak, aby volal .bashrc příslušného uživatele, proto jsem tuto část odstranil. Dřív jsem toho musel dělat poměrně často pro rychlé skripty pro ověření konceptu na předchozím pracovišti. Nevím, jestli by to bylo považováno za ošklivý hack pro trvalejší skript, ale určitě to funguje a pokud by to byl problém, vyžadovalo by to minimální úpravy vašeho stávajícího skriptu.


Zkuste:

ssh [email protected] 'bash -l -c "source /home/pi/.bashrc; cd project; pm2 restart app.js -x -- --prod"'

Linux
  1. Předávání proměnných ve vzdáleném příkazu ssh

  2. Použijte Expect ve skriptu Bash k zadání hesla příkazu SSH

  3. příkaz pro export bash

  1. Jak se analyzují argumenty vzdáleného příkazového řádku Ssh?

  2. Jak vzdáleně spustit příkaz ssh a příkaz sudo bez hesla

  3. SSH - Jak zahrnout příkaz -t do souboru ~/.ssh/config

  1. Provedení vzdáleného příkazu při připojení Ssh, před přihlášením?

  2. Jak připojit vzdálený hostitel pomocí příkazu ssh

  3. Jak vytvořit špičku CPU pomocí příkazu bash