GNU/Linux >> Tutoriales Linux >  >> Linux

bash no carga el nodo en el comando ssh remoto

Creo que el problema es la interpretación errónea de que el nodo de ejecución del shell tiene un entorno completo como lo hace una sesión ssh interactiva. Lo más probable es que este no sea el caso.

Cuando una sesión SSH genera un caparazón, pasa por muchos giros para construir un entorno adecuado para trabajar de forma interactiva. Cosas como heredar del proceso de inicio de sesión, leer /etc/profile , leyendo ~/.profile . Pero en los casos en los que ejecuta bash directamente, esto no siempre está garantizado. De hecho, el $PATH podría estar completamente vacío.

Cuando /usr/bin/env node lo ejecuta busca el nodo en su $PATH que en un shell no interactivo podría ser cualquier cosa o vacío.

La mayoría de los sistemas tienen un PATH=/bin:/usr/bin predeterminado típicamente /usr/local/bin no está incluido en el entorno predeterminado.

Podría intentar forzar un inicio de sesión con ssh usando ssh … '/bin/bash -l -c "…"' .

También puede escribir un script especializado en el servidor que sepa cómo debe ser el entorno cuando se ejecuta fuera de un shell interactivo:

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

Luego llámalo a través de ssh:ssh … '/usr/local/bin/my_script.sh' .

Más allá de estas ideas, no veo cómo ayudar más.


Como dijo Sukima, lo más probable es que esto se deba a un problema del entorno:SSH'ing en un servidor no configura un entorno completo. Sin embargo, puede evitar gran parte de esto simplemente llamando a /etc/profile usted mismo al comienzo de su comando usando la extensión . operador (que es lo mismo que el comando "fuente"):

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

/etc/profile debe configurarse para llamar al .bashrc del usuario relevante, razón por la cual eliminé esa parte. Solía ​​tener que hacer esto bastante para obtener guiones de prueba de concepto rápidos en un lugar de trabajo anterior. No sé si se consideraría un truco desagradable para una secuencia de comandos más permanente, pero sin duda funciona y requeriría una modificación mínima de su secuencia de comandos existente si eso fuera un problema.


Prueba:

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

Linux
  1. Cómo conectar un host remoto usando el comando ssh

  2. Pasar variables en el comando ssh remoto

  3. Use Expect en un script Bash para proporcionar una contraseña a un comando SSH

  4. Ejecute el comando bash en la canalización de jenkins

  5. Cómo ejecutar remotamente el comando ssh un comando sudo sin contraseña

Comando de tiempo de actividad en Linux

bash heredoc

Comando de fuente Bash

Comando SSH

Comando Bash printf

Uso del comando SSH en sistemas Linux/Unix