Posso eseguire alcuni comandi all'avvio della sessione ssh prima di passare alla modalità interattiva?


13

All'avvio della sessione ssh con il comando ssh mi sembrano avere due opzioni - sessione interattiva predefinita con env predefinito e partenza dalla home directory - o per eseguire un comando arbitrario ma non interattivo (anche i trucchi come ssh "command; command; bash -i -l"non sembrano fare molto bene). Molto spesso voglio una sessione interattiva, ma con qualcosa che sta accadendo prima - normalmente un cambio di directory, o talvolta una regolazione dell'ambiente di sistema. Queste cose potrebbero variare da una sessione all'altra, quindi non posso semplicemente applicarle .bashrc.

C'è un modo per farlo accadere?

Risposte:


13

Sto rispondendo da solo, poiché ho finalmente scoperto il segreto. Nessuna -topzione per ssh, né -lopzione per bashporterà alla shell di login da soli - ma in combinazione funzionano.

ssh user@host.com -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l'cambia le variabili di ambiente di directory, set, e poi inizia shell di login corretto (l'unica differenza che ho trovato finora è che /etc/motdnon viene visualizzato in questo modo - è normalmente ssh's o login' s responsabilità, non bashs' - a parte questo tutto sembra per funzionare perfettamente e tutte le variabili ambientali sono identiche).

Queste modifiche all'ambiente / directory avvengono dopo ssh, quindi non sono limitate dalle PermitUserEnvironmentimpostazioni correlate (esattamente come pianificato), ma prima .bashrc/ .profilevengono eseguite. Questo ha aspetti positivi e negativi: è più difficile sovrascrivere qualcosa che viene impostato da script bash init come PS1, ma è più facile impacchettare esattamente i giusti valori nelle sshrighe di comando e .profilefare tutto il lavoro pesante.

E se davvero necessario, in realtà è abbastanza facile ottenere bash per eseguire qualcosa dopo .profilecon la riga di comando simile ssh user@foo.com -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\\h-\w \"" >~/xxx; bash --init-file ~/xxx'- molto brutto se messo in quel modo, ma questi .profilefile alternativi possono essere preparati prima. (per quanto ne so bashha alcune posizioni candidate per lo .profilescript ed eseguirà il primo trovato - . filenon ha tali fallback automatici, quindi dovrai controllare dove è il tuo normale profilese vuoi farlo)


Fantastico, grazie per questo! Stavo cercando di trovare un modo per accedere all'account di un utente subito dopo averlo inserito, e l'opzione "-t" l'ha fatto funzionare. Senza quell'opzione, la tua shell non ha un prompt, non ha una cronologia dei comandi, muore per un SIGINT, ecc.
Ashoat,

Questa risposta è davvero utile ma ti mancano alcuni ;s dalla prima stringa di login ssh. Non mi permetterà di modificare la tua risposta perché non sto cambiando abbastanza. Ho fatto funzionare tutto questo ssh user@host.com -t 'cd /some/where; FOO=BAR; NUMBER=42; bash -l'. Penso che sia quello che volevi.
Rob Kwasowski il

2

Modifica .bashrc e racchiudi le impostazioni dell'ambiente specifico di SSH in:

if [ $SSH_TTY ]; then
    ...
fi

Ciò consentirebbe di aggiungere impostazioni specifiche per le sessioni SSH. "Certo, se tutto ciò che vuoi è impostare le variabili di ambiente arbitrarie all'inizio che variano in base alla sessione, non so come puoi fare in modo che la macchina le indovini per te oltre a digitarle ... non importa cosa, tu" Avremo bisogno di alcune condizioni verificabili su cui basare la scelta delle impostazioni.


2

Dalla sshpagina man:

Inoltre, ssh legge ~ / .ssh / environment e aggiunge righe del formato “VARNAME = value” all'ambiente se il file esiste e gli utenti sono autorizzati a cambiare il loro ambiente. Per ulteriori informazioni, vedere l'opzione PermitUserEnvironment in sshd_config (5).

che dice:

PermitUserEnvironment
Specifica se ~ / .ssh / environment e environment = options in ~ / .ssh / authorized_keys sono elaborati da sshd (8). L'impostazione predefinita è "no". L'abilitazione dell'elaborazione dell'ambiente può consentire agli utenti di ignorare le restrizioni di accesso in alcune configurazioni utilizzando meccanismi come LD_PRELOAD.

Questa funzione potrebbe essere utilizzata per eseguire in modo condizionale istruzioni nel tuo telecomando ~/.bashrcusando la ifstruttura suggerita da Mickey .


1

Esegui semplicemente in questo modo: ssh -t yourdomain 'cd /yourpath; bash'

  • -t : in modo che il prompt venga visualizzato
  • ; bash: in modo che restituisca il controllo nonostante l'esecuzione del comando (qui cd) e l'uscita dalla sessione ssh

Benvenuti in ServerFault! Fornire e spiegazione e / o documentazione per comandi o script per spiegare a cosa servono.
Cory Knutson,

1
Grazie @CoryKnutson, ho apportato le modifiche da te richieste
Sumit Ramteke
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.