Linux의 Bash에서 소켓에서 데이터를 읽는 방법
게시 됨: 2022-06-28
Linux 명령줄을 사용하면 소켓에서 수신 대기하거나 소켓에 연결하여 데이터를 검색할 수 있습니다. 데이터는 텍스트 파일로 캡처할 수 있습니다. 우리는 방법을 보여줍니다.
소켓 클라이언트 및 서버
소켓을 사용하면 네트워크로 연결된 소프트웨어가 통신할 수 있습니다. 그들은 1983년 버클리 캘리포니아 대학교에서 만든 4.2BSD Unix 운영 체제에서 처음 구현되었습니다. System V Unix와 Microsoft Windows에 빠르게 채택되었습니다.
소켓은 파일 핸들로 처리될 수 있도록 추상화된 소프트웨어 네트워크 연결의 끝점입니다. 이는 "모든 것이 파일이다"라는 일반적인 Unix 및 Linux 설계 원칙에 부합한다는 의미입니다. 네트워크 케이블을 꽂는 벽면의 물리적 소켓을 의미하지 않습니다.
프로그램이 다른 소프트웨어의 소켓에 연결되면 다른 소프트웨어의 클라이언트 로 간주됩니다. 다른 소프트웨어가 연결을 요청할 수 있도록 하는 소프트웨어를 서버 라고 합니다. 이 용어는 IT 세계에서 클라이언트 및 서버의 다른 용도와 독립적으로 사용됩니다. 혼동을 피하기 위해 모호성을 제거하기 위해 소켓 클라이언트 및 소켓 서버 라고도 합니다. 우리는 그들을 클라이언트와 서버라고 부를 것입니다.
소켓은 API(응용 프로그래밍 인터페이스)로 구현되어 소프트웨어 개발자가 코드 내에서 소켓 기능을 호출할 수 있도록 합니다. 프로그래머라면 괜찮지만 그렇지 않다면 어떻게 될까요? 아니면 그럴 수도 있지만 사용 사례가 애플리케이션 작성을 보증하지 않습니까? Linux는 필요에 따라 기본 소켓 서버 및 소켓 클라이언트를 사용하여 다른 소켓 지원 프로세스에서 데이터를 검색하거나 수신할 수 있도록 하는 명령줄 도구를 제공합니다.
관련: API란 무엇이며 개발자는 API를 어떻게 사용합니까?
관계는 결코 쉽지 않다
우리가 사용할 프로그램은 nc
와 ncat
입니다. 이 두 유틸리티는 이상한 관계를 가지고 있습니다. nc
프로그램은 nc
보다 훨씬 오래된 ncat
을 다시 작성한 것입니다. 그러나 ncat
도 다시 작성되었으며 이제 nc
가 할 수 없는 몇 가지 작업을 수행할 수 있습니다. 그리고 그 자체가 netcat
이라는 도구의 파생물인 ncat
의 구현이 많이 있습니다. 게다가 대부분의 배포판에서 nc
는 별도의 프로그램이 아니라 ncat
에 대한 심볼릭 링크입니다.
최근 Arch, Manjaro, Fedora 및 Ubuntu 배포판을 확인했습니다. 도구를 설치해야 하는 유일한 도구는 Manjaro였습니다. Manjaro에서 nc
를 얻으려면 netcat
패키지를 설치해야 하지만 ncat
을 얻지 못하고 netcat
을 얻습니다. 그리고 Manjaro에서 nc
는 netcat
에 대한 심볼릭 링크입니다.
sudo pacman -S 넷캣
결론은 Manjaro에서 이 기사의 예에서 ncat
을 볼 때 netcat
을 사용한다는 것입니다.
소켓에서 듣기
소프트웨어가 들어오는 소켓 연결을 수신 대기하는 경우 서버 역할을 합니다. 소켓 연결을 통해 들어오는 모든 데이터는 서버에서 수신 한다고 합니다. nc
를 사용하여 이 동작을 매우 쉽게 복제할 수 있습니다. 수신된 모든 데이터는 터미널 창에 표시됩니다.
-l
(listen) 옵션을 사용하여 연결을 수신 대기하도록 nc
에 지시해야 하며 연결을 수신할 포트를 지정해야 합니다. 이 nc
인스턴스에 연결을 시도하는 모든 클라이언트 프로그램 또는 프로세스는 동일한 포트를 사용해야 합니다. -p
(포트) 옵션을 사용하여 수신 대기할 포트를 nc
에 알려줍니다.
이 명령은 nc
를 소켓 서버로 시작하여 포트 6566에서 연결을 수신 대기합니다.
nc -l -p 6566
들어오는 연결을 기다리는 동안 nc
는 출력을 생성하지 않습니다. 연결되면 검색된 모든 정보가 터미널 창에 표시됩니다. 여기에서 자신을 "클라이언트 1"로 식별하는 클라이언트 프로그램에 의해 연결이 설정되었습니다.
nc
가 표시하는 모든 것은 클라이언트에서 수신됩니다. 이 클라이언트는 이름과 시간 및 날짜가 포함된 번호가 매겨진 메시지를 보냅니다.
클라이언트가 연결을 nc
가 종료되고 터미널 프롬프트로 돌아갑니다.

파일로 데이터 보내기
클라이언트의 데이터를 파일로 캡처하기 위해 리디렉션을 사용하여 nc
에서 파일로 출력을 보낼 수 있습니다. 이 명령어는 수신된 데이터를 "logfile.txt"라는 파일에 저장합니다.
nc -l -p 6566 > logfile.txt
어떤 출력도 볼 수 없으며(파일로 들어갑니다) 역설적으로 nc
가 종료될 때까지 연결이 발생했는지 알 수 없습니다. 명령 프롬프트로 돌아가면 연결이 발생했고 클라이언트에 의해 종료되었음을 나타냅니다.
less
를 사용하여 "logfile.txt" 파일의 내용을 검토할 수 있습니다.
적은 logile.txt
그런 다음 데이터를 스크롤하고 less의 내장 기능을 사용하여 검색할 수 있습니다.
관련: Linux에서 less 명령을 사용하는 방법
파일 및 터미널 창으로 데이터 보내기
터미널 창에서 스크롤되는 데이터를 보고 동시에 파일로 보내려면 nc
의 출력을 tee
로 파이프하십시오.
nc -l -p 6566 | 티 logfile.txt
다중 연결 수락
다 좋은데 한계가 있습니다. 하나의 연결만 수락할 수 있습니다. 우리는 단일 클라이언트로부터 데이터를 수신하는 것으로 제한됩니다. 또한 해당 클라이언트가 연결을 끊으면 소켓 서버 nc
가 종료됩니다.
다중 연결을 허용해야 하는 경우 ncat
을 사용해야 합니다. 우리는 nc
에서 했던 것처럼 ncat
에게 청취하고 특정 포트를 사용하도록 지시해야 합니다. 그러나 -k
(연결 유지) 옵션도 사용합니다. 이것은 ncat
이 마지막 활성 연결이 끊어진 경우에도 계속 실행하고 클라이언트의 연결을 수락하도록 지시합니다.
이것은 ncat
이 "Ctrl-C"로 종료하기로 선택할 때까지 실행됨을 의미합니다. ncat
이 현재 클라이언트에 연결되어 있는지 여부에 관계없이 새 연결이 허용됩니다.
ncat -k -l -p 6566
연결할 때 ncat
의 출력에 나타나는 다른 클라이언트의 데이터를 볼 수 있습니다.
서버에 연결
또한 nc
를 소켓 클라이언트로 사용하고 연결을 수락하고 서버 역할을 하는 다른 프로그램에 연결할 수 있습니다. 이 시나리오에서 nc
는 소켓 클라이언트입니다. 이렇게 하려면 네트워크에서 서버 소프트웨어가 있는 위치를 nc
에 알려야 합니다.
이를 수행하는 한 가지 방법은 IP 주소와 포트 번호를 제공하는 것입니다. 서버가 nc
를 실행하는 동일한 PC에 있는 경우 루프백 IP 주소 127.0.0.1을 사용할 수 있습니다. 서버 주소와 포트 번호를 나타내는 데 사용되는 플래그가 없다는 것은 아닙니다. 우리는 적절한 값을 제공할 뿐입니다.
동일한 PC의 서버에 연결하고 포트 6566을 사용하려면 루프백 IP 주소를 사용할 수 있습니다. 사용할 명령은 다음과 같습니다.
NC 127.0.0.1 6566
nc
가 서버에서 검색하는 데이터는 터미널 창에서 스크롤됩니다.
서버 소프트웨어를 실행하는 컴퓨터의 네트워크 이름을 알고 있는 경우 IP 주소 대신 해당 이름을 사용할 수 있습니다.
NC 술라코 6566
"Ctrl+C"를 사용하여 연결을 끊습니다.
빠르고 쉬운
nc
및 ncat
은 사용자 정의 소켓 핸들러를 작성하고 싶지 않지만 소켓 사용 소스에서 데이터를 수집해야 할 때 청구서에 맞습니다. 출력을 파일로 리디렉션하면 less
를 사용하여 출력을 검토하고 grep
과 같은 유틸리티를 사용하여 파일을 구문 분석할 수 있습니다.
관련: Linux에서 grep 명령을 사용하는 방법