2009-06-02 8 views
112

Non riesco a impostare un nuovo $ PATH in modo che venga utilizzato quando si eseguono i comandi tramite ssh [email protected] command. Ho provato ad aggiungere export PATH=$PATH:$HOME/new_path a ~/.bashrc e ~/.profile sul computer remoto, ma eseguendo ssh [email protected] "echo \$PATH" evidenziato che il cambiamento non è stato preso (si vede/usr// sbin locale:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games). La macchina remota sta eseguendo Ubuntu 8.04.

Sono sicuro che avrei potuto incidere in/etc/profile, ma non è una soluzione pulita e funziona solo quando si ha accesso come root.

+0

Ho provato ad aggiungere ' export PATH = $ PATH: $ HOME/new_path' in ~/.bash_login e ~/.bash_profile (in aggiunta a ~/.bashrc e ~/.profile precedentemente provati). Né funziona. In entrambi i casi ho dovuto creare il file. –

+0

Nel mio caso d'uso particolare, non è facile modificare il comando inviato a ssh. Sto usando stfufs (http://www.guru-group.fi/too/sw/stfufs/), che costruisce il comando ssh stesso. Mi rendo conto che il suo metodo non è una soluzione eccezionale, ma sarebbe bello correggerlo senza modificare gli stfuf. –

+0

Si potrebbe mettere un wrapper ssh in modo stfufs', chiamare il vero ssh con args modificati, se questo è più facile – Hasturkun

risposta

152

Come ha detto grawity PATH , ~/.bashrc è quello che vuoi, dal momento che è originato da shell non interattive non interattive.

mi aspetto che il problema che stai avendo ha a che fare con l'Ubuntu file ~/.bashrc di default.Di solito inizia con qualcosa di simile:

# If not running interactively, don't do anything 
[ -z "$PS1" ] && return 

si vuole mettere qualcosa per shell non interattive prima questa linea.

+1

Sì, ho spostato il 'export PATH = $ PATH: $ HOME/new_path' sopra quella linea e ha funzionato. Grazie! –

+2

.bashrc non è affidabile. man bash: "Bash tenta di determinare quando viene eseguito con il suo input standard collegato a una connessione di rete". Funziona su RHEL, ma non su Archlinux. Ho dovuto modificare/etc/environment per modificare il PATH predefinito – basin

6

si può sempre dire:

ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH' 
+0

Questa soluzione non ha bisogno di alcun cambiamento sulla macchina remota, che è una buona cosa. –

29

Avete un ~/.bash_login o ~/.bash_profile?

Bash in assegni modalità interattive per questi file, e utilizza il prima esistente, in questo ordine:

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.profile

Quindi, se si avere un ~/.bash_profile, quindi qualsiasi modifica apportata a ~/.profile rimarrà invisibile.

Bash in modalità non interattiva volte legge il file ~/.bashrc (che è anche spesso source'd dagli script interattivi.) Con il termine "a volte" Voglio dire che è la distribuzione-dipendente: abbastanza stranamente, c'è un opzione di compilazione per abilitare questo. Debian abilita la lettura di ~/.bashrc, mentre ad es. L'arco no.

ssh sembra utilizzare la modalità non interattiva, quindi ~/.bashrc dovrebbe essere sufficiente. In caso di problemi come questo, di solito aggiungo alcuni echo per vedere quali file vengono eseguiti.

+0

Aggiunta gli echi aiutato ... ma sto ancora inseguire un modo per eseguire 'ssh-X macchina remota 'xterm'' e avere il sistema completo/percorso utente/etc/profile e ~/home/nomeutente/.bash_profile . Se provo entrambi i file nel comando, funziona ... ma è brutto:). – Jess

+0

Come fai a sapere che "Bash in modalità non interattiva legge il file' ~/.bashrc' "? Non vedo questa affermazione nella manpage. Grazie – nknight

+3

Se vuoi una shell non interattiva non-login per l'origine '~/.bashrc', sembra che sia necessario impostare ulteriormente la variabile d'ambiente' BASH_ENV'; vedi http://superuser.com/a/585699/100843. Per le shell di login non interattive, probabilmente dovresti modificare uno dei tre script di avvio che hai menzionato. – nknight

18

documentazione ssh dice:

Se non viene specificato il comando, viene eseguito sulla macchina remota, invece di una shell di login.

motivo per cui l'aggiunta ai file di bashrc non funziona. non però hanno le seguenti opzioni:

  1. Se l'opzione PermitUserEnvironment sorge nel config sshd, è possibile aggiungere l'impostazione di ~/.ssh/environment

  2. ssh remotemachine 'bash -l -c "somecommand"'

+0

1. Non è impostato nel mio sshd config e 'man sshd_config' dice che è disattivato per impostazione predefinita, quindi è improbabile che questa soluzione possa funzionare per la maggior parte delle persone. 2. Questo potrebbe funzionare, ma non posso modificare facilmente il comando inviato al ssh (vedere il secondo commento alla mia domanda). –

+1

1. Non funziona come previsto, perché in ~/.ssh/environment, non è possibile aggiungere percorsi a PATH, perché $ PATH non verrà risolto. – not2savvy

2

Proprio avevano lo stesso problema io stesso, risolto con:

ssh [email protected] PATH=\$HOME/bin:\$PATH\; remote-command 
2

Oltre a @signpolyma risposta, si dovrà aggiungere l'esportazione prima queste linee

# If not running interactively, don't do anything 
case $- in 
    *i*) ;; 
     *) return;; 
esac 
+0

In realtà ho appena commentato completamente queste righe - trovato in ~/.bashrc nel desktop LTS di Ubuntu 16.04. No, tutto funziona. Impostare anche PermitUserEnvironment su yes. – Ernie

Problemi correlati