SSH를 통해 PC와 Raspberry Pi 간에 통신하는 코드를 개발 중입니다. PC가 RPi에 대한 SSH 연결을 열면 RPi 화면에 짧은 메시지가 포함된 창이 나타납니다. 열려 있는 SSH 연결이 없으면 창이 자동으로 닫힙니다. 여태까지는 그런대로 잘됐다.
이제 들어오는 모든 SSH 연결을 종료하기 위해 RPi의 해당 창에 버튼을 추가하고 싶습니다. 이를 수행하는 Unix 명령이 있습니까? RPi의 코드가 Python으로 작성되었기 때문에 이를 수행하는 Python 모듈이나 방법도 좋을 것입니다.
내 연구에 따르면 PID를 통해 해당 프로세스를 종료하여 SSH 연결을 종료할 수 있습니다. 모든 SSH 프로세스/연결을 자동으로 종료하고 싶기 때문에 더 간단한 솔루션을 찾고 있습니다.
당신의 도움을 주셔서 감사합니다!
(Raspbian 8에서 실행되는 Raspberry Pi(jessie))
답변1
pkill
/가 있다면 모든 SSH 서버 프로세스를 종료하는 것이 어렵지 않습니다 pgrep
. 그냥 실행하세요 pkill sshd
. 문제는 기본 SSH 데몬을 연결별 데몬에서 분리하고 해당 데몬을 활성 상태로 유지하는 것입니다.
간단한 해결 방법은 서버를 종료하고 나머지 각 연결 프로세스를 종료한 다음 서버를 다시 시작하는 것입니다(예: systemd 시스템에서).
systemctl stop sshd
pkill sshd
systemctl start sshd
sshd
또는 PID 파일에 쓰도록 설정되어 있는 경우 거기에서 기본 프로세스의 PID를 읽고 건너뛸 수 있습니다. systemd가 있는 데비안에서는 /run/sshd.pid
작성 되었지만 /etc/ssh/sshd_config
options 를 사용하여 다른 것으로 설정할 수 있습니다 PidFile
.
pgrep
한 줄에 하나의 PID를 출력하므로 이를 사용하여 grep
기본 PID가 있는 줄을 삭제할 수 있습니다( grep -x
부분 일치를 피하기 위해 사용해야 함).
#!/bin/bash
mainpid=$(cat /run/sshd.pid)
pids=$(pgrep sshd | grep -vxe "$mainpid")
kill $pids
따옴표가 없는 확장은 $pids
문자열을 공백으로 분할하여 kill
PID를 개별적으로 가져옵니다.
root
실제로 연결당 두 개의 프로세스가 있으므로 다음으로 실행해야 합니다 . 하나는 다음 계정으로 실행 root
되고 다른 하나는 로그인한 사용자로 실행됩니다. 또는 sshd
사용자 소유 프로세스 만 종료하려면 pgrep -u username sshd
.