Come impostare PATH quando si esegue un comando ssh?


18

Supponendo che l'utente abbia /bin/bashcome shell in /etc/passwd. Quindi ssh user@host commandesegue il comando utilizzando Bash. Tuttavia, quella shell non è né login né interattiva, il che significa che non è ~/.bash_profilené di ~/.bashrcprovenienza. In tal caso, come impostare la PATHvariabile di ambiente in modo che sia possibile trovare ed eseguire gli eseguibili? Si consiglia di aggiungere il prefisso al comando effettivo source ~/.bashrc?


5
.bashrcè di provenienza, ma probabilmente ha un test di interattività nella parte superiore. Le cose che metti prima di quel controllo dovrebbero applicarsi, ed è quello che faccio per forzare PATH quando il server non consente l'ambiente dell'utente o l'uso ~/.pam_environment.
Muru,

Risposte:


18

Hai poche possibilità:

  • Impostare PATHon sul server in ~/.ssh/environment(deve essere abilitato da PermitUserEnvironment yesin sshd_config).
  • Usa il percorso completo per il binario
  • Come hai detto, fonte manualmente .bashrc: prefisso il comando con . ~/.bashrc(o source)

Dipende praticamente dal caso d'uso, da che parte andare.


6
L'approvvigionamento manuale ~/.bashrcnon è necessario, accade per impostazione predefinita. In effetti, mi sembra una cattiva idea.
sorontar

$PATHnon si espande da ~/.ssh/environment, almeno non in OpenSSH_7.9p1, OpenSSL 1.1.1b 26 Feb 2019.
Jaakko,

1
@Jaakko È probabilmente disabilitato in sshd_config utilizzando PermitUserEnvironment(impostazione predefinita nelle versioni recenti)
Jakuje,

L'ho capito, non si stava espandendo perché ho aggiunto una riga PATH="$PATH:/new/path"alla mia ~/.ssh/environmentquando avrebbe dovuto esserePATH=$PATH:/new/path
Jaakko,

4

Stai equiparando le impostazioni locali alle impostazioni remote .

Localmente, un'istanza bash, l'attuale shell in esecuzione in cui si scrive:

ssh user@host command

Eseguirà il comando ssh (niente di più) come client ssh.
Per fare ciò la shell locale non deve avviare una sub-shell o una nuova shell o effettuare il login.

Il comando viene eseguito come lscomando è: localmente.

È il comando client ssh che apre una connessione di rete a un sistema remoto , dove, se autenticato correttamente, verrà avviata una nuova shell per eseguire il comando scritto come argomento su ssh o, se non viene fornito alcun argomento, si aspettano ulteriori comandi su quella connessione.

Quella nuova shell remota sarà necessariamente una shell di accesso poiché l'utente remoto (per quel sistema) deve essere autenticato per accedere. Oppure, se viene fornito un comando specifico, basta eseguire tale comando con i privilegi dell'utente autenticato.

Puoi vedere quali file provengono aggiungendo $file sourceda all'inizio di ogni file (nel sistema remoto ) (è necessario root per cambiare i /etc/file):

$ a=(~/.bashrc ~/.profile /etc/bash.bashrc /etc/profile)
$ for f in "${a[@]}"; do sed -i '1 i\echo "'"$f"' was read"\n' "$f"; done

E poi basta avviare una console ssh:

$ ssh sorontar@localhost
/etc/profile was read
/etc/bash.bashrc was read
/home/sorontar/.profile was read
/home/sorontar/.bashrc was read

In questo caso, entrambi i bashrcfile sono stati letti perché ogni profilefile aveva i comandi per includerli, non perché la shell di login li proviene direttamente.

$ ssh sorontar@localhost :
/etc/bash.bashrc was read
/home/sorontar/.bashrc was read

In questo sistema, dove bashrcviene letto in entrambi i casi.

Non è necessario aggiungere source ~/.bashrca al comando per eseguire.

Cambia PERCORSO

Tutto quello che devi fare è includere le impostazioni corrette per modificare "$ PATH", sia /etc/bash.bashrcper tutti gli utenti che avviano una shell in questo sistema. O ~/.bashrcper ogni utente che ne ha bisogno. Si potrebbe aggiungere (o modificare) uno scheletro di un utente .bashrcper /etc/skel/avere ogni nuovo utente creato avere il file corretto disponibili.

Quanto sopra è valido solo per bash. Se hai bisogno che l'impostazione funzioni per tutte le shell, probabilmente imposta la variabile d'ambiente PATH usando il file ssh ~/.ssh/environmentper ogni utente che ne ha bisogno. Oppure utilizzare /etc/ssh/sshrcper un'impostazione globale nel sistema in cui è in esecuzione il server SSH (leggere la sezione File man sshdper ulteriori dettagli).

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.