2015-04-30 8 views
6

Sto provando a chiamare un'installazione di node.js su un server remoto che esegue Ubuntu tramite SSH. Il nodo è stato installato tramite nvm.node.js non disponibile via ssh

SSHing e nodo chiamando funziona bene:

[email protected]:~$ ssh [email protected] 
(Server welcome text) 
[email protected]:~$ which node 
/home/user/.nvm/v0.10.00/bin/node 

Tuttavia, se combino in una riga:

[email protected]:~$ ssh [email protected] "which ls" 
/bin/ls 
[email protected]:~$ ssh [email protected] "which node" 

Nessun segno di nodo, così ho cercato di sourcing .bashrc e in attesa 10 secondi:

[email protected]:~$ ssh [email protected] "source ~/.bashrc; sleep 10; which node" 

Solo il nodo sembra interessato da questo. Una cosa che ho notato è che se mi ssh in e quindi controllare quale shell sono dentro dice -bash mentre se ho ssh direct mi dà /bin/bash. Ho provato a eseguire i comandi all'interno di una shell di login bash:

[email protected]:~$ ssh [email protected] 'bash --login -c "which node"' 

Ancora niente.

Fondamentalmente la mia domanda è: Perché non è bash trovare l'installazione node.js quando la chiamo in modo non interattivo da SSH?

risposta

3
$ ssh [email protected] "which node" 

Quando si esegue ssh e si specifica un comando da eseguire sul sistema remoto, ssh di default non alloca un PTY (pseudo-TTY) per la sessione. Non avendo un TTY, il processo della shell remota (ad esempio, bash) viene inizializzato come sessione non interattiva anziché come sessione interattiva. Questo può alterare il modo in cui interpreta i file di inizializzazione -. Bashrc, .bash_profile e così via.

Il problema reale è probabilmente che la riga che aggiunge /home/user/.nvm/v0.10.00/bin al comando PATH non è in esecuzione per le sessioni non interattive. Ci sono due modi per risolvere questo:

  1. trovare il comando nel file di inizializzazione (s) che aggiunge /home/user/.nvm/v0.10.00/bin al percorso di comando, a capire il motivo per cui non è in esecuzione per le sessioni non interattive, e correggerlo.

  2. Eseguire ssh con l'opzione -t. Questo gli dice di allocare un PTY per la sessione remota. Oppure aggiungi la riga RequestTTY yes al tuo file .ssh/config sull'host locale.

+0

ho eseguito come utente ssh -t @ remoteserver "quale nodo", ma ancora non lo fa Trovalo. L'aggiunta di RequestTTY al file .ssh/config sembra non avere alcun effetto. – TDN169

+0

Ho anche provato ssh -t utente @ remoteserver "bash --rcfile ~/.bashrc -c" quale nodo "" che non sembra avere un effetto. – TDN169

+1

Ho appena provato: ssh -t utente @ remoteserver 'export NVM_DIR = "/ home/utente/.nvm"; [-s "$ NVM_DIR/nvm.sh"] &&. "$ NVM_DIR/nvm.sh"; quale nodo 'e funziona! – TDN169