모든 현재 터널에서 특정 SSH 터널을 효율적으로 찾으십니까?

모든 현재 터널에서 특정 SSH 터널을 효율적으로 찾으십니까?

포트 22에서 OpenSSH를 사용하여 로그인하고 포트 3306과 80도 터널링한다고 가정해 보겠습니다.

포트 80은 세 포트(22, 3306, 80) 모두에서 터널링되는 마지막 포트입니다.

$ sudo ssh UWU@IP -L 80:localhost:80

포트 80 터널 프로세스만 종료하는 방법은 무엇입니까?

나는 가장 좋은 방법은 어떤 방식으로든 포트 80 터널을 자동 대상으로 지정하는 것이라고 생각합니다. 또 다른 방법은 3개의 터널 중 마지막 터널을 목표로 삼는 것입니다.

내가 이것을 묻는 이유는 다음과 같습니다.

ps aux | grep ssh프로세스를 찾아 구체적으로 종료 할 수 있지만 자동으로 수행되지는 않습니다.

답변1

문제가 있는 프로세스의 PID를 찾으려면 구문을 사용하는 것이 좋습니다 $!.

스테이지 1:프로세스를 시작하되 이번에는 임의의 PID 값을 보유하는 변수를 사용합니다.

sudo ssh blah@blah 80:localhost:80 & arbpid=$!

두 번째 단계:터널을 생성할 때만 변수를 저장하는 경우 arbpid이를 사용하여 스크립트 끝에서 프로세스를 종료할 수 있습니다.

kill $arbpid

즉, 여기서 수행하는 작업은 SSH 터널에 임의의 태그(변수 및 해당 값)를 태그 지정하는 것입니다. 그런 다음 이를 종료 대상으로 지정하는 데 사용합니다.


명령과 변수 사이에는 & 기호가 있습니다. Unix 명령 뒤의 단일 앰퍼샌드와 마찬가지로 이는 앰퍼샌드 앞의 명령이 다른 하위 프로세스(백그라운드)에서 실행되도록 하는 반면, 두 번째 명령(이 경우 변수 생성)은 현재 프로세스(포그라운드)에서 실행됩니다. 작업.

답변2

명령줄에서 고유한 문자열을 알고 있는 경우 다음을 사용할 수 있습니다 pkill.

pkill -f "80:localhost:80"

-f플래그를 pkill사용하면 전체 명령줄이 검색됩니다. 플래그가 없으면 단순히 인수를 무시하고 프로세스 이름을 기준으로 일치 항목을 삭제합니다.

답변3

터널을 제공하는 프로세스는 포트 80에서 수신 대기하는 프로세스이므로 lsof또는 netstat또는를 사용하여 ss찾으십시오.

lsof -n -i TCP:80 -sTCP:LISTEN -Fp |sed 's/^p//'
netstat -ntlp | awk '$4 ~ /:80$/ {sub(/\/.*/, "", $7); print $7}'
ss -nlpt 'sport = :80' | awk 'NR>1 {split($6, a, ","); print a[2]}'

연결 멀티플렉싱을 사용하는 경우 동일한 프로세스에서 제공하는 모든 연결이 종료됩니다. 멀티플렉싱을 사용하는 경우 제어 명령을 사용하여 기본 프로세스에 전달을 중지하도록 지시할 수 있습니다 cancel.

ssh UWU@IP -S … -O cancel -L 80:localhost:80

답변4

이를 통해 마지막 SSH 터널 프로세스를 종료할 수 있습니다.

kill $(history | grep ssh | tail -n 2 | head -n 1| cut -d' ' -f 2)

관련 정보