GNU/Linux >> Linux Esercitazione >  >> Linux

bash non carica il nodo sul comando ssh remoto

Penso che il problema sia l'errata interpretazione secondo cui il nodo di esecuzione della shell ha un ambiente completo come fa una sessione ssh interattiva. Molto probabilmente non è così.

Quando una sessione SSH genera una shell, passa attraverso molte rotazioni per creare un ambiente adatto a lavorare in modo interattivo. Cose come ereditare dal processo di accesso, leggere /etc/profile , leggendo ~/.profile . Ma nei casi in cui l'esecuzione diretta di bash non è sempre garantita. Infatti il ​​$PATH potrebbe essere completamente vuoto.

Quando /usr/bin/env node esegue cerca il nodo nel tuo $PATH che in una shell non interattiva potrebbe essere qualsiasi cosa o vuota.

La maggior parte dei sistemi ha un PATH=/bin:/usr/bin predefinito tipicamente /usr/local/bin non è incluso nell'ambiente predefinito.

Puoi tentare di forzare un login con ssh usando ssh … '/bin/bash -l -c "…"' .

Puoi anche scrivere uno script specializzato sul server che sappia come dovrebbe essere l'ambiente quando viene eseguito al di fuori di una shell interattiva:

#!/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

Quindi chiamalo tramite ssh:ssh … '/usr/local/bin/my_script.sh' .

Al di là di queste idee non vedo come aiutare ulteriormente.


Come ha detto Sukima, è probabile che ciò sia dovuto a un problema di ambiente:l'accesso tramite SSH a un server non configura un ambiente completo. Puoi, tuttavia, aggirare gran parte di questo semplicemente chiamando tu stesso /etc/profile all'inizio del tuo comando usando l'estensione . operatore (che è lo stesso del comando "source"):

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

/etc/profile dovrebbe essere esso stesso impostato per chiamare il .bashrc dell'utente pertinente, motivo per cui ho rimosso quella parte. In passato dovevo farlo parecchio per script di proof-of-concept rapidi in un posto di lavoro precedente. Non so se sarebbe considerato un brutto trucco per uno script più permanente, ma sicuramente funziona e richiederebbe modifiche minime allo script esistente se dovesse essere un problema.


Prova:

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

Linux
  1. Come vengono analizzati gli argomenti della riga di comando remota Ssh?

  2. Come connettere l'host remoto usando il comando ssh

  3. Come creare un picco della CPU con un comando bash

  4. comando di esportazione bash

  5. Esegui il comando bash sulla pipeline jenkins

Comando Uptime in Linux

Bash Heredoc

Comando sorgente Bash

Comando SSH

Comando Bash printf

Utilizzo del comando SSH nei sistemi Linux/Unix