이 게시물에 설명 된대로 ssh 터널을 열었습니다. Zend_Db : SSH 터널을 통해 MySQL 데이터베이스에 연결하는 방법?
하지만 지금은 제가 실제로 무엇을했는지 모르겠습니다. 이 명령이 서버에 영향을 미칩니 까? 이제 로컬 mysql을 제대로 사용할 수 없기 때문에 어떻게이 터널을 닫을 수 있습니까?
OSX Lion을 사용하고 서버는 Ubuntu 11.10에서 실행됩니다.
이 게시물에 설명 된대로 ssh 터널을 열었습니다. Zend_Db : SSH 터널을 통해 MySQL 데이터베이스에 연결하는 방법?
하지만 지금은 제가 실제로 무엇을했는지 모르겠습니다. 이 명령이 서버에 영향을 미칩니 까? 이제 로컬 mysql을 제대로 사용할 수 없기 때문에 어떻게이 터널을 닫을 수 있습니까?
OSX Lion을 사용하고 서버는 Ubuntu 11.10에서 실행됩니다.
답변:
ssh -f user@mysql-server.com -L 3306:mysql-server.com:3306 -N
링크 한 게시물에 설명 된 대로이 명령을 실행했다고 가정합니다 .
명령의 분석 :
ssh
: 꽤 자명합니다. 을 호출 ssh
합니다.-f
: ( man ssh
페이지에서)
명령 실행 직전에 ssh가 백그라운드로 이동하도록 요청합니다. 이것은 ssh가 암호 또는 암호를 요구하지만 사용자가 백그라운드에서 원하는 경우 유용합니다.
기본적으로 ssh
연결을 설정하기 위해 암호를 입력 한 후 백그라운드로 보냅니다 . 에 localhost
로그인하는 대신 에서 쉘 프롬프트를 다시 제공합니다 remote-host
.
user@mysql-server.com
: 로그인하려는 원격 서버입니다. -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
.
-N
: 명령을 실행하지 않습니다. 이것은 "단지 전달 포트"(맨 페이지 인용)에 유용합니다.
이 명령이 서버에 영향을 미칩니 까?
예, 포트 3306 에서 localhost 와 mysql-server.com 사이에 연결을 설정합니다 .
이 터널을 어떻게 닫을까요?
당신이 사용한 적이 있다면 -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
당신은 당신의 젠드 연결 - 투 - MySQL의 기능을 가리키는 것 localhost
포트 33060
에 연결하는 것, mysql-server.com
포트를 3306
. 분명히 localhost
포트에 연결할 3306
수 있으므로 여전히 로컬 mysql
서버를 사용할 수 있습니다 .
-9
필요하지 않습니다 kill
프로세스가 여전히 ;-) 잘 작동되는 고려
이것은 터미널에서 연 모든 ssh 세션을 종료합니다.
sudo killall ssh
killall ssh
는 다소 무모한 명령입니다. ps aux | grep ssh
ssh 터널 프로세스의 특정 프로세스 ID를 찾으려면 프로세스 목록 (즉 , 위의 @simont가 제안한대로)을 검색하는 것이 좋습니다. 그런 다음 구체적으로 pid를 죽일 수 있습니다.
참고 : 주석은 코드 블록을 지원하지 않으므로 답변으로 추가하십시오.
제 생각에는 사용하지 -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
-f
하면 ssh
백그라운드로 푸시하는 것과 달리 터미널 세션이 닫혀 있어도 세션을 계속할 수 있습니다 . 잡아 pid
사용하는 것은 ps aux | grep ssh | grep <LOCAL-PORT>
매우 간단하다.
-f
하면 필요한 경우 로그인 암호를 입력하라는 메시지가 로컬 사용자에게 표시되는 이점도 있습니다. 를 사용하는 경우 &
프로세스를 포 그라운드로 가져 오지 않는 한 (예 :을 사용하여 fg
) 사용자가 해당 프롬프트를 볼 수 없습니다 .