로컬 포트 (예 : 8888)에서 수신하는 ssh 터널이 있으며 ssh -R 8888:localhost:80 myuser@myhost
. 이 터널을 닫을 "myhost"의 "myuser"에 대한 스크립트를 작성해야합니다.
스크립트는 "myhost"에서 "myuser"에 의해 실행됩니다. 루트에 의해 실행되지 않으며 sudo도 할 수 없습니다.
한 가지 상처는 lsof 또는 netstat를 사용하여 8888에서 수신하는 프로세스의 PID를 찾은 다음 프로세스를 종료하는 것입니다. 그러나 lsof와 netstat는 모두 sudo가 아닌 PID를 제공하지 않습니다. netstat를 사용하면 -
sudo없이 "PID / 프로그램 이름"대신 얻을 수 있습니다.
루트 권한없이 주어진 포트에서 수신 대기하는 프로세스의 PID를 찾는 방법이 있습니까? 이 포트에서 수신하는 프로세스는 우리와 동일한 사용자로 실행됩니다. 아니면 외부에서 ssh 터널을 닫는 다른 방법이 있습니까?
ssh 이스케이프 시퀀스를 사용하여 연결을 재설정하는 것은 우리가 터널에 있지 않기 때문에 해결책이 아닙니다 . 스크립트는 동일한 사용자가 동일한 호스트에서 터널과 별도로 실행해야합니다.
또한 단순히 실행하는 killall sshd
것은 해결책이 아닙니다.이 연결뿐만 아니라 다른 모든 ssh 연결을 종료하기 때문입니다.
이 질문은 내가 찾은 모든 수락 된 답변에 루트 권한이 필요하거나 모든 ssh 연결을 종료하기 때문에 많은 유사한 질문의 중복이 아닙니다.
호스트 "myhost"는 Ubuntu 12.04.5를 실행합니다.
편집 : @Jakuje가 요청한 토론 요약 :
@Patrick 은 사용자가 완전한 sudo없이 루트 권한으로 스크립트를 실행할 수 있도록 사용 setuid
하거나 수정 하는 방법을 제안했습니다 /etc/sudoers
. 하지만 setuid
스크립트 대신 바이너리를 작성해야하기 때문입니다. 그러나 사용자가 루트 권한으로 스크립트를 실행하도록 허용하면 잠재적 인 보안 위험이 발생할 수 있습니다. 그리고 여전히이 솔루션은 사용자가 루트 액세스 권한이없는 경우를 다루지 않으므로 /etc/sudoers
. @Patrick이 이것을 답변으로 쓰면 확실히 찬성 할 것이지만 아직 수락 표시하지 않을 것입니다.
@EricRenouf는 sshd가 사용자에게 소켓을 chown하므로 사용자가 /proc/*/fd
소켓이있는 프로세스를 찾는 데 사용할 수 없음 을 발견했습니다. 이것이 아마도 lsof도 netstat도 그것을 표시하지 않는 이유 일 것입니다.
더 많은 아이디어 :
@EricRenouf가 발견했듯이 열린 소켓 포트 번호 나 inode로 sshd PID를 얻을 수있는 방법이 없을 것입니다. 그러나이 sshd PID를 찾는 방법이나 연결을 닫도록 지시하는 방법에 다른 트릭이 없는지 궁금합니다. 아마도 sshd와 직접적으로.
예를 들어, sshd 디버그 모드 sshd -d
를 활성화하면 어떤 sshd 프로세스 /var/log/auth.log
가 사용자가 읽을 수 있는 포트에 터널을 연 sshd 프로세스를 기록 합니다. 따라서 스크립트는 로그를 구문 분석하고 거기에서 PID를 찾을 수 있습니다. 그러나 sshd 디버그 모드를 실행하는 것은 좋은 생각이 아닙니다. 실제로 sshd 가 디버그 모드 없이도 열린 터널을 기록 하는 간단한 패치가 있습니다. 하지만 패치 된 sshd를 실행하는 것도 좋은 생각 일지 모르겠습니다.
다른 트릭이 있습니까?
"myhost"에 연결하기위한 사용자 정의 SSH 키를 설정하여 시작하십시오. 그런 다음 "myhost"에서 .ssh / authorized_keys 파일을 편집하여 쉘의 상위 PID가 파일에 기록되도록합니다.
command="echo $PPID > tunnel.pid; bash" ssh-rsa AAA...
보안을 위해 다른 설정을 변경하거나 PID를 작성하고 중단하는 사용자 지정 스크립트를 작성할 수 있습니다. 원칙은 어느 쪽이든 동일합니다.
SSH 세션을 열린 상태로 유지하는 프로세스의 PID가 있으면 스크립팅 문제 일뿐입니다.
kill `cat tunnel.pid`
... 프로세스를 종료하여 SSH 세션을 닫습니다.
당신이 사용할 수 있습니다 -i
받는 플래그를 ssh
연결에 사용할 수있는 개인 키를 지정하는 명령.
편집 : 활성 연결이있는 경우 셸 프로세스를 종료해도 터널이 닫히지 않으므로 부모 SSH 프로세스를 종료합니다.
편집 : 자동화 된 SSH 연결에 대한 나의 첫 번째 경향은 SSH 키를 사용하는 것이지만 동일한 프로세스를 다음과 같이 에뮬레이션 할 수 있습니다.
ssh -R 8888:localhost:80 myuser@myhost 'echo $PPID > tunnel.pid; for ((;;)); do sleep 1; done'
자체 종료시기를 결정하기 위해 다른 기준을 확인하는 스크립트를 대체 할 수도 있습니다. 이것은 아마도 이것을 처리하는 더 깨끗한 방법 일 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다