Ssh, esegui un comando al login e quindi Resta connesso?


29

Ci ho provato con wait, ma non ha funzionato: ha chiuso la connessione alla fine.

Possiamo eseguire uno script tramite ssh che accederà a macchine remote, eseguirà un comando e non si disconnetterà?

Quindi ssh in una macchina, cd in tale e tale directory, quindi esegui un comando e rimani connesso.

-Jonathan

(aspettati di aver usato)

#!/usr/bin/expect -f
set password [lrange $argv 0 0]
spawn ssh root@marlboro "cd /tmp; ls -altr | tail"
expect "?assword:*"
send -- "$password\r"
send -- "\r"
interact

9
Sono solo io o stai "automatizzando" l'autenticazione con password in questo modo, invece di usare pubkeys o altri metodi sani?
Grawity,

Risposte:


25

Aggiungere ; /bin/basha alla fine della riga di comando sul lato remoto? Questo è:

spawn ssh -t root@marlboro "cd /tmp; ls -altr | tail; /bin/bash -i"

Ancora meglio, cambia il .bashrc di root in qualcosa del genere:

PROMPT_COMMAND="cd /tmp && ls -altr | tail ; unset PROMPT_COMMAND"

:)


2
Potresti voler aggiungere -ia quel bash.
Teddy,

Sì, suppongo :)
Bill Weiss,

Quando lo faccio, il completamento delle schede si interrompe nella nuova shell (anche con "-i") - hai idea del perché / come risolvere?
Coderer,

1
Ho testato la mia nuova risposta qui, funziona benissimo. Un po 'ruvido, ma funziona.
Bill Weiss,

7
Prova ssh -tad allocare un pty.
In pausa fino a nuovo avviso.

4

Se stai bene facendo questo in Python, pexpect ha un esempio che fa quasi esattamente quello che stai chiedendo:

import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('noah@example.com')
child.expect ('ftp> ')
child.sendline ('ls /pub/OpenBSD/')
child.expect ('ftp> ')
print child.before   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

Per fare questo con ssh invece di ftp, vorresti un codice simile al seguente (i file di esempio in pexpect hanno molti più dettagli e informazioni, ma qui ci sono le basi):

import pexpect
child = pexpect.spawn ('ssh root@marlboro')
child.expect ('Password:')
child.sendline ('password')
child.expect ('prompt# ')
child.sendline ('cd /tmp')
child.expect ('prompt# ')
child.sendline ('ls -altr | tail')
child.expect ('prompt# ')
print child.before, child.after   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

Non fraintendetemi, io ADORO (in particolare autoaspettarmi), ma Python è davvero molto più facile per me grok.


Anch'io sto passando dall'aspettare al pexpect. Python è ora molto più onnipresente.
JM Becker,

4

Il modo probabilmente più semplice e pulito per accedere a un server, generare una shell interattiva ed eseguire comandi all'interno di quella shell è creare un file rc personalizzato per bash.

Nel tuo file bashrc personalizzato sul server, prima procurati il ​​file predefinito e poi aggiungi i tuoi comandi personalizzati, ad es

~ / .Bashrc_custom:

. ~/.bashrc
cd dir/
workon virtualenvproject

È quindi possibile avviare la sessione SSH in questo modo:

$ ssh -t server "/bin/bash --rcfile ~/.bashrc_custom -i"

L' -topzione impone un'allocazione pseudo-tty, in modo che cose come il completamento delle schede funzionino.

L' --rcfileopzione specifica quale file rc deve essere caricato anziché quello predefinito. Importante: è necessario inserire "argomenti a trattino doppio" nella riga di comando prima delle opzioni a carattere singolo per essere riconosciuti.

L' -iargomento di / bin / bash è lì per invocare una shell interattiva.


in realtà no. Cosa fare se si desidera eseguire comandi diversi per ciascuna connessione?
Eugen Konkov

1

Se qualcuno vuole informazioni su ciò che sta accadendo in background, dovresti dare un'occhiata al manuale di sshd:

Quando un utente accede correttamente, sshd effettua le seguenti operazioni:

  1. Se il login è su tty e non è stato specificato alcun comando, stampa l'ora dell'ultimo accesso e / etc / motd (a meno che non sia impedito nel file di configurazione o da ~ / .hushlogin; vedere la sezione FILES).
  2. Se l'accesso è su tty, registra l'ora di accesso.
  3. Controlla / etc / nologin e / var / run / nologin; se ne esiste uno, stampa il contenuto e si chiude (a meno che root).
  4. Modifiche da eseguire con i normali privilegi dell'utente.
  5. Imposta l'ambiente di base.
  6. Legge il file ~ / .ssh / environment, se esiste, e gli utenti sono autorizzati a modificare il proprio ambiente. Vedi l'opzione PermitUserEnvironment in sshd_config (5).
  7. Modifiche alla home directory dell'utente.
  8. Se esiste ~ / .ssh / rc, lo esegue; altrimenti se esiste / etc / ssh / sshrc, lo esegue; altrimenti esegue xauth (1). I file `` rc '' ricevono il protocollo di autenticazione X11 e i cookie in input standard. Vedi SSHRC, sotto.
  9. Esegue la shell o il comando dell'utente .

https://www.freebsd.org/cgi/man.cgi?sshd(8)#LOGIN_PROCESS


0

Dovresti generalmente evitare di usare ssh in questo modo in quanto vanifica il suo scopo.
Fare un

ssh-add -l | grep "file_of_your_rsa_priv_key_here"

per vedere se la tua chiave è elencata nel pool di sessioni attive di ssh oppure aggiungila tu stesso (con ssh-add).

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.