Ricerca di IP o nome host della macchina di origine (ssh)


10

Mi collego a un numero di macchine costantemente, da diverse posizioni fisiche (e quindi diverse macchine fisiche). La maggior parte di questo viene fatta tramite ssh, a volte è necessaria una macchina gateway o due (che invoco tramite ProxyCommandin ~/.ssh/config). Vorrei sapere se esiste un metodo per identificare l'IP o il nome host della macchina che chiama la connessione iniziale (ovvero la macchina su cui sto lavorando) all'estremità remota?

  • Non voglio inviare variabili d'ambiente come alcune macchine che non ho root da impostare PermitUserEnvironment.
  • La $SSH_CLIENTvariabile di ambiente è utile per le connessioni dirette, ma elenca solo il gateway più recente.

La mia attuale idea di una soluzione è quella di afferrare $SSH_CLIENT, ssh, trovare il $SSH_CLIENTvalore di quella macchina e ripetere fino a quando non esiste; quindi prendi il nome host e tiralo indietro in qualche modo.

Sembra un po 'un lavoro di hacking; qualcuno ha un metodo migliore?

Sto lavorando principalmente in una shell bash, ma sono anche felice per eventuali suggerimenti che non la usano troppo.


Uno degli scopi di ProxyCommand è ovviamente quello di nascondere (o dimenticare) l'host di origine (che ad esempio potrebbe non essere instradabile dall'host finale)
Hagen von Eitzen,

Puoi fare un esempio dove o perché hai bisogno di queste informazioni? Potrebbero esserci altre soluzioni non ovvie.
Manwe,

@Manwe Alla fine voglio impostare sezioni specifiche della locale in cose come il mio .bashrc. In questo momento tutto quello che voglio fare è impostare uno dei tre layout di tastiera automaticamente in vim a seconda di quale macchina sto lavorando.
Geodetico

Risposte:


3

Non ho mai provato, ma riesco a pensare a qualcosa che potrebbe funzionare: non lasciare che SSH avvii la shell di accesso, ma prendi le cose nelle tue mani. Puoi dire a SSH di eseguire comandi arbitrari. Invece di

ssh remote_host

faresti correre qualcosa del genere

ssh remote_host -t "
    . /etc/profile; 
    . /etc/bash.bashrc; 
    DAT_ORIGIN_HOST=$(ifconfig eth0|grep -Po 't addr:\K[\d.]+') /bin/bash -l -i"

Quello che fa è, dà a SSH qualcos'altro da fare invece di lanciare una shell di login. Quel qualcosa è una stringa, che verrà eseguita come comando, da remoto. Usiamo questo per lanciare una shell in un modo molto speciale: le diamo una variabile ambientale DAT_ORIGIN_HOST, che contiene il nostro ip su eth0 (potrebbe essere necessario cambiarlo).

Il trucco che eseguiamo è che inseriamo il comando da eseguire in remoto in doppi qoutes ". Le doppie virgolette (almeno in Bash) significano che PRIMA CHE LA STRING VIENE PASSATA A SSH, la nostra shell la scansiona ed esegue espansioni / sostituzioni, ove appropriato. Questo significa che la nostra shell valuterà la parte `$ (ifconfig ...), al nostro attuale indirizzo IP e passerà a ssh una stringa che contiene la definizione di una variabile ambientale con il nostro indirizzo IP locale.

Una volta effettuato l'accesso al computer remoto, echo $DAT_ORIGIN_HOSTdovrebbe stampare il tuo indirizzo IP.

Per sviluppare quella chiamata a SSH ho preso spudoratamente da qui per estrarre l'indirizzo IP e qui per -t e come lanciare qualcosa di interattivo

Dichiarazione di non responsabilità: non sono sicuro dell'opzione -le . Forse devi ometterli.-i/bin/bash


Potresti essere su qualcosa qui! Ci giocherò un po 'e tornerò da te.
Geodetico

Sto contrassegnando questa risposta, poiché entrambi i comandi pseudo-tty e remoti funzionano. Alla fine ho risolto il mio caso particolare con ^ E callbacks, basato sul suggerimento del comando remoto - finisce per essere un po 'più pulito e di uso generale. Grazie!
Geodetico

2

Ho capito bene che stai collegando direttamente dalla macchina di origine alla destinazione con proxycommandluppolo. E quindi ecco tre hack per te (terzo aggiunto dopo un commento sullo scenario di utilizzo). Primo) Utilizzare il port forwarding remoto per consentire di tornare al proprio computer di origine con-R remotemachineport:dstonlocalnet:dstportonlocalnet

ssh -R 2222:localhost:22 user@target
# on "target" you can now do this to get back to origin host
ssh user2@localhost -p 2222 

Secondo) Abuso AcceptEnv LC_*sul bersaglio. Non è carino ma è abbastanza comune consentire le variabili LOCALE anche se AcceptUserEnviconment non è disponibile. Quindi ora puoi fare:

export LC_SOURCEHOST=my.ip.addr.or:something
ssh user@target
# on tathet:
echo $LC_SOURCEHOST

Terzo) Utilizzare l'inoltro remoto ssh per identificare l'host o il tipo di host.

# Here is an example what you can use on target machine. 
# This will modify your PS1 variable (prompt) based on source host (port forwarding)
# Add this to .bash_profile

function checkHost {
  RET=""
  ## loop over test port numbers 17891-17895 in my example
  for x in $(seq 1 5); do 
    # if netstat is not available test port some other way like with nc or something
    ## && RET= will set RET = 1-5
    /bin/netstat -lnt|/bin/grep -q 127.0.0.1:1789$x && RET=$x;
  done
  # return RET
  # please note that if you have multiple open connections with different port numbers
  # this method cannot not distinguish between them 
  echo $RET
}

# get 1-5 number from function above
VAL=$(checkHost)
# do something like set PS1 var or map vim file or something
export PS1='\[\033k\033\\\]\u@\h: \w\$ '$VAL

Ora connettiti con il port forwarding:

### this will still enable ssh forwarding back. Change 22 to something else like 
### 24 to disable it (if nothing is listening on your source machines 24 port)
ssh -R 17891:localhost:22 user@target

Grazie per i suggerimenti, ma nessuno dei due lavori per la mia piena soddisfazione ancora. Il port forward remoto non è una cattiva idea, ma un presupposto necessario è che tu abbia lo stesso nome utente su tutti gli host. Questo non è il caso qui né qualcosa che posso cambiare. Secondo: non sono riuscito a farlo funzionare. Stai dicendo che AcceptEnv LC_*è generalmente consentito, ma non uno standard, attivato per impostazione predefinita?
Geodetico

Beh, LC_ è incostante. Non posso commentare quanto sia prevalente, ma è qualcosa che potrebbe funzionare .. (ricordarsi di esportare LC_SOURCEHOST prima della connessione ssh).
Manwe,

Testato LC_ * e funziona. Può essere qualsiasi variabile elencata nella AcceptEnvdirettiva in /etc/ssh/sshd_config. Ricorda di riavviare sshdse questo file viene modificato.
david.perez,

1

È possibile digitare who -msul lato remoto per ottenere informazioni sull'utente attualmente connesso (incluso il nome host). whofornisce informazioni sugli utenti che hanno effettuato l'accesso e lo -mswitch mostra "solo il nome host e l'utente associato a stdin".


Ciò è utile solo se non eseguo il tunneling attraverso una macchina gateway.
Geodetico

0

hai provato quanto segue?

 netstat -an | grep " 22 "

Questo metodo è utile solo per le connessioni one hop, quindi non è utile per me.
Geodetico
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.