Come gestire i tunnel come processi in background da uno script di shell?


19

Devo creare un paio di tunnel ssh da uno script di shell. Ho provato a eseguirli come attività bg usando:

#!/bin/sh
ssh -L 3000:server1:5029 me@server2 &
ssh -L 3001:server3:3306 me@server2 &

ma i tunnel non sembrano funzionare correttamente quando li lancio in quel modo.

Funzionano bene quando li installo manualmente nelle loro schede, quindi la mia prossima idea è di fare in modo che lo script apra nuove schede in Terminale ed esegua i comandi lì come processi in primo piano.

Nota: questa domanda era originariamente "Come avviare una nuova scheda terminale dalla shell e quindi eseguire un comando al suo interno?", Ma ho ottenuto due risposte sulla gestione dei tunnel. Per la domanda "apertura di una shell", l'ho trovato su SuperUser , che funzionerà, anche se le nuove schede in background sarebbero preferibili alle finestre in primo piano che apre.


Mantenete una sessione SSH attiva sul server? Significato, hai i tuoi tunnel in background e una sessione SSH in primo piano in cui lavori effettivamente?
Jack M.

Fino ad ora, ho tenuto aperte tre schede: una per ciascun tunnel, più un'altra per qualunque cosa. Gran parte del mio lavoro effettivo si svolge in Eclipse e in un browser.
Sprugman

(I tunnel sono solo così posso accedere ad alcuni dbs remoti dalla mia istanza Tomcat locale.)
Sprugman

Risposte:


26

Questa tecnicamente non è una risposta alla domanda posta, ma piuttosto una risposta al tuo problema come descritto. Il comando ssh ha due opzioni che potrebbero esserti utili:

ssh -f -N -L 3000:server1:5029 me@server2

dice a ssh di rimanere in primo piano abbastanza a lungo da richiedere tutte le password necessarie, e quindi mettersi in background, non eseguendo alcun comando remoto ma semplicemente gestendo il tunnel.

Se vuoi davvero che questo appaia in una scheda, potresti voler una soluzione diversa.


Ho impostato le chiavi, quindi non ho bisogno di inserire le password, ma sembra funzionare. Grazie! Una domanda: come posso accedere ai tunnel per vedere se sono scaduti o per terminarli, ecc.? Né jobspsliste di una maniglia per loro ....
sprugman

2
ps -wwajx | grep ssh dovrebbe mostrarti i processi, quindi puoi ucciderli come ritieni opportuno.
zzz,

2
Vorrei aggiungere che se si omette -fe si esegue il background del processo &alla fine, è possibile ottenere il PID tramite $!come handle per terminare il processo del tunnel più avanti nel proprio script.
bk138,

6

Suggerirei semplicemente di integrare i tunnel nella connessione "uno per qualunque". Puoi semplificarlo aggiungendo le voci appropriate al tuo ~/.ssh/configfile:

Host server2
    HostName 10.1.1.1
    User me
    LocalForward 3000 127.0.0.1:5029
    LocalForward 3001 127.0.0.1:3306

È quindi possibile accedere semplicemente eseguendo:

> ssh server2

I tunnel dovrebbero arrivare e iniziare a lavorare, lasciandoti con una singola istanza SSH in cui fare "qualunque cosa". Se è necessario aprire una seconda connessione server2, è possibile che venga visualizzato un errore:

> ssh server2
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3000
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3001
Could not request local forwarding.

Questo non fa altro che i tuoi occhi. Puoi anche impostare questi forward per più server aggiungendo linee simili per altri server, e tutto ciò accadrà automaticamente.


La risposta di @ zzz sembra fare la stessa cosa, più o meno, ed è un po 'più semplice. Grazie comunque.
Sprugman,

Questo, combinato con le opzioni -f -N, è un modo eccellente per impostare l'inoltro per più porte in un colpo solo. Grazie uomo.
narsk,
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.