Чи можу я змусити SSH вийти з ладу, коли переадресація порту закінчується?


39

Якщо я роблю віддалений порт вперед, а -R 3690:localhost:3690коли прив'язка вже існує на порту віддаленого хоста, я отримую це попередження:

Warning: remote port forwarding failed for listen port 3690

Чи є спосіб відмовити ssh (тобто вихід з ненульовим кодом повернення), а не просто надсилати попередження?


Вам також потрібно зробити термінальний канал, або просто переадресацію?
Ігнасіо Васкес-Абрамс

1
@ IgnacioVazquez-Abrams: Просто переадресація.
Метт Столяр

Відповіді:


63

Біжи

ssh -o "ExitOnForwardFailure yes" ...

або покласти

ExitOnForwardFailure yes

в ~/.ssh/config. Детальніше man ssh_configдив.


На жаль, у мене OpenSSH 4. Чи можете ви сказати мені, коли ця функція була додана?
Метт Столяр

2
Ні, я цього не знаю. Це може бути функція версії 5. Але версії 4 зараз має бути багато років, і постійно є виправлення безпеки . Якщо ви не можете оновити сервер самостійно, ви можете запитати свого адміністратора сервера, чи він вважає, що безпечно продовжувати використовувати цю версію.
Ендрю Шульман

Майте на увазі, що якщо ви чітко не вкажете, bind_addressтоді ssh може все-таки не вийти з ладу. Наприклад, якщо інший користувач вже слухає ipv6 localhost, [::1]:3690ssh може прив’язувати тільки ipv4 127.0.0.1:3690і не скаржиться. Але ваш клієнт svn, напевно, віддасть перевагу ipv6 сокет (зловмисника). Щоб бути безпечним, краще використовуйте-R [::1]:3690:localhost:3690 -R 127.0.0.1:3690:localhost:3690
rudimeier

3
Можна також використовувати ssh -o ExitOnForwardFailure = так, щоб уникнути пробілу та необхідності цитування.
простір

1

Я використовую скрипт bash на цільовому хості, щоб переконатися, що переадресація була відкрита правильно. З'єднання SSH запустить це і вийде, якщо є проблема з переадресацією порту, наприклад

сценарій на стороні клієнта: (для налаштування переадресації портів використовується .ssh / config)

#!/bin/bash    

while true; do
    echo -n starting at : "
    date
    ssh user@server bin/sshloop.sh
    echo "got back, sleeping 17 "
    sleep 17
done 

скрипт на стороні сервера (bin / sshloop.sh)

#!/bin/bash

while true; do 
  echo $(date)" : SSH Reverse 1090:80, 1232:22 From Server to Client"
  sleep 17
  if ! netstat -an | grep -q ":::1090 " ; then
     echo "1090 forward missing, bailing out"
     exit
  fi
done

Можливо, навіть запустіть скрипт на стороні клієнта під екраном за допомогою -dmS


2
Випадок, якого я намагаюся уникнути, - це те, що порт вперед вже існує, і подається попередження. Я думаю, що цей сценарій буде розглядати існуючу прив'язку до порту як успіх, а не збій.
Метт Столяр

1
Це правда. Моя проблема полягала в тому, що той самий сценарій тримав порт відкритим за кілька хвилин до вичерпання часу. Цей сценарій вийшов і повторно повторився, після чого порт буде знову відкритий. Якщо вам потрібно точно знати, хто є власником порту, ви можете спробувати запустити netstat -anp з sudo і знімати це.
Antti Rytsölä Circles Consult

@ AnttiRytsöläCirclesConsult: Зауважте, що вам може знадобитися перевірити ідентифікатор процесу, як наприклад, відповідність "ssh" як імені процесу все ще не повідомляє вам, хто з клієнтів SSH в даний час пересилає цей порт.
Пісквор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.