Recherche IP ou nom d'hôte de la machine d'origine (ssh)

10

Je me connecte à un certain nombre de machines en permanence, à partir de différents emplacements physiques (et donc de différentes machines physiques). La plupart de cela se fait via ssh, parfois une machine passerelle ou deux est requise (que j'invoque via ProxyCommandin ~/.ssh/config). Je voudrais savoir s'il existe une méthode pour identifier l'adresse IP ou le nom d'hôte de la machine qui appelle la connexion initiale (c'est-à-dire la machine sur laquelle je travaille) à l'extrémité distante?

  • Je ne veux pas envoyer de variables d'environnement car certaines machines que je n'ai pas de racine à définir PermitUserEnvironment.
  • La $SSH_CLIENTvariable d'environnement est utile pour les connexions directes, mais répertorie uniquement la passerelle la plus récente.

Mon idée actuelle pour une solution est de saisir $SSH_CLIENT, ssh, de trouver la $SSH_CLIENTvaleur de cette machine et de répéter jusqu'à ce qu'elle n'existe pas; puis saisissez le nom d'hôte et retirez-le d'une manière ou d'une autre.

Cela semble être un peu un travail de piratage cependant; Quelqu'un at-il une meilleure méthode?

Je travaille principalement dans un shell bash, mais je suis également heureux de toute suggestion qui ne l'utilise pas trop.

Géodésique
la source
L'un des objectifs de ProxyCommand est bien sûr de cacher (ou d'oublier) l'hôte d'origine (qui peut par exemple ne pas être routable depuis l'hôte final de toute façon)
Hagen von Eitzen
Pouvez-vous donner un exemple où ou pourquoi avez-vous besoin de ces informations? Il pourrait y avoir d'autres solutions non évidentes.
Manwe
@Manwe Je vais finalement vouloir configurer des sections spécifiques aux paramètres régionaux dans des choses comme mon .bashrc. Pour le moment, tout ce que je veux faire, c'est définir automatiquement l' une des trois dispositions de clavier dans vim en fonction de la machine sur laquelle je travaille.
Géodésique

Réponses:

3

Je n'ai jamais essayé, mais je peux penser à quelque chose qui pourrait fonctionner: vous ne laissez pas SSH démarrer votre shell de connexion, mais prenez les choses en main. Vous pouvez dire à SSH d'exécuter des commandes arbitraires. Au lieu de

ssh remote_host

vous exécuteriez quelque chose le long des lignes de

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

Ce que cela signifie, c'est qu'il donne à SSH autre chose à faire au lieu de lancer un shell de connexion. Ce quelque chose est une chaîne, qui sera exécutée comme commande, à distance. Nous l'utilisons pour lancer un shell d'une manière très spéciale: nous lui donnons une variable d'environnement DAT_ORIGIN_HOST, qui contient notre ip sur eth0 (vous devrez peut-être changer cela).

L'astuce que nous effectuons est que nous mettons la commande à exécuter à distance en double qoutes ". Les guillemets doubles (au moins dans Bash) signifient que AVANT QUE LA CHAÎNE EST PASSÉE À SSH, notre shell le scanne et effectue des extensions / remplacements, le cas échéant. Cela signifie que notre shell évaluera la partie `$ (ifconfig ...), à notre adresse IP actuelle et transmettra à ssh une chaîne qui contient la définition d'une variable d'environnement avec notre adresse IP locale.

Une fois connecté à la machine distante, echo $DAT_ORIGIN_HOSTvous devez imprimer votre adresse IP.

Pour développer cet appel à SSH, j'ai sans vergogne pris d' ici pour extraire l'adresse IP et ici pour le -t et comment lancer quelque chose d'interactif

Avis de non-responsabilité: Je ne suis pas sûr de l' option -let de l' -ioption /bin/bash. Vous devrez peut-être les omettre.

user1129682
la source
Vous pourriez être sur quelque chose ici! Je vais jouer avec un peu et je reviendrai vers vous.
Géodésique
Je marque cette réponse, car les commandes pseudo-tty et distantes fonctionnent toutes les deux. J'ai finalement résolu mon cas particulier avec les rappels ^ E, basés sur la suggestion de commande à distance - cela finit par être un peu plus propre et une utilisation générale. Merci!
Géodésique
2

Id J'ai bien compris que vous vous connectez directement de la machine d'origine à la destination avec des proxycommandsauts. Et voici donc trois hacks pour vous (troisième ajouté après le commentaire sur le scénario d'utilisation). Premièrement) Utilisez la redirection de port à distance pour vous permettre de revenir à votre machine d'origine avec-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 

Deuxièmement) Abus AcceptEnv LC_*sur la cible. Ce n'est pas agréable, mais il est assez courant d'autoriser les variables LOCALE même si AcceptUserEnviconment n'est pas disponible. Alors maintenant, vous pouvez faire:

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

Troisièmement) Utilisez ssh remote forward pour identifier l'hôte ou le type d'hôte.

# 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

Connectez-vous maintenant avec la redirection de port:

### 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
Manwe
la source
Merci pour les suggestions, mais ni l'un ni l'autre ne fonctionne pour l'instant à ma pleine satisfaction. Le transfert de port distant n'est pas une mauvaise idée, mais une supposition nécessaire est que vous avez le même nom d'utilisateur sur tous les hôtes. Ce n'est pas le cas ici ni quelque chose que je peux changer. Deuxièmement: je ne pouvais pas faire fonctionner cela. Êtes-vous en train de dire que le paramètre par défaut AcceptEnv LC_*est généralement autorisé, mais pas standard.
Géodésique
Eh bien, le LC_ est aléatoire. Je ne peux pas commenter sur la prévalence de ce phénomène, mais c'est quelque chose qui pourrait fonctionner .. (n'oubliez pas d'exporter LC_SOURCEHOST avant la connexion ssh).
Manwe
Testé LC_ * et ça marche. Il peut s'agir de n'importe quelle variable répertoriée dans la AcceptEnvdirective de /etc/ssh/sshd_config. N'oubliez pas de redémarrer sshdsi ce fichier est modifié.
david.perez
1

Vous pouvez taper who -msur l'extrémité distante pour obtenir des informations sur l'utilisateur actuellement connecté (y compris le nom d'hôte). whovous donne des informations sur les utilisateurs connectés, et le -mcommutateur vous montre "uniquement le nom d'hôte et l'utilisateur associé à stdin".

Paulo Almeida
la source
Cela n'est utile que si je ne tunnelise pas à travers une machine passerelle.
Géodésique
0

avez-vous essayé ce qui suit?

 netstat -an | grep " 22 "

la source
Cette méthode n'est utile que pour les connexions à un seul saut, elle ne l'est donc pas pour moi.
Géodésique