이 ssh 터널을 닫는 방법? [닫은]


96

이 게시물에 설명 된대로 ssh 터널을 열었습니다. Zend_Db : SSH 터널을 통해 MySQL 데이터베이스에 연결하는 방법?

하지만 지금은 제가 실제로 무엇을했는지 모르겠습니다. 이 명령이 서버에 영향을 미칩니 까? 이제 로컬 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 3306mysql-server.com

    당신이에 연결하면 로컬 포트 3306연결이에 보안 채널을 통해 전달됩니다 mysql-server.com. 원격 호스트는 , mysql-server.com다음에 연결 mysql-server.com포트 3306.

  5. -N: 명령을 실행하지 않습니다. 이것은 "단지 전달 포트"(맨 페이지 인용)에 유용합니다.

이 명령이 서버에 영향을 미칩니 까?

예, 포트 3306 에서 localhostmysql-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서버를 사용할 수 있습니다 .


5
내가 한동안 읽은 최고의 설명. 예를 들어 R과 같이 로컬로 설치된 환경에서 원격 데이터베이스에 액세스 할 때 매우 유용합니다. 공개 / 개인 키 인증과 잘 작동합니다. 암호를 전달하는 방법을 찾지 못했기 때문에 암호가 아닙니다.
매트 Bannert

철저한 설명 때문에이 답변을 가장 잘 받아들이는 것입니다.
Jacob

좋은 대답입니다! 그런데, -9필요하지 않습니다 kill프로세스가 여전히 ;-) 잘 작동되는 고려
루시오 PAIVA

46

이것은 터미널에서 연 모든 ssh 세션을 종료합니다.

sudo killall ssh

'일치하는 프로세스가 없습니다'라고 말합니다.
Jacob

그런 것 같습니다. Mysql도 잘 작동했지만 Apache가 불평하기 시작했습니다. 재부팅을했고 모든 것이 예상대로 작동합니다. 문제가 해결 된 것 같아요 :)
Jacob

5
그럼 당신은 당신이 모든 다른 관리자에게 쫓아 것입니다 ... 그것은 자극 환경의 경우이 작업을 수행하지 않으
texasbruce

12
달리기 killall ssh는 다소 무모한 명령입니다. ps aux | grep sshssh 터널 프로세스의 특정 프로세스 ID를 찾으려면 프로세스 목록 (즉 , 위의 @simont가 제안한대로)을 검색하는 것이 좋습니다. 그런 다음 구체적으로 pid를 죽일 수 있습니다.
Ben

그들 모두를 죽이고 싶지 않을 좋은 기회가 있습니다.
wobbily_col

22

참고 : 주석은 코드 블록을 지원하지 않으므로 답변으로 추가하십시오.

제 생각에는 사용하지 -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 2013-04-23

1
백그라운드 작업에서 반환 된 명시 적 pid를 사용하는 @simont는 백그라운드 작업에 관계없이 더 안전합니다. 실행중인 하나 개 이상의 SSH 과정이있는 경우 당신은 나쁜 시간이거야
아론

를 사용 -f하면 필요한 경우 로그인 암호를 입력하라는 메시지가 로컬 사용자에게 표시되는 이점도 있습니다. 를 사용하는 경우 &프로세스를 포 그라운드로 가져 오지 않는 한 (예 :을 사용하여 fg) 사용자가 해당 프롬프트를 볼 수 없습니다 .
Bdoserror


3
'ssh'라는 텍스트 (다른 ​​ssh 또는 sshd 프로세스 또는 이름에 'ssh'가 포함 된 파일 편집)도 포함하는 프로세스의 pid에서 <LOCAL-PORT>가 처음 발생하면 다음과 같은 사실을 알게 될 것입니다. 방탄없는 간단한 시나리오에서 편리하면서, 접근
아론
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.