Come posso eseguire uno script immediatamente dopo la connessione tramite SSH?


24

Ho iniziato a porre questa domanda ma ho risposto mentre l'avevo aperta. Pubblicherò questa domanda, la seguirò con la mia soluzione e la lascerò aperta ad altre potenziali soluzioni.

<retroscena>

Sono un utente tmux e vim. Mi piace il lavoro remoto di Vim in quanto non devo preoccuparmi delle macchine di sviluppo di Ubuntu che si attivano quando un filmato in flash mi dà il panico del kernel. Eseguire tmux significa che i file aperti mi stanno aspettando dopo il riavvio e posso continuare da dove avevo interrotto. Ho avuto problemi con vim in esecuzione in una sessione di tmux quando mi collego in questo modo:

ssh example.com -t 'tmux attach'

Problemi di UTF-8 spuntano che non spuntano quando si sgusciano normalmente e si collegano solo a una sessione di tmux manualmente.

</ retroscena>

Quindi voglio un metodo riutilizzabile per avviare qualcosa con login ssh, che non influisce su nessuna delle altre cose che ho configurato nel mio .zshrc(o il tuo .bashrcse usi ancora bash) che potrebbero essere richieste per il mio ambiente di sviluppo, che non appare quando di tanto in tanto lavoro localmente sulla stessa macchina.

Risposte:


13

Quando esegui ssh example.com, il demone ssh avvia una shell di accesso per te e la shell di accesso legge il tuo ~/.profile(o ~/.bash_profileo ~/.zprofileo in ~/.loginbase alla tua shell di accesso). Quando si specifica un comando da eseguire in remoto (con o senza -t), il demone ssh avvia una normale shell, quindi .profilenon viene letto. Rimedio:

ssh example.com -t '. /etc/profile; . ~/.profile; tmux attach'

La maggior parte dei demoni ssh sono configurati per rifiutare la trasmissione di variabili d'ambiente ad eccezione di LC_*. Se il demone ssh example.comè LC_*abilitato , puoi abusare di una variabile personalizzata per avviare tmux automaticamente - mettilo nel tuo ~/.profile:

if [ -n "$LC_tmux_session" ] && tmux has -t "$LC_tmux_session"; then
  exec tmux attach -t "$LC_tmux_session"
elif [ -n "${LC_tmux_session+1}" ] && tmux has; then
  exec tmux attach
fi

quindi accedi con LC_tmux_session= ssh example.como LC_tmux_session=session_name ssh example.com.

Questa risposta contiene ulteriori informazioni sul passaggio delle variabili di ambiente su ssh.


Il motivo per cui non sto usando non ssh example.com -t 'tmux attach'è perché ha problemi a caricare il mio ambiente ma perché ho avuto problemi con la visualizzazione dei caratteri UTF-8; questo problema non esiste quando ci si collega in modo convenzionale. Questo è il motivo per cui questa domanda riguarda l'esecuzione degli script immediatamente dopo la connessione tramite SSH.
connrs

Adoro la tua soluzione però. Elegante
connrs

@connrs: riscontri problemi con UTF-8 anche quando esegui il tuo .profile? Supponevo che il problema fosse dovuto all'impostazione errata di impostazioni locali sulla macchina di destinazione, che è stata risolta /etc/profileo .profilerisolta. Il problema della localizzazione è probabilmente risolvibile con ulteriori informazioni.
Gilles 'SO-smetti di essere malvagio' il

Volevo tornare in ufficio per testarlo. Hai perfettamente ragione, l'approvvigionamento del profilo / etc / attiva il comportamento corretto. Ora hai effettivamente risolto il problema che mi ha motivato a porre questa domanda più generica
connrs

6

In precedenza avevo consigliato di impostare PermitUserEnvironment yese aggiungere una variabile d'ambiente nel tuo ~/.ssh/environmentfino a quando Eli Heady non si è inserito con un suggerimento migliore nei commenti qui sotto.

Apri il tuo .zlogin(bash: .bash_profileecc.) E inserisci quanto segue:

if [[ "$SSH_CONNECTION" != "" && "$MY_SSH_CONNECTION" != "yes" ]]; then
    while true; do
        echo -n "Do you want to attach to a tmux session? [y/n]"
        read yn
        case $yn in
            [Yy]* ) MY_SSH_CONNECTION="yes" tmux attach; break;;
            [Nn]* ) break;;
            * ) echo "Please answer y/n";;
        esac
    done
fi

Ispirazione tratta da: Come posso richiedere l'input in uno script di shell Linux?

Nota che ho usato il .zloginfile ma potresti usare il tuo.zshrc file ma mi piace mantenere i miei file dot in ordine e li separa in modo da poterlo usare su altre macchine.

Sostituisci la domanda con qualcosa di appropriato per te e sostituisci MY_SSH_CONNECTION="yes" tmux attach con quello che desideri eseguire a quel punto.

Nota come lo script imposta MY_SSH_CONNECTION="yes"prima tmux attachdi passarlo a tmux in quanto aprirà anche una shell che accederà allo stesso script sopra e impedirà qualsiasi ricorsione.


2
L'uso di PermitUserEnvironment non sarà possibile in alcuni ambienti a causa delle potenziali implicazioni sulla sicurezza. SSH imposta la variabile $ SSH_CONNECTION, che può essere usata al posto di $ SSH_LOGIN nel tuo .zlogin, ovviando alla necessità di usare ~ / .ssh / environment. Qualcosa del genere if [[ "$SSH_CONNECTION" != "" ]]dovrebbe farlo.
Eli Heady,

3

Io stesso, aggiungo questo ai miei file .bash_profile:

if [ -z "$STY" ]; then
    reattach() { exec screen -A -D -RR ${1:+"$@"} ; }
fi
if [ -t 0 ]; then
    screen -wipe
    echo 'starting screen... (type Ctrl-C to abort)'
    sleep 5 && reattach
fi

Questo mi dà del tempo per interrompere il ricollegamento o la creazione di una sessione schermo. Non funzionerà sui formati 'ssh system command' (che non chiama il profilo ~ /.*). Una funzione di shell è impostata per ricollegarsi se interrompo.


Grande! Sono riuscito a risolverlo inserendo invece bashrc e quindi in ogni nuova finestra dello schermo - quando si cambia in .profile ha funzionato bene.
Hugo,

0

Potresti considerare di correre

ssh remotehost -t screen -DR

ed esegui la tua sessione terminale lì. È quindi possibile staccare ( ^A^D) e ricollegarlo in un secondo momento (anche da un client diverso). Risolverà il problema con l'inizializzazione non interattiva poiché lo schermo mantiene sessioni terminali interattive complete (facoltativamente anche shell di accesso, man screen(1) o ^A?)


Come accennato nella mia domanda, sto usando tmux anziché lo schermo GNU per gestire le mie sessioni. E quando caricato con -t 'tmux attach'ho problemi con vim che non sono presenti normalmente. Questo è il motivo per cui la vera domanda riguarda l'esecuzione di script su ssh connect piuttosto che la gestione dello schermo / sessione. Mi
scuso

Mi dispiace, hai parlato di tmux ma per me non ha significato nulla. Grazie per aver menzionato un nuovo strumento!
vedi il

0

Per parlare in particolare dei problemi UTF-8, se si aggiunge

SendEnv LANG

Ed $LANGè impostato su qualcosa come en_US.UTF-8sull'estremità locale e il tuo sshd sull'estremità remota consente la SendEnvdirettiva (con AcceptEnvin sshd_config), il tmux sull'altra estremità dovrebbe onorarlo. Ho avuto questo problema per un po 'ed è stato difficile risolvere i problemi.


0

Se vuoi che funzioni ogni volta che ti connetti, puoi semplicemente aggiungere tmux attachin fondo al tuo ~/.profilecomputer remoto.

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.