Поиск IP или имени хоста компьютера-источника (ssh)


10

Я постоянно подключаюсь к нескольким машинам из разных физических мест (и, следовательно, из разных физических машин). Большая часть этого делается, хотя ssh, иногда требуется один или два шлюза (которые я вызываю через ProxyCommandin ~/.ssh/config). Я хотел бы знать, есть ли метод для определения IP или имени хоста машины, которая вызывает начальное соединение (т.е. машины, на которой я работаю) на удаленном конце?

  • Я не хочу отправлять переменные окружения, так как на некоторых машинах мне не нужно устанавливать root PermitUserEnvironment.
  • $SSH_CLIENTПеременная среды используется для прямых соединений, но только перечислены самые последние ворота.

Моя текущая идея для решения заключается в том $SSH_CLIENT, чтобы получить ssh, найти значение этой машины $SSH_CLIENTи повторять до тех пор, пока она не существует; затем захватите имя хоста и вытяните его как-нибудь.

Похоже на хакерскую работу; у кого-нибудь есть лучший метод?

В основном я работаю в оболочке bash, но я также рад любым предложениям, которые тоже не используются.


Одна из целей ProxyCommand, конечно же, состоит в том, чтобы скрыть (или забыть о) исходный хост (который, например, в любом случае может не маршрутизироваться от конечного хоста)
Хаген фон Эйцен

Можете ли вы привести пример, где или зачем вам эта информация? Могут быть и другие неочевидные решения.
Манве

@Manwe Я в конечном итоге хочу настроить разделы, специфичные для локали, в таких вещах, как мой .bashrc. Сейчас все, что я хочу сделать, это автоматически установить одну из трех раскладок клавиатуры в vim в зависимости от того, с какой машины я работаю.
Геодезический

Ответы:


3

Я никогда не пробовал, но могу придумать что-то, что может сработать: вы не позволяете SSH запускать вашу оболочку входа в систему, а берете дело в свои руки. Вы можете сказать SSH запускать произвольные команды. Вместо

ssh remote_host

вы бы запустить что-то вроде

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

То, что это делает, это дает SSH что-то еще делать вместо запуска оболочки входа в систему. Это нечто является строкой, которая будет запускаться как команда, удаленно. Мы используем это для запуска оболочки особым образом: мы присваиваем ей переменную окружения DAT_ORIGIN_HOST, которая содержит наш ip на eth0 (возможно, вам придется изменить это).

Уловка, которую мы выполняем, состоит в том, что мы помещаем команду для удаленного выполнения в двойные кавычки ". Двойные кавычки (по крайней мере, в Bash) означают, что перед тем, как строка передана в SSH, наша оболочка сканирует ее и при необходимости выполняет расширения / замены. Это означает, что наша оболочка вычислит часть `$ (ifconfig ...) по нашему текущему IP-адресу и передаст ssh строку, содержащую определение переменной среды с нашим локальным IP-адресом.

После того, как вы вошли на удаленный компьютер, echo $DAT_ORIGIN_HOSTдолжен распечатать ваш IP-адрес.

Для разработки этого вызова в SSH я беззастенчиво взял отсюда для извлечения IP-адреса и здесь для -t и как запустить что-то интерактивное

Отказ от ответственности: я не уверен , о -lи -iвозможность /bin/bash. Может быть, вам нужно их опустить.


Вы можете быть на что-то здесь! Я немного поиграюсь с этим и вернусь к вам.
Геодезический

Я отмечаю этот ответ, поскольку обе псевдо-tty и удаленные команды работают. В конечном счете, я решил свой конкретный случай с помощью обратных вызовов ^ E, основанных на предложении удаленной команды - он стал немного чище и общего использования. Благодаря!
Геодезический

2

Я правильно понял, что вы подключаетесь напрямую от исходного компьютера к месту назначения с помощью proxycommandпрыжков. Итак, вот три хака для вас (третий добавлен после комментария к сценарию использования). Во-первых) Используйте удаленную переадресацию портов, чтобы вы могли вернуться к исходной машине с-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 

Второе) Жестокое обращение AcceptEnv LC_*с целью. Это нехорошо, но достаточно часто разрешать переменные LOCALE даже тогда, когда AcceptUserEnviconment недоступен. Итак, теперь вы можете сделать:

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

В-третьих) Используйте ssh remote forward для определения типа хоста или хоста.

# 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

Теперь соединитесь с переадресацией портов:

### 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

Спасибо за предложения, но ни одна из них пока не работает для моего полного удовлетворения. Переадресация удаленного порта - неплохая идея, но необходимо допустить, что у вас одинаковое имя пользователя на всех хостах. Это не тот случай, ни то, что я могу изменить. Второе: я не мог заставить это работать. Вы говорите , что AcceptEnv LC_*это вообще допускается, но не является стандартом, путем установки по умолчанию?
Геодезический

Ну, LC_ - это удар и мисс. Я не могу комментировать, насколько это распространено, но это то, что может сработать .. (не забудьте экспортировать LC_SOURCEHOST перед подключением по ssh).
Манве

Проверено LC_ * и все работает. Это может быть любая переменная, указанная в AcceptEnvдирективе /etc/ssh/sshd_config. Не забудьте перезапустить, sshdесли этот файл изменился.
david.perez

1

Вы можете набрать who -mна удаленном конце, чтобы получить информацию о текущем вошедшем в систему пользователе (включая имя хоста). whoвыдает информацию о зарегистрированных пользователях, а -mпереключатель показывает «только имя хоста и пользователя, связанные с stdin».


Это полезно, только если я не туннелирую через шлюз.
Геодезический

0

ты пробовал следующее?

 netstat -an | grep " 22 "

Этот метод полезен только для соединений с одним прыжком, поэтому он мне не нужен.
Геодезический
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.