Come posso impostare $ PATH in modo che funzioni `ssh user @ host command`?


129

Non riesco a impostare un nuovo $ PATH in modo tale che venga utilizzato durante l'esecuzione dei comandi tramite ssh user@host command. Ho provato ad aggiungere export PATH=$PATH:$HOME/new_patha ~ / .bashrc e ~ / .profile sul computer remoto, ma l'esecuzione ssh user@host "echo \$PATH"mostra che la modifica non è stata presa (mostra / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games). Il computer remoto esegue Ubuntu 8.04.

Sono sicuro di poterlo hackerare in / etc / profile, ma questa non è una soluzione pulita e funziona solo quando si ha accesso come root.


1
Ho provato ad aggiungere export PATH=$PATH:$HOME/new_pathsia a ~ / .bash_login che a ~ / .bash_profile (oltre ai ~ / .bashrc e ~ / .profile precedentemente provati). Né funziona. In entrambi i casi ho dovuto creare il file.
Denver Gingerich,

Nel mio caso d'uso particolare, non è facile modificare il comando inviato a ssh. Sto usando stfufs ( guru-group.fi/too/sw/stfufs ), che costruisce il comando ssh stesso. Mi rendo conto che il suo metodo non è un'ottima soluzione, ma sarebbe bello ripararlo senza modificare gli stfufs.
Denver Gingerich,

Potresti mettere un wrapper ssh alla maniera di stfufs, chiamare il vero ssh con arg modificati, se è più facile
Hasturkun,

Risposte:


179

Come ha detto grawity, ~ / .bashrc è quello che vuoi, dato che proviene da shell non interattive non login.

Mi aspetto che il problema riscontrato abbia a che fare con il file Ubuntu ~ / .bashrc predefinito. Di solito inizia con qualcosa del genere:

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

Vuoi mettere qualsiasi cosa per shell non interattive prima di questa riga.


1
Sì, ho spostato export PATH=$PATH:$HOME/new_pathsopra quella linea e ha funzionato. Grazie!
Denver Gingerich,

3
.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 cambiare il PERCORSO predefinito
bacino

Dovresti aggiungere menzione .zshenvper gli utenti di zsh, mi ci è voluto un po 'di tempo per trovarlo nei commenti su altre risposte
Mike

30

Hai un ~/.bash_logino ~/.bash_profile?

Bash in modalità interattiva controlla questi file e utilizza il primo esistente , in questo ordine:

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

Quindi, se ne hai uno ~/.bash_profile, allora qualunque cambiamento tu faccia, ~/.profilesarà lasciato invisibile.

Bash in modalità non interattiva a volte legge il file ~/.bashrc(che spesso viene anche ricavato dagli script interattivi). Per "a volte" intendo che dipende dalla distribuzione: stranamente, c'è un'opzione di compilazione in tempo per abilitare questo . Debian abilita la ~/.bashrclettura, mentre ad esempio Arch no.

ssh sembra utilizzare la modalità non interattiva, quindi ~/.bashrcdovrebbe bastare. Quando ho problemi come questo, di solito aggiungo qualche eco per vedere quali file vengono eseguiti.


L'aggiunta di echos mi ha aiutato ... ma sto ancora cercando un modo per eseguire 'ssh -X remotemachine "xterm"' e avere il percorso completo utente / sistema da / etc / profile e ~ / home / nomeutente / .bash_profile. Se provo entrambi i file nel comando, funziona .. ma è brutto :)).
Jess,

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

4
Se si desidera che una shell non di accesso non interattiva esegua il source ~/.bashrc, sembra che sia necessario impostare ulteriormente la variabile di ambiente BASH_ENV; vedi superuser.com/a/585699/100843 . Per le shell di login non interattive, probabilmente dovresti modificare uno dei tre script di avvio che hai citato.
nknight

3
Per ZSH il file non interattivo è:.zshenv
matematica

2
@math .zshenvè sempre di provenienza; non importa se è interattivo o meno.
JoL

19

la documentazione di ssh dice:

Se viene specificato un comando, viene eseguito sull'host remoto anziché su una shell di accesso.

ecco perché l'aggiunta ai file bashrc non funziona. hai comunque le seguenti opzioni:

  1. Se l' PermitUserEnvironmentopzione è impostata nella configurazione sshd, è possibile aggiungere l'impostazione PATH a~/.ssh/environment

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


1. Non è impostato nella mia configurazione sshd e man sshd_configdice che è disattivato di default, quindi è improbabile che questa soluzione funzioni per la maggior parte delle persone. 2. Funzionerebbe, ma non posso modificare facilmente il comando inviato a ssh (vedi il secondo commento sulla mia domanda).
Denver Gingerich,

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

8

Puoi sempre dire:

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

Questa soluzione non necessita di alcuna modifica sul computer remoto, il che è positivo.
Ronny Andersson,

2

Oltre alla risposta @signpolyma, dovrai aggiungere l'esportazione prima di queste righe

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

In realtà ho appena commentato queste righe del tutto - trovate in ~ / .bashrc sul desktop Ubuntu 16.04 LTS. Non tutto funziona. Impostare anche PermitUserEnvironment su yes.
Ernie S,

2

Ho appena avuto lo stesso problema, risolto con:

ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.