4

У меня есть машина, которая подключается к корпоративной сети через VPN. Когда я подключаюсь к VPN, он всегда дает мне другое имя хоста и IP-адрес. Имя хоста всегда удаленно - [последний октет IP-адреса]. Всякий раз, когда я хочу подключить SSH к моей машине, мне сначала нужно запустить «hostname -A», чтобы увидеть, что такое hostname. Проблема в том, что я не всегда знаю, какое у меня имя хоста, когда мне нужно получить доступ к компьютеру. (Если я иду туда, где физически расположен компьютер, чтобы найти имя хоста, это побеждает мою потребность в SSH.)

Могу ли я использовать SSH и пробовать каждое имя хоста /ip в подсети, пока не найдет тот, который соответствует правильному файлу ключа?


Я использую ноутбук Windows (также подключен через vpn) с Cygwin для SSH к машине с Ubuntu 12.04. Я не уверен, почему я получаю другое имя хоста при подключении к vpn, но это корпоративная сеть, поэтому они могут делать все, что хотят.

5 ответов5

4

У вас есть несколько вариантов, перечисленных от самых простых до самых сложных. Неудивительно, что это идет хорошо, лучше, лучше.

  1. Используйте crontab для обновления файла в удаленной системе с вашим именем хоста через некоторый интервал.
    Создать / изменить Crontab: crontab -e
    Добавить запись Crontab: для создания задания, которое обновляет файл каждый час в течение рабочего дня, только в выходные дни, используйте этот пример:

    00 09-18 * * 1-5 ssh usr@example.com "echo $(hostname -A)> ubuntuhost.name"
  2. Используйте crontab, чтобы посылать вам по электронной почте имя вашего хоста через определенный промежуток времени.
    Установите Mailutils: sudo apt-get update && sudo apt-get install mailutils Примечание: выберите "подключение к интернету", если это запрашивается установкой mailutils, должен быть первым вариантом.
    Создать / изменить Crontab: crontab -e
    Добавить запись Crontab: чтобы создать задание, которое будет отправлять вам электронные письма каждый час в течение рабочего дня только по выходным, с темой строки имени хоста, используйте этот пример:

    00 09-18 * * 1-5 mail -s "Ubuntu $(hostname -A)" you@you.com </ dev / null 
  3. Используйте NetworkManager Dispatcher для отправки вашего текущего имени хоста по электронной почте при каждом изменении соединения.
    Поместите этот скрипт в /etc/NetworkManager/dispatcher.d, назовите его "50emailhostname"

#!/bin/sh -e
#make sure I'm executable (chmod 775)

echo "interface: $1, action: $2" >> /tmp/interface.log #debug

if [ "$1" = "eth0" ] && [ "$2" = "up" ]
then
  mail -s "Ubuntu $(hostname -A)" you@you.com > /tmp/interface.log #debug
else
  echo "false" >> /tmp/interface.log #debug
fi

exit

Заметки:

  • Возможно, вам придется изменить "eth0" в сценарии на "vpn0" или что-то в зависимости от вашего клиента
  • Возможно, вам придется изменить "вверх" на «vpn-up»
  • Используйте операторы отладки, чтобы получить желаемое поведение!
  • tail -f /tmp/interfaces.log в отдельном окне, чтобы увидеть, что он делает
  • Перезапустите сетевой сервис по мере необходимости, перезапустите диспетчер сети.
  • Закомментируйте отладочные операторы, когда закончите
  • Вы можете получить IP-адрес вместо имени хоста с чем-то вроде
    $(ifconfig | awk -F':' '/inet addr/&&!/127.0.0.1/{split($2,_," ");print _[1]}')
2

Это не портскан

Здесь мы собираемся использовать только базовые утилиты ssh-keyscan и ssh-keygen для сетевых подключений / преобразования ключей.

Если вы знаете отпечаток сервера

и хотите найти его, тогда вы можете сделать:

for x in {1..254}; do ssh-keyscan 10.0.0.$x > /tmp/ssh-scan.log 2> /dev/null; cat /tmp/ssh-scan.log; ssh-keygen -lf /tmp/ssh-scan.log | grep -v 'not a public key file' ; done

и он будет печатать отпечатки пальцев для всех найденных хостов. Выше строки будет проходить через 10.0.0.1 - 10.0.0.254, пытается получить открытые ключи от каждого хоста и, наконец, преобразует открытый ключ в отпечаток и отображает его. Наиболее распространенные сообщения об ошибках перенаправляются в черную дыру, найденную из /dev .

Или, может быть, поиск открытого ключа

Затем то же самое без конвертера отпечатков пальцев, отображает открытые ключи для всех хостов между 10.0.0.0 и 10.0.0.255:

for x in {1..254}; do ssh-keyscan 10.0.0.$x 2> /dev/null; done

Окончательный ответ, скрипт ssh seek'n'connect

Первоначально опубликовано user229010 в качестве комментария, я только очистил его :-)

for i in {1..255}; do 
    echo trying remote-$i
    ping -w 1 -c 1 remote-$i > /dev/null
    if [ $? -eq 0 ]; then
        # this is a live ip
        echo remote-$i is up
        if ssh-keyscan remote-ca$i | grep $expected_key -m1 -c > /dev/null; then
            # this is my machine
            ssh remote-$i
            exit 0
        fi
    fi
done
1

Было бы гораздо разумнее, чтобы удаленный компьютер сообщал свой IP-адрес. Например, запустив crontab, он подключается к вашей локальной машине через ssh и записывает имя хоста в файл. Если вы обновите свой вопрос с более подробной информацией (какая ОС? Ваша локальная машина доступна по сети?) Я могу рассказать вам, как это сделать.

В любом случае, чтобы попробовать все IP-адреса в подсети, предполагая, что у вас установлен arp , вы можете сделать что-то вроде этого:

for ip in `arp | grep -v Add | awk '{print $1}'`; do ssh $ip; done
0

Вы могли бы ускорить процесс, предоставив некоторый сервис, который легко запрашивается, и никакой другой машины, вероятно, не будет (конечно, SSH также будет делать, но проверка с помощью ssh дольше, и сканирование портов для ssh по понятным причинам не одобряется).

Используйте настраиваемый сканер портов для сканирования всей подсети в поисках этой единственной службы. Машина, которая имеет эту услугу, является той, которую вы ищете.

Однако лучшим решением было бы поговорить с сетевыми администраторами и обновить DNS при подключении VPN.

0

Если вы хотите определить, какой IP-адрес используется вашей машиной с Ubuntu, в OpenSSH есть инструмент ssh-keyscan для сканирования сети на наличие ключей хоста ssh:

for ((a=0;a<255;a++)); do echo 198.51.100.$a; done | ssh-keyscan -f -H > ssh_id_list

Вам просто нужно знать, какой из них ваш сервер. Вы можете получить его непосредственно с вашего сервера или использовать тот факт, что ваш клиент сохраняет их при первом подключении в ~/.ssh/known_hosts:

ssh-keygen -F last_ip_you_used_to_connect -l

Затем просто выполните команду grep ssh-keyscan.


Другая возможность заключается в использовании mDNS: это решение распределенной DNS, которое хорошо работает при условии, что VPN разрешает многоадресный трафик. Это установлено по умолчанию на рабочих столах Ubuntu (если hostname -A отображает yourhostname.local , это хорошо). Если по какой-либо причине iTunes (или любое другое программное обеспечение Apple, которое устанавливает Bonjour) установлено в Windows, вы можете просто подключиться к yourhostname.local и он будет работать «из коробки». В противном случае, если у вас установлена другая машина Ubuntu с известным ip-адресом и установленным респондентом mDNS, просто подключитесь к нему и попросите разрешить или yourhostname.local

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