서버에 텔넷으로 연결한 다음 특정 포트의 pid를 찾고 싶습니다. 그런 다음 해당 PID를 죽입니다.
나는 이것을 시도했다.
ssh -T [email protected] ; "netstat -lnpt ; awk '$4 ~ /:2020$/ {sub(/\/.*/, "", $7); print $7}'"
netstat
이 작업을 수행하려면 명령을 사용해야 합니다.
답변1
당신은 그것을 놓쳤어요파이프 특징( |
대신 ;
) 명령을 사용하세요. 나는 이것을 제안한다:
ssh -t [email protected] "sudo netstat -plnt | grep 2020 | awk '{print \$7}' | sed s+/.*++g | sort -u | xargs kill"
sudo
서버에 설치되어 있고 액세스할 수 있다고 가정합니다 . 내 테스트에 따르면 netstat
옵션을 올바르게 사용 하려면 이 기능이 필요할 수 있습니다 -p
.
나는 awk 스크립트를 너무 복잡하게 만드는 것을 피하기 위해 여기에서 grep
+를 사용하는 것을 선호합니다(제 생각에는).sed
-t
sudo
: 명령을 실행하기 위해 사용자 비밀번호를 입력할 수 있습니다.grep 2020
: 필터 포트 번호awk '{print \$7}'
awk
: 올바른 필드를 선택 합시다sed s+/.*++g
: 삭제/
및 그 뒤의 문자(참고: 간결성을 위해 이+
기호는 여기의 기존 기호를 대체합니다/
)sort -u
: 해당 포트를 사용하는 여러 프로세스가 있는 경우를 대비해(IPv4와 IPv6를 모두 사용하는 경우 발생함)xargs kill
:kill
표준 입력을 인수로 사용하여 호출됩니다.
sudo
종료하려는 프로세스를 다른 사용자가 소유하고 있는 경우 마지막 프로세스에 다음을 추가해야 할 수도 있습니다.sudo xargs kill
예를 들어 변수를 사용할 수도 있습니다(여기서는 명령을 구분하기 위해 세미콜론을 사용하며 파이프는 필요하지 않습니다).
[email protected] ; port=2020 ; ssh -t $server "sudo netstat -plnt | grep $port | awk '{print \$7}' | sed s+/.*++g | sort -u | xargs kill"
답변2
당신은 목표에 충분히 가까워졌습니다. 하지만 아직 부족한 것이 있습니다.
- 호스트 IP 뒤에는 세미콜론이 필요 없으며, 원격 명령은 IP 바로 뒤에 와야 합니다. 따라서 세미콜론을 제거하십시오.
- awk 앞의 다른 세미콜론을 파이프 기호로 바꾸십시오
|
. 이렇게 하면 netstat 출력이 awk로 이동합니다. - 모든 달러 기호는 백슬래시로 이스케이프해야 합니다. 그렇지 않으면 로컬 시스템에서 평가됩니다.
위 사항을 완료하면 인쇄된 PID(있는 경우)를 받게 됩니다. 그런 다음 해당 PID를 kill 명령에 전달해야 합니다. 여기에서 가장 쉬운 것 같으므로 xargs Kill을 사용하는 것이 좋습니다. 이 PID는 kill 명령에 의해 승인됩니다.
따라서 최종 버전은 다음과 같습니다.
ssh -T [email protected] "netstat -lnpt | awk '\$4 ~ /:2020$/ {sub(/\/.*/, "", \$7); print \$7}') | xargs kill"
가장 좋은 모습은 아니지만 귀하의 접근 방식이 저에게 효과적입니다.