10

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

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

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

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

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

4 ответа4

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 . Может быть, вам нужно их опустить.

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
1

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

0

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

 netstat -an | grep " 22 "

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .