Esegui il comando Remote ssh con Shell di accesso completo


48

Vorrei fare qualcosa come ssh example.com 'ls'Comunque per mansh ssh:

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

Quindi quello che succede è che lsvisualizza il suo output e poi ssh esce.

Quello che non riesco a capire è come avere la shell di login completa aperta e quindi eseguire il comando all'interno di quella shell. Lasciare aperta la shell dopo l'esecuzione del comando. Come se avessi fatto manualmente quanto segue:

  localhost$ ssh example.com 
example.com$ ls
             /folder1 
             /folder2 
example.com$ _

Qualche idea?


questa è una domanda simile superuser.com/questions/261617/…, ma nessuna delle risposte sembra davvero adatta a ciò che sto cercando di fare.
matthew

Che ne dici ssh example.com 'ls;bash'?
Andrejs Cainikovs,

hai bisogno di -i sui miei sistemi per rendere interattiva la seconda shell.
Flexo,

opzione -t è la risposta alla tua domanda. Altre opzioni (ad esempio il portachiavi) esistono ma dipendono dalle tue reali esigenze, che non sono abbastanza chiare per me.
hornetbzz,

@hornetbzz -t mi dà la pseudo-tty. Ma per il resto il comportamento è lo stesso. Voglio avviare una shell interattiva, eseguire un comando all'interno di quella shell e mantenere la shell aperta dopo l'esecuzione del comando.
Matteo,

Risposte:


40

Basta dire a bash di eseguire lse poi se stesso in una shell di login

$ ssh user@host  -t 'bash -l -c "ls;bash"'

2
Purtroppo questo non sembra funzionare durante l'utilizzo screen. Altrimenti sembra che faccia quello che stavo cercando di fare.
Matteo,

31
ssh user@host -t 'ls; exec $SHELL -l'

-tForza l'allocazione pseudo-terminale. Questo può essere usato per eseguire programmi arbitrari basati su schermo su una macchina remota. È leggermente più appropriato di bash -i.

exec Non viene creato alcun nuovo processo.

-lcerca ~ / .bash_profile, ~ / .bash_login e ~ / .profile, in quell'ordine, e legge ed esegue i comandi da ... Senza questo probabilmente non è possibile eseguire script / comandi dalla directory ~ / bin, perché questo codice da ~ / .profile non verrà eseguito senza -lflag:

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

@grawity @Alan Potrebbe funzionare come soluzione alternativa, ma mi piacerebbe davvero che il comando fosse eseguito all'interno della shell e non solo aprisse una nuova shell dopo l'esecuzione del comando.
matthew

+1, -t è sicuramente il modo giusto di andare oltre -i, me ne sono appena dimenticato.
Flexo,

@matthew: dovrai bashpermetterti di permetterti.
Grawity,

@grawity non proprio, vedi la mia risposta qui sotto
fons

@matthew, usa exec bashoexec $SHELL
Eugen Konkov

1

Nel tuo commento sulla risposta di Fons, dici che non funziona durante l'utilizzo screen.

Potresti approfondire questo? Guardando il codice sorgente di openssh, sshd esegue il comando chiamando

YOUR_DEFAULT_SHELL -c COMMAND

Quindi, per esempio, se la tua shell predefinita è screen, allora questo non funzionerà molto bene perché screenla -cbandiera ha la precedenza su quella .scrreenrc. Quindi, non c'è davvero modo di inviare comandi allo schermo se è la shell predefinita. Dovrai effettivamente eseguire screen come comando dato a ssh, ma con una shell predefinita che non è screen .

Se è quello che stai cercando di fare, penso che le cose diventeranno davvero strane, poiché screenchiuderanno anche le finestre con programmi non interattivi, quindi dovrai fare un trucco simile a quello dei fons, ma di un livello più profondo. Quindi, con, ad esempio / bin / bash (e non schermo) come shell predefinita Qualcosa del tipo:

ssh user@host -t 'screen bash -l -c "ls;bash"'

Che dovrebbe - fare un respiro profondo - ssh nell'host, eseguire bash -c con un comando di schermo, che farà una nuova finestra. Se questa finestra si fosse appena aperta, sarebbe finita e lo schermo sarebbe terminato, quindi usiamo il trucco dei fons nella nuova finestra dello schermo .

Penso che funzionerà, se è anche quello che stavi cercando di fare;)


Penso che il problema che ho screenin questa situazione, è che normalmente lo carico exec screen -RRdal mio .profile. Ciò significa che bash -ltenta di caricare lo schermo che getta via il resto di esso. sembra che posso aggirarlo rimuovendo '-l' in entrambe le tue soluzioni @fons (la tua poi mi lascia dentro screen). È un po 'traballante però.
matthew

0

Le opzioni multiple -t impongono l'allocazione di tty, anche se ssh non ha tty locale:

ssh -tt user@host 'bash -l -c "/path/to/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.