-f 옵션으로 시작한 SSH 세션을 종료하는 방법 (백그라운드에서 실행)


49

나는 이것에 꽤 길을 잃었다. 매뉴얼 페이지에서 :

 -f      Requests ssh to go to background just before command execution.

-f옵션으로 SSH를 시작한 후 작동 터널이 있습니다. 그러나 사용을 마친 후에는 더 이상 상호 작용하는 방법을 모릅니다. 예를 들어 SSH 터널 을 마치면 SSH 터널을 닫을 수 없습니다 .

내가 아는 일반적인 방법은 작동하지 않습니다. 예를 들어 jobs아무것도 반환하지 않습니다. ~명령이 인식되지 않습니다 (그리고 어쨌든, 그것을 사용하는 방법을 정확하게 모른다).

그러나 pgrepSSH 터널이 여전히 실행 중임을 알려줍니다 (터미널을 닫은 후 등). 어떻게 상호 작용합니까? 닫으려면 어떻게합니까?

답변:


64

스크립팅에 특히 유용한 솔루션 master mode은 제어 명령을위한 소켓과 함께 를 사용 하는 것입니다.

ssh -f -N -M -S <path-to-socket> -L <port>:<host>:<port> <server>

다시 닫으려면

ssh -S <path-to-socket> -O exit <server>

이것은 프로세스 ID에 대한 grepping과 다른 접근법과 관련 될 수있는 타이밍 문제를 방지합니다.


10
그냥 미숙에 대한 약간의 확장하려면 <경로로 소켓> ssh 클라이언트의 마스터 인스턴스가 마스터 인스턴스의 연결을 공유 할 다른 SSH 클라이언트 인스턴스와 프로세스 간 통신을 위해 생성하는 파일에 대한 경로입니다. 작성된 파일은 실제로 유닉스 도메인 소켓을 나타냅니다. 예를 들어 /tmp/session1( % 패턴을 사용하여 이름을 지정하는 것이 좋지만 -의 ControlPath 설명 참조 man ssh_config)
golem

1
또한 명령 의 <server> 부분은 ssh -S <path-to-socket> -O exit <server>문자열 일 수 있지만 존재해야합니다. 어색합니다.
golem

1
이 답변과 질문은 다소 오래되었지만, 내가 본이 문제를 처리하는 가장 우아하고 올바른 방법으로 이것을 보증하고 싶었습니다. 감사합니다!
zentechinc

41

여기에서 해결책을 찾았습니다 : http://www.g-loaded.eu/2006/11/24/auto-closing-ssh-tunnels/

가장 좋은 방법 – 자동 폐쇄 터널

앞에서 언급했듯이 -f -N 스위치 조합을 사용하는 대신 -f 만 사용하고 원격 시스템에서 명령을 실행할 수도 있습니다. 그러나 터널을 초기화하기 만하면되므로 어떤 명령을 실행해야합니까?

이것은 수면이 가장 유용한 명령이 될 때입니다! 이 특정 상황에서 수면에는 두 가지 장점이 있습니다.

  • 아무 것도하지 않으므로 리소스가 소비되지 않습니다
  • 사용자는 실행 시간을 지정할 수 있습니다

ssh 터널 자동 폐쇄에 도움이되는 방법은 아래에 설명되어 있습니다.

원격 시스템에서 sleep 명령을 10 초 동안 실행하면서 백그라운드에서 ssh 세션을 시작합니다. 초 수는 중요하지 않습니다. 동시에, 우리는 이전과 동일하게 vncviewer를 실행합니다 :

[me@local]$ ssh -f -L 25901:127.0.0.1:5901 me@remote.example.org sleep 10; \
          vncviewer 127.0.0.1:25901:1

이 경우 ssh 클라이언트는 ssh 세션을 배경 (-f)으로 분기하고 터널을 생성 (-L 25901 : 127.0.0.1 : 5901)하고 10 초 동안 원격 서버에서 sleep 명령을 실행하도록 지시합니다 (sleep 10).

이 방법과 이전 방법 (-N 스위치)의 차이점은 기본적으로이 경우 ssh 클라이언트의 주요 목표는 터널을 생성하는 것이 아니라 sleep 명령을 10 초 동안 실행하는 것입니다. 터널의 생성은 부수적 인 목표 인 일종의 부작용입니다. vncviewer를 사용하지 않으면 ssh 클라이언트는 더 이상 수행 할 작업이 없으므로 동시에 터널을 파괴하므로 10 초 후에 종료됩니다.

휴면 명령을 실행하는 동안이 경우 다른 프로세스 인 vncviewer가 해당 터널을 사용하기 시작하고 10 초를 초과하여 점유 상태를 유지하면 ssh 클라이언트가 원격 작업을 완료하더라도 (수면 실행) 다른 프로세스가 터널을 점유하므로 종료하십시오. 즉, ssh 클라이언트는 vncviewer도 종료해야하므로 터널을 파괴 할 수 없습니다. vncviewer가 터널 사용을 중지하면 ssh 클라이언트도 이미 목표를 달성 했으므로 종료됩니다.

이런 식으로 ssh 프로세스가 백그라운드에서 계속 실행되지 않습니다.


4
짧은 말 / 수정 : 내가 아는 vncviewer 127.0.0.1::25091한 디스플레이 구문이 아닌 포트 구문을 사용하는 것으로 지정해야 합니다.
Christian Wolf

이것은 좋은 생각이며 Windows에서 발생한 문제를 깔끔하게 회피합니다. 최신 버전의 Windows는 ssh 클라이언트와 함께 제공되며 이론적으로 -S 옵션을 지원하지만 작동하지 않는 것 같습니다.
Keeely

9

터널을 종료하려면 ps -C ssh또는 ps | grep ssh다른 변형을 사용하여 터널을 실행중인 ssh 프로세스를 확인하십시오. 그럼 죽여

또는이 포트가 열려있는 프로세스를 판별하여 프로세스를 찾을 수 있습니다.

netstat -lnpt | awk '$4 ~ /:1234$/ {sub(/\/.*/, "", $7); print $7}'

컴퓨터에서 (사용자로) 실행중인 모든 ssh 클라이언트 pkill ssh를 종료하려면 그렇게하십시오.


6

여기 다른 사람들이 대답했듯이 pkill ssh그것을 죽입니다.

다시 가져올 수있는 터널을 만들려면 옵션 screen없이 터널을 시작한 -f다음로 화면을 분리하십시오 Ctrl-A D. 터널을 다시 불러 오려면을 호출하십시오 screen -r.


무차별
대단

1
원격으로 연결하는 경우주의하십시오. pkill ssh는 현재 연결을 끊을 수도 있습니다.
kennyut

@kennyut 또 다른 이유가있다 screen.
Haotian Yang

0

내가 터널을 시작할 때 :

ssh -fN -D 8080 SOME_IP_HERE -l LOGIN_NAME_HERE
  • -f ssh에게 명령 실행 직전에 백그라운드로 이동하도록 요청합니다.
  • -N원격 명령을 실행하지 마십시오. 포트를 전달하는 데 유용합니다.
  • -D 로컬 "동적"응용 프로그램 레벨 포트 전달을 지정합니다.
  • -l 원격 시스템에서 로그인 할 사용자를 지정합니다.

나는 그것을 닫을 수 있습니다 :

ps -lef | grep ssh | grep "8080" | awk "{print \$2}" | xargs kill

-1

하나의 명령 줄에서 모든 터널 을 죽이는 가장 좋은 해결책 은

ps -lef|grep ssh|grep "\-L"|awk '{print $4}'|xargs kill

ssh 세션의 경우 터널 옵션을 제거하십시오.

ps -lef|grep ssh|awk '{print $4}'|xargs kill

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.