SSH를 통해 원격 서버에 연결하고 특정 PID를 찾아 종료합니다.

SSH를 통해 원격 서버에 연결하고 특정 PID를 찾아 종료합니다.

서버에 텔넷으로 연결한 다음 특정 포트의 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

  • -tsudo: 명령을 실행하기 위해 사용자 비밀번호를 입력할 수 있습니다.
  • 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

당신은 목표에 충분히 가까워졌습니다. 하지만 아직 부족한 것이 있습니다.

  1. 호스트 IP 뒤에는 세미콜론이 필요 없으며, 원격 명령은 IP 바로 뒤에 와야 합니다. 따라서 세미콜론을 제거하십시오.
  2. awk 앞의 다른 세미콜론을 파이프 기호로 바꾸십시오 |. 이렇게 하면 netstat 출력이 awk로 이동합니다.
  3. 모든 달러 기호는 백슬래시로 이스케이프해야 합니다. 그렇지 않으면 로컬 시스템에서 평가됩니다.

위 사항을 완료하면 인쇄된 PID(있는 경우)를 받게 됩니다. 그런 다음 해당 PID를 kill 명령에 전달해야 합니다. 여기에서 가장 쉬운 것 같으므로 xargs Kill을 사용하는 것이 좋습니다. 이 PID는 kill 명령에 의해 승인됩니다.

따라서 최종 버전은 다음과 같습니다.

ssh -T [email protected] "netstat -lnpt | awk '\$4 ~ /:2020$/ {sub(/\/.*/, "", \$7); print \$7}') | xargs kill"

가장 좋은 모습은 아니지만 귀하의 접근 방식이 저에게 효과적입니다.

관련 정보