autossh 터널을 중지 / 죽이는 방법?


17

이제 autossh 터널이 있으므로이를 막는 올바른 방법은 무엇입니까?

이 작업을 수행하는 쉬운 방법이없는 것 같습니다. 이 부분에 대한 문서가 명확하지 않습니다.

가장 쉬운 방법은 컴퓨터를 재부팅하는 것 같습니다. 이 올바른지?

답변:


21

아니, 적절한 살인 방법 autossh은 단순히 프로세스를 죽이는 autossh것입니다.

그 이유는

# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable

그것은 autossh단순히 서비스가 아닌 쉘 스크립트 입니다. 마지막 줄에서 새 프로그램을 시작합니다.

exec /usr/lib/autossh/autossh "$@"

다시는 서비스가 아닙니다. 에 관해서는 exec(당신이 그것을 한 번 확인 할 수 배쉬 해커의 위키 )는 (다음 명령을 사용하여 현재 쉘을 대체하는 쉘 내장 명령입니다 /usr/lib/autossh/autossh "$@"새로운 프로세스를 시작하지 않고이 경우). 따라서 중지 하는 유일한 방법 autossh은 호출 스크립트 를 종료하는 것 입니다.

pkill -3 autossh

-3 플래그 사용의 중요성을 지적한 dviljoen 에게 감사드립니다 ( 아래 참조). 또한, 호출 명령 ( , 위의 명령 )은 이전 연결이 끊어진 것을 인식하자마자 새 연결을 시작 하기 때문에 연결 종료가 작동하지 않습니다 . ssh


1
실제로 -9없이 autossh를 종료해야합니다. 터널을 통해 이미 연결되어 있으면이를 처리하기 위해 자식 sshd 프로세스가 생성됩니다. -9를 사용하여 상위 autossh를 종료하면 sshd 프로세스가 남습니다. 터널은 sshd 프로세스가 시간 초과 될 때까지 계속 작동합니다. 강제 종료시 기본 신호 (-3)를 사용하면 정상적으로 종료되고 생성 된 sshd 프로세스가 수행됩니다.
dviljoen

-3이 기본 킬 신호이므로 실제로 -3을 명시 적으로 전달할 필요는 없습니다. 생략 할 수 있습니다.
Andrés Alcarraz

@ AndrésAlcarraz 정말로 확실합니까? SIGTERM기본값이며 그 중 하나는 15입니다. SIGQUITis 3, superuser.com/questions/352147/what-does-kill-3-meanen.wikipedia.org/wiki/Kill_(command) 참조 -또한 FWIW는 방금 확인 -15했지만 종료하지 않았습니다. 그래서 SIGTERM사용할 수 없습니다.
Daniel F

그리고 pkill신호없이 사용 하면 (= the default) 종료되지 않습니다 autossh.
Daniel F

@DanielF 당신 말이 맞아, 나는 dvijoen 코멘트에서 "기본 신호 (-3)"를 혼동했다
Andrés Alcarraz

5

다음과 같이 auto ssh를 실행하십시오.

AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh

그것을 죽여 :

kill pid

BTW

pkill -9 autossh 잘못이다

-9그래서, 확인 프로세스가 정상적으로 종료하지하게 ssh때 프로세스가 계속이 autossh프로세스가 살해

없이도 -9여전히 나쁘다. 만약 여러 개의 터널을 운영하고 pkill있다면 모두 죽일 것이다.

올바른 방법은 AUTOSSH_PIDFILEenv var 를 설정 kill하고 pid 만 설정 하는 것입니다


슈퍼 유저에 오신 것을 환영합니다. 마지막 단락이 실제 답변 인 것처럼 보이고 나머지 질문은 다른 답변 에 대한 주석입니다 . 이 사이트의 Q & A 특성을 고려하면 답변에 세부 정보를 충분히 추가하여 자체적으로 견딜 수 있도록하는 것이 좋습니다. 기여해 주셔서 감사하며 투어 를 확인하는 것을 잊지 마십시오 .
나는 말한다 Reinstate Monica

4

프로세스를 검색하십시오.

PS AUX | grep ssh

두 번째 열은 PID 번호입니다.

PID에 의한 킬 프로세스 :)

-9 PID 번호 죽이기

루트 권한이 없으면 sudo를 사용하십시오 .


1

나는 이것이 답변되었지만 위의 의견과 달리 pkill -3 autosshsshd 자식 프로세스를 사용 하지 않습니다.

.bashrc파일 에서이 기능을 사용 합니다.
기본적 --kill으로 autossh에 인수를 추가하는 것과 같습니다 .

  if [ "$1" = "--kill" ]; then
    ps aux | 
    grep -P "(/usr/bin/ssh|/usr/lib/autossh/autossh)\s.*$2" |
    awk '{print $2}' |
    xargs -r kill
  else
    $(which autossh) "$@"
    echo "" # prevents line wrapping when you kill the ssh process
  fi

시스템에서 경로를 실행 which ssh하고 which autossh확인할 수 있습니다 .

첫 번째 인수가 아닌 한 --kill, 인수 를 autossh에 전달합니다.

이 스크립트는 autossh 및 ssh 인스턴스를 종료합니다. 포트 전달을 사용하는 경우 이것은 중요합니다. autossh 인스턴스 만 종료해도 터널이 종료되지 않고, 마지막으로 연결이 끊어진 경우 다시 연결되는 것을 막기 때문입니다.

특정 터널 만 종료하도록 검색어 (호스트 이름)를 지정할 수도 있습니다.

autossh --kill dbserver1dbserver1에 대한 연결 만 종료하면
autossh --kill dbserverdbserver1, dbserver2 등
autossh --kill dbserver이 종료되고 모든 autossh 연결이 종료됩니다.

명확히하기 위해 autossh로 시작한 SSH 세션 만 종료해야합니다.

ps aux | grep sshautossh 및 ssh 세션을 모두 실행 하는 동안 실행 하면 autossh로 시작한 세션이 전체 경로 (/ usr / bin / ssh 및 / usr / lib / autossh / autossh)를 사용한다는 것을 알 수 있습니다.
이 스크립트는 speicifc 경로로 시작한 프로세스에만 결과를 일치시킵니다. 나는 일반적으로 ssh전체 경로가 아닌 입력 하고 대부분의 사람들을 가정하기 때문에이 작업을 수행하여 정상적인 ssh 세션을 종료하지 못하게합니다.

이것이 다른 사람들을 돕기를 바랍니다.


$(which autossh)단순히 대신에 특별한 이유가 autossh있습니까?
MestreLion 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.