저는 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
nohup
SSH 연결이 닫힌 후에도 명령이 실행되도록 허용 하려고 합니다 (원격 교환원이 전화를 끊습니다.). 과정은 에서와 동일합니다.이 답변:
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/
단계는 다음과 같습니다.
- SSH 세션을 정상적으로 엽니다.
- 설치 화면. (아직 설치하지 않은 경우)
- 새로운 스크린 세션을 시작하세요. (스크린을 입력하고 Enter를 누르세요)
- 명령을 실행하세요
- 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