포트 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)