SSH 연결이 끊어진 후에도 프로세스가 계속 실행되도록 하는 방법은 무엇입니까?

SSH 연결이 끊어진 후에도 프로세스가 계속 실행되도록 하는 방법은 무엇입니까?

저는 Linux 기반 라우터를 가지고 있으며 홈 자동화 컨트롤러로 이를 "제어"하려고 합니다. 내 자동화 컨트롤러에서는 "양방향 문자열" 드라이버를 활용하여 리모콘의 버튼을 누른 후 Linux 라우터에 문자열을 보낼 수 있습니다. 전송된 문자열이 라우터에서 실행되기를 원합니다.

라우터에 SSH로 접속하는 동안 다음 명령을 실행하면 이 작업을 수행할 수 있습니다.

$ rm -f /tmp/f; mkfifo /tmp/f
$ cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f

터미널 창을 열어두기만 하면 자동화 컨트롤러는 iptables를 변경하는 문자열을 보낼 수 있습니다.

내가 겪고 있는 문제는 SSH 연결을 닫은 후에도 이것이 지속되지 않는다는 것입니다. SSH 연결이 닫힌 후에도 라우터가 컨트롤러에서 명령을 계속 수신하고 실행하도록 하는 방법이 있습니까?

다음은 제가 보내는 문자열의 예입니다.

iptables%20-I%20INPUT%20-s%20192.168.1.214%20-j%20DROP%0A

기본적으로 나의 최종 목표는 버튼 하나만 눌러 네트워크의 특정 장치에 대한 트래픽을 줄이는 것입니다.

홈 랩 환경이므로 안전은 문제가 되지 않습니다.

답변1

nohupSSH 연결이 닫힌 후에도 명령이 실행되도록 허용 하려고 합니다 (원격 교환원이 전화를 끊습니다.). 과정은 에서와 동일합니다.이 답변:

nohup sh -c 'rm -f /tmp/f ; mkfifo /tmp/f && cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f'

답변2

이 작업을 수행하려면 화면을 사용할 수 있습니다.

https://www.gnu.org/software/screen/

단계는 다음과 같습니다.

  1. SSH 세션을 정상적으로 엽니다.
  2. 설치 화면. (아직 설치하지 않은 경우)
  3. 새로운 스크린 세션을 시작하세요. (스크린을 입력하고 Enter를 누르세요)
  4. 명령을 실행하세요
  5. Ctrl + 'a'를 입력한 다음 Ctrl과 A를 놓은 다음 'd'를 눌러 Screen 세션의 연결을 끊습니다.

세션은 백그라운드에서 계속 실행됩니다. 로그아웃하고 SSH 세션을 완전히 닫아도 마찬가지입니다.

엔터프라이즈 Linux(예: centos)를 사용하는 경우 yum을 사용하여 배포판의 패키지 저장소에서 screen을 설치할 수 있습니다.

yum -y install screen

Debian 기반 운영 체제를 사용하는 경우 다음을 사용해 보십시오.

apt-get install screen

설치가 완료되면 screen을 입력하여 새 스크린 세션을 시작하세요.

[user@localhost ~]$screen

참고: 이렇게 하면 화면이 지워지고 새 세션이 시작됩니다.

다음 명령을 실행하세요.

[user@localhost ~]$ rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f

분할 화면 세션:

Ctrl+a,d

[분리]

netstat를 사용하여 프로세스가 아직 실행 중인지 확인할 수 있습니다. 운영 체제가 이를 지원하는 경우 -p 플래그를 사용하여 실행 중인 프로세스 ID를 표시할 수 있습니다.

-p, --program 각 소켓이 속한 프로그램의 PID와 이름을 표시합니다.

[user@localhost ~]$ netstat -anp | grep 1234
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:1234              0.0.0.0:*                   LISTEN      30599/nc

ps를 사용하여 프로세스가 아직 실행 중임을 표시할 수 있습니다.

[user@localhost~]$ ps -ef | grep [3]1037
500      31037 31019  0 21:45 pts/2    00:00:00 nc -l 127.0.0.1 1234

참고: pid의 첫 번째 숫자 주위에 대괄호 "[]"를 배치하는 것은 grep 프로세스 자체를 표시하지 않기 위한 정규식 트릭입니다. 실제 프로세스가 아닌 본질적으로 불일치입니다.

screen -ls를 사용하여 분리된 screen 세션을 표시할 수 있습니다.

[user@localhost~]$ screen -ls
There is a screen on:
        30562.pts-0.localhost  (Detached)
1 Socket in /var/run/screen/S-user.

screen -r 또는 screen -x와 세션 이름을 사용하여 다시 연결할 수 있습니다.

[user@localhost ~]$ screen -x 30562.pts-0.localhost

관련 정보