Как закрыть этот ssh-туннель? [закрыто]

101

Я открыл туннель ssh, как описано в этом сообщении: Zend_Db: Как подключиться к базе данных MySQL через туннель SSH?

Но теперь я не знаю, что я на самом деле сделал. Эта команда влияет на что-нибудь на сервере? И как мне закрыть этот туннель, потому что теперь я не могу правильно использовать свой локальный mysql.

Я использую OSX Lion, а сервер работает на Ubuntu 11.10.

Джейкоб
источник

Ответы:

244

Предполагая, что вы выполнили эту команду: 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. Хорошо работает с аутентификацией с открытым / закрытым ключом. Не с паролями, потому что я не нашел способа передать пароли.
Мэтт Баннерт
Принимаю этот ответ как лучший из-за подробного объяснения.
Джейкоб
Хороший ответ! Между прочим, -9не требуется kill, учитывая, что процесс все еще работает нормально ;-)
Лючио Пайва
47

Это убьет все сеансы ssh, которые вы открыли с терминала.

sudo killall ssh
thenetimp
источник
«Соответствующие процессы не найдены», - говорится в сообщении.
Джейкоб
Вроде так и есть. Mysql тоже работал нормально, но потом Apache начал жаловаться. Я сделал перезагрузку и все работает как положено. Думаю, проблема решена :)
Джейкоб
5
Что ж, вы не хотите этого делать, если это производственная среда ... вы
выгоните
12
Бежать killall ssh- довольно безрассудная команда. Я советую ps aux | grep sshвыполнить поиск в вашем списке процессов (например, как было предложено @simont выше), чтобы узнать идентификатор конкретного процесса вашего туннельного процесса ssh. Тогда можно убить именно pid.
Бен
Есть хороший шанс, что вы не захотите, чтобы их всех убили.
wobbily_col
23

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

На мой взгляд, лучше НЕ использовать -fи вместо этого просто фоновый процесс как обычно с &. Это даст вам точный pid, который вам нужно убить:

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, вам будет плохо
Аарон
Использование -fтакже имеет то преимущество, что при необходимости у локального пользователя запрашивается пароль для входа. Если вы используете &, это приглашение не будет видно пользователям, если они не переведут процесс на передний план (например, с помощью fg).
Bdoserror
4
в первый раз, когда ваш <LOCAL-PORT> встречается в pid процесса, который также содержит текст 'ssh' (например, другой процесс ssh или sshd или редактирование файла с 'ssh' в имени), вы поймете, что это подход, хотя и удобен в простых сценариях, но не пуленепробиваемый
Аарон