Як закрити цей тунель ssh? [зачинено]


96

Я відкрив тунель ssh, як описано в цій публікації: Zend_Db: Як підключитися до бази даних MySQL через тунель SSH?

Але зараз я не знаю, що я насправді робив. Чи впливає ця команда на що-небудь на сервері? І як мені закрити цей тунель, тому що зараз я не можу належним чином використовувати свій локальний mysql.

Я використовую OSX Lion, а сервер працює на Ubuntu 11.10.

Відповіді:


241

Якщо припустити, що ви виконали цю команду: ssh -f user@mysql-server.com -L 3306:mysql-server.com:3306 -Nяк описано в повідомленні, яке ви зв’язали.

Розбивка команди:

  1. ssh: це досить зрозуміло. Закликає ssh.
  2. -f: (Зі man sshсторінки)

    Просить ssh перейти у фоновий режим безпосередньо перед виконанням команди. Це корисно, якщо ssh збирається запитувати паролі або парольні фрази, але користувач хоче, щоб це було у фоновому режимі.

    По суті, надішліть sshу фоновий режим після введення паролів для встановлення зв’язку; він повертає вам підказку оболонки, localhostа не входить у систему remote-host.

  3. user@mysql-server.com: віддалений сервер, на який ви хочете ввійти.
  4. -L 3306:mysql-server.com:3306: Це цікавий біт. -L(зі man sshсторінки):

    [bind_address:] port: host: hostport Вказує, що даний порт на локальному (клієнтському) хості повинен бути переадресований на даний хост і порт на віддаленій стороні.

    Так -L 3306:mysql-server.com:3306прив’язує локальний порт 3306до віддаленого порту 3306 на хості mysql-server.com.

    Коли ви підключаєтесь до локального порту 3306, з'єднання переадресовується через захищений канал на mysql-server.com. Віддалений хост , а mysql-server.comпотім підключається до mysql-server.comпорту 3306.

  5. -N: не виконувати команду. Це корисно для "просто переадресації портів" (цитування сторінки користувача).

Чи впливає ця команда на що-небудь на сервері?

Так, він встановлює зв’язок між localhost та mysql-server.com на порту 3306 .

І як мені закрити цей тунель ...

Якщо ви використовували -f, ви помітите, що sshпроцес, який ви відкрили, переходить у фоновий режим. Найкращий спосіб закрити його - це запустити ps aux | grep 3306, знайти файл pidз ssh -f ... -L 3306:mysql-server.com:3306 -Nі kill <pid>. (А може kill -9 <pid>; я забуваю, якщо це просто killпрацює). Це має прекрасну перевагу - не вбивати всіх інших ваших sshзв’язків; якщо у вас більше одного, їх відновлення може бути легким ... болем.

... тому що зараз я не можу правильно використовувати свій локальний mysql.

Це тому, що ви фактично "захопили" локальний mysql процес і перенаправили трафік, який намагається підключитися до нього, на віддалений mysql процес. Набагато краще , рішення було б не використовувати локальний порт 3306 в порт вперед. Використовуйте те, що не використовується, наприклад 33060. (Більші числа, як правило, використовуються рідше; досить часто переносять вперед такі комбінації: "2525-> 25", "8080-> 80", "33060-> 3306" або Полегшує запам'ятовування).

Отже, якби ви використовували ssh -f user@mysql-server.com -L 33060:mysql-server.com:3306 -N, тоді ви б спрямовували свою функцію Zend connect-to-mysql localhostна порт 33060, який би підключався до mysql-server.comпорта 3306. Ви, очевидно, все ще можете підключитися до localhostпорту 3306, тому ви все одно можете використовувати локальний mysqlсервер.


5
Найкраще пояснення, яке я прочитав за деякий час. Це дуже корисно при доступі до віддаленої бази даних із локально встановлених середовищ, таких як R, наприклад. Добре працює з автентифікацією за відкритим / приватним ключем. Не з паролями, тому що я не знайшов способу передачі паролів.
Matt Bannert

Приймаючи цю відповідь як найкраще через ґрунтовне пояснення.
Яків

Приємна відповідь! До речі, -9це не потрібно для kill, враховуючи, що процес все ще працює нормально ;-)
Lucio Paiva

46

Це призведе до знищення всіх сеансів ssh, які ви відкрили з терміналу.

sudo killall ssh

"У ній не знайдено жодного відповідного процесу".
Яків

Здається, це так. Mysql теж добре працював, але потім Apache почав скаржитися. Я зробив перезавантаження, і все працює, як очікувалося. Проблема вирішена, мабуть :)
Яків

5
Ну, ви не хочете робити цього, якщо це продуктивне середовище ... ви
викинете

12
Біг killall ssh- це досить необдумана команда. Я раджу здійснити пошук у вашому списку процесів (тобто, ps aux | grep sshяк запропонував @simont вище), щоб виявити конкретний ідентифікатор процесу вашого ssh-тунельного процесу. Тоді ви можете вбити pid, що спеціально.
Бен,

Є велика ймовірність, що ви не захочете, щоб їх усіх вбили.
wobbily_col

22

Примітка: додавання як відповідь, оскільки коментарі не підтримують блоки коду.

На мою думку, краще НЕ використовувати, -fа замість цього просто фоновий процес, як зазвичай &. Це дасть вам точну піду, яку вам потрібно вбити:

ssh -N -L1234:other:1234 server &
pid=$!
echo "waiting a few seconds to establish tunnel..."
sleep 5
... do yer stuff... launch mysql workbench whatever
echo "killing ssh tunnel $pid"
kill $pid

Або ще краще, просто створіть це як сценарій обгортки:

# backend-tunnel <your cmd line, possibly 'bash'>
ssh -N -L1234:other:1234 server &
pid=$!
echo "waiting a few seconds to establish tunnel..."
sleep 5
"$@"
echo "killing ssh tunnel $pid"
kill $pid

backend-tunnel mysql-workbench

backend-tunnel bash


12
Використання -fдозволяє sshпродовжити сеанс навіть тоді, коли термінальний сеанс закритий, на відміну від натискання у фоновий режим. Захоплення pidвикористання ps aux | grep ssh | grep <LOCAL-PORT>досить тривіальне.
simont

1
@simont, використовуючи явний pid, повернутий із фонового завдання, безпечніший, незалежно від того, як ви його використовуєте у фоновому режимі. якщо у вас запущено більше одного ssh-процесу, вам буде погано
aaron

Використання -fтакож має ту перевагу, що запитує локального користувача для входу в систему пароля, якщо це необхідно. Якщо ви використовуєте &, користувач не бачить цього запиту, якщо він не висуває процес на перший план (наприклад, за допомогою fg).
Bdoserror


3
Перший раз, коли ваш <LOCAL-PORT> трапляється в pid процесу, який також містить текст 'ssh' (наприклад, інший процес ssh або sshd або редагування файлу з назвою 'ssh'), ви зрозумієте, що це підхід, хоча і зручний у простих сценаріях, не є куленепробивальним
Аарон,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.