Чи можу я змусити 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.