caricamento dinamico degli alias della shell locale nella sessione ssh


24

Quando accedo a qualche macchina usando ssh, desidero che i miei alias e funzioni siano presenti. In altre parole, accedere a una macchina che desidero poter utilizzare le mie scorciatoie da comando.

Ho bisogno che sia dinamico, ogni volta che eseguo l'accesso vorrei avere alias aggiornati.

Note: Molto spesso è il primo accesso, senza conoscere la macchina e i file lì. A volte è il login singolo. Solo una volta per quella macchina. Deve essere pulito in seguito, anche la configurazione precedente deve essere ripristinata.

Risposte:


18

Puoi copiarlo temporaneamente sul .bashrctuo computer remoto con un altro nome. Ad esempio, usando .bashrc_temp:

user@local$ scp .bashrc user@remote:~/.bashrc_temp

Successivamente è possibile accedere al computer remoto:

user@local$ ssh user@remote

e sourceil file .bashrc_temp:

user@remote$ source ~/.bashrc_temp

Ora sei in grado di utilizzare le tue .bashrce le tue funzioni. Al termine del lavoro, è possibile rimuovere il file ~ / .bashrc_temp sul computer remoto e disconnettersi.

La copia del file e l'accesso al computer remoto possono essere realizzati con una funzione bash:

# copy the .bashrc to the remote machine 
# and log into the remote machine.
# parameter $1: user@remote
function s() {
  scp ~/.bashrc $1:~/.bashrc_temp
  ssh $1
}

Aggiornamento :

Si può anche considerare di copiare il .bashrcper /tmpil vostro computer remoto e la fonte /tmp/.bashrc_temp.

Aggiornamento 2 :

È possibile accedere al computer remoto usando ssh -t . Questo utilizzerà automaticamente la tua temperatura .bashrc. Funzione aggiornata s():

function s() {
  scp ~/.bashrc $1:/tmp/.bashrc_temp
  ssh -t $1 "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

Questo è sicuramente quello che sto cercando. Grazie! Ma è possibile farlo più funzionale? In un solo passaggio? Perché ora abbiamo bisogno di 3 passaggi: accedi, fonte, elimina prima della disconnessione.

OK, ora vedo dopo l'aggiornamento. Grande. Un'altra correzione: "bash --rcfile /tmp/.bashrc_temp; rm /tmp/.bashrc_temp"

Ho aggiunto la tua correzione al mio aggiornamento 2. Grazie.

5
Quasi tutte le risposte (compresa questa) usano un nome file prevedibile in /tmp/. Questo può essere banalmente sfruttato da qualsiasi altro utente per eseguire qualsiasi codice come utente che accede. Questo dovrebbe essere usato mktempper assicurarsi che il file temporaneo abbia un nome univoco.
Tometzky,

9

jens-na ha fornito una risposta eccellente. Ho trascorso un po 'di tempo e ho rielaborato un po' per lavorare un po 'meglio. In questo modo, è possibile passare qualsiasi parametro a SSH, come i numeri di porta. La differenza è che utilizza il sshcomando per caricare il .bashrcfile, anziché scp, che utilizza nomi di parametri di comando diversi.

Noterai anche che carica un file diverso .bashrc_remote, in modo da poter selezionare esattamente ciò che vuoi sorgente sui server remoti, invece di tutto

sshs() {
        ssh $@ "cat > /tmp/.bashrc_temp" < ~/.bashrc_remote
        ssh -t $@ "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

Eseguilo come segue:

sshs user@server

Il nome " sshs" sta per "Origine SSH". Utilizzare sshquando non si desidera fonte e utilizzare sshsquando lo si fa.

https://gist.github.com/jonahbron/5549848


Questo è utile Lo stesso set di parametri, non è necessario aggiungere la voce a ~ / .ssh / config solo per specificare un numero di porta diverso!
Tomek Wyderka,

Dato che ha lo stesso nome di comando, forse è possibile farlo in una sola esecuzione e digitare la password una sola volta ... Sfortunatamente unendo i tuoi comandi in un solo rapporto:Pseudo-terminal will not be allocated because stdin is not a terminal
Tomek Wyderka,

@TomekWyderka Sì, ho provato per circa 20 minuti a farlo scendere a un comando, ma non ho trovato un modo. Forse una persona più esperta di BASH di quanto potessi immaginare, ma non sembra essere possibile.
Giona,

2
Ho preso questa risposta e l'ho ripetuta per alcune settimane. Il risultato è uno strumento completo che risolve il problema: github.com/Russell91/sshrc
RussellStewart

1
@Jonah puoi spiegarmi perché hai usato $ {*: 1} invece di $ @.
RussellStewart,

8

Penso che sshrc sia quello che stai cercando: https://github.com/Russell91/sshrc

sshrc funziona proprio come ssh, ma genera anche ~ / .sshrc dopo aver effettuato l'accesso in remoto.

$ echo "echo welcome" > ~/.sshrc
$ sshrc me@myserver
welcome

$ echo "alias ..='cd ..'" > ~/.sshrc
$ sshrc me@myserver
$ type ..
.. is aliased to `cd ..'

Puoi usarlo per impostare variabili d'ambiente, definire funzioni ed eseguire comandi post-login. È così semplice e non avrà alcun impatto sugli altri utenti sul server, anche se usano anche sshrc. Per una configurazione più avanzata, continua a leggere.


Bello. Mi piace l'hack xxd!
Tomek Wyderka,

@Tomek - sì, l'hack xxd è completamente fantastico. Ho davvero provato a fare il lavoro con SCP. Quindi con tubazioni in ssh. Semplicemente non può essere fatto senza 2 chiamate al server - 2 voci di password - 2 round trip. Era inaccettabile. Così ho fatto l'impensabile.
RussellStewart,

Ho un bug. sshrc si blocca senza risposta. Puoi mettere un po 'di codice di debug (può essere nei commenti) in sshrc in modo che io possa rintracciarlo.
Tomek Wyderka,

Interessante. È solo uno script bash, quindi di solito eventuali errori o avvertimenti vengono stampati automaticamente sullo schermo. Quanti byte ci sono nel tuo .sshrc.d? Inoltre, basta digitare vim $(which sshrc)e puoi vedere il file bash. È possibile aggiungere i comandi echo dopo ogni riga per vedere dove si blocca.
Russell

5

Non sono sicuro dei limiti, ma sono stato in grado di farlo funzionare con qualcosa del tipo:

function ssh_with_rc() {
   RC_DATA=`cat ${HOME}/.bashrc | base64 -w 0`
   ssh -t $@ "echo \"${RC_DATA}\" | base64 --decode > /tmp/${USER}_bashrc; bash --rcfile /tmp/${USER}_bashrc; rm /tmp/${USER}_bashrc"
}

alias ssh="ssh_with_rc"

Questa è la risposta migliore per me perché è un singolo comando ssh, niente roba scp. L'unico miglioramento rimasto per me sarebbe trovare un modo per evitare la RC_DATAvariabile.
Sridhar Sarnobat,

2

Questo è quello che mi è venuto in mente. Ti permette di mantenere un normale file rc, ma fa anche tutto in una sola connessione ssh (cioè devi solo accedere una volta invece di fare prima uno scp).

#copies some environment over to the remote machine
function ssh() {
  /usr/bin/ssh -t $* "echo `base64 -i ~/bin/remote_ssh_env.sh` | base64 --decode > /tmp/remote_ssh_env.sh; bash --rcfile /tmp/remote_ssh_env.sh"
}

Non sono sicuro di quanto grande possa essere quel file rc, dato che a un certo punto potrebbe raggiungere il massimo.


Ho dovuto racchiudere parte del comando tra virgolette singole per farlo funzionare correttamente. echo '' base64 .... sh` '- dopo quello, ha funzionato magnificamente. Grazie!!
K Robinson,

Se la dimensione diventa un problema, è possibile reindirizzare il contenuto del file tramite un'utilità di compressione come gzip prima della codifica base64.
K Robinson,

2

Penso che https://github.com/fsquillace/pearl-ssh faccia quello che ti serve.

L'ho scritto molto tempo fa prima che sshrc nascesse e ha più vantaggi rispetto a sshrc:

  • Non richiede dipendenze da xxd per entrambi gli host (che può non essere disponibile sull'host remoto)
  • Pearl-ssh utilizza un algoritmo di codifica più efficiente
  • Sono solo ~ 20 righe di codice (davvero facili da capire!)

Per esempio:

$> echo "alias q=exit" > ~/.config/pearl/sshrc
$> ssh_pearl myuser@myserver.com
myserver.com $> q
exit

1

Un'opzione per farlo funzionare con una singola sessione SSH è usare una variabile per archiviare il tuo file bash anziché copiarlo.

$ mybash=`cat mybash`
$ ssh -t 127.0.0.1 "echo $mybash > /tmp/mybash; bash --rcfile /tmp/mybash ; rm /tmp/mybash"

Sembra funzionare per me.


1

Stavo cercando di risolvere un problema come il tuo e mi sono reso conto che quello che stavo davvero cercando era sshfs. Forse puoi usarlo anche tu?

Il mio problema era che, quando volevo, volevo mantenere i miei colori, alias, funzioni e script mentre lavoravo a distanza.

http://fuse.sourceforge.net/sshfs.html


Lol, neanche questo mi è mai venuto in mente. È una soluzione abbastanza creativa.
Sridhar Sarnobat,
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.