Пошук IP-адреси або імені хоста машини-виробника (ssh)


10

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

  • Я не хочу надсилати змінні середовища, оскільки деякі машини, у яких я не маю встановити root PermitUserEnvironment.
  • $SSH_CLIENTЗмінна середовища використовується для прямих з'єднань, але тільки перераховані найостанніші ворота.

Моя поточна ідея рішення полягає в тому, щоб схопити $SSH_CLIENT, сш на нього, знайти значення цієї машини $SSH_CLIENTі повторити, поки воно не існує; потім схопіть ім’я хоста і якось відтягніть його назад.

Схоже, трохи зламати роботу; хтось має кращий метод?

Я працюю в основному в bash shell, але також радий будь-яким пропозиціям, які також не використовують його.


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

Чи можете ви навести приклад, де або для чого вам потрібна ця інформація? Можуть бути й інші неочевидні рішення.
Манве

@Manwe Я в кінцевому підсумку хочу налаштувати конкретні розділи для таких мов, як мій .bashrc. Зараз все, що я хочу зробити, - це автоматично встановити один із трьох розкладок клавіатури in 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-адреси, а тут--і і як запустити щось інтерактивне

Відмова від відповідальності: я НЕ впевнений , про -lта -iможливість /bin/bash. Можливо, вам потрібно їх опустити.


Ви можете бути тут на чомусь! Я трохи пограю з цим і повернуся до вас.
Геодезична

Я відзначаю цю відповідь, оскільки і псевдо-tty, і віддалені команди працюють. Я врешті вирішив свій конкретний випадок із зворотними викликами ^ E, виходячи із пропозиції віддалених команд - це в кінцевому підсумку є трохи чистішим та загальним використанням. Дякую!
Геодезична

2

Id Я правильно зрозумів, що ви з'єднуєтесь безпосередньо з машини-виробника до місця призначення з 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 для визначення типу хоста чи хоста.

# 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-з'єднанням).
Manwe

Тестований 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.