Linux의 Bash에서 소켓에서 데이터를 읽는 방법

게시 됨: 2022-06-28
광 케이블을 통해 흐르는 바이너리 코드.
XYZ/Shutterstock.com

Linux 명령줄을 사용하면 소켓에서 수신 대기하거나 소켓에 연결하여 데이터를 검색할 수 있습니다. 데이터는 텍스트 파일로 캡처할 수 있습니다. 우리는 방법을 보여줍니다.

소켓 클라이언트 및 서버

소켓을 사용하면 네트워크로 연결된 소프트웨어가 통신할 수 있습니다. 그들은 1983년 버클리 캘리포니아 대학교에서 만든 4.2BSD Unix 운영 체제에서 처음 구현되었습니다. System V Unix와 Microsoft Windows에 빠르게 채택되었습니다.

Linux에서 "모든 것이 파일입니다"는 무엇을 의미합니까?
관련 Linux에서 "모든 것이 파일임"은 무엇을 의미합니까?

소켓은 파일 핸들로 처리될 수 있도록 추상화된 소프트웨어 네트워크 연결의 끝점입니다. 이는 "모든 것이 파일이다"라는 일반적인 Unix 및 Linux 설계 원칙에 부합한다는 의미입니다. 네트워크 케이블을 꽂는 벽면의 물리적 소켓을 의미하지 않습니다.

프로그램이 다른 소프트웨어의 소켓에 연결되면 다른 소프트웨어의 클라이언트 로 간주됩니다. 다른 소프트웨어가 연결을 요청할 수 있도록 하는 소프트웨어를 서버 라고 합니다. 이 용어는 IT 세계에서 클라이언트 및 서버의 다른 용도와 독립적으로 사용됩니다. 혼동을 피하기 위해 모호성을 제거하기 위해 소켓 클라이언트소켓 서버 라고도 합니다. 우리는 그들을 클라이언트와 서버라고 부를 것입니다.

소켓은 API(응용 프로그래밍 인터페이스)로 구현되어 소프트웨어 개발자가 코드 내에서 소켓 기능을 호출할 수 있도록 합니다. 프로그래머라면 괜찮지만 그렇지 않다면 어떻게 될까요? 아니면 그럴 수도 있지만 사용 사례가 애플리케이션 작성을 보증하지 않습니까? Linux는 필요에 따라 기본 소켓 서버 및 소켓 클라이언트를 사용하여 다른 소켓 지원 프로세스에서 데이터를 검색하거나 수신할 수 있도록 하는 명령줄 도구를 제공합니다.

관련: API란 무엇이며 개발자는 API를 어떻게 사용합니까?

관계는 결코 쉽지 않다

우리가 사용할 프로그램은 ncncat 입니다. 이 두 유틸리티는 이상한 관계를 가지고 있습니다. nc 프로그램은 nc 보다 훨씬 오래된 ncat 을 다시 작성한 것입니다. 그러나 ncat 도 다시 작성되었으며 이제 nc 가 할 수 없는 몇 가지 작업을 수행할 수 있습니다. 그리고 그 자체가 netcat 이라는 도구의 파생물인 ncat 의 구현이 많이 있습니다. 게다가 대부분의 배포판에서 nc 는 별도의 프로그램이 아니라 ncat 에 대한 심볼릭 링크입니다.

최근 Arch, Manjaro, Fedora 및 Ubuntu 배포판을 확인했습니다. 도구를 설치해야 하는 유일한 도구는 Manjaro였습니다. Manjaro에서 nc 를 얻으려면 netcat 패키지를 설치해야 하지만 ncat 을 얻지 못하고 netcat 을 얻습니다. 그리고 Manjaro에서 ncnetcat 에 대한 심볼릭 링크입니다.

 sudo pacman -S 넷캣 

Manjaro에 netcat 패키지 설치하기

결론은 Manjaro에서 이 기사의 예에서 ncat 을 볼 때 netcat 을 사용한다는 것입니다.

소켓에서 듣기

소프트웨어가 들어오는 소켓 연결을 수신 대기하는 경우 서버 역할을 합니다. 소켓 연결을 통해 들어오는 모든 데이터는 서버에서 수신 한다고 합니다. nc 를 사용하여 이 동작을 매우 쉽게 복제할 수 있습니다. 수신된 모든 데이터는 터미널 창에 표시됩니다.

-l (listen) 옵션을 사용하여 연결을 수신 대기하도록 nc 에 지시해야 하며 연결을 수신할 포트를 지정해야 합니다. 이 nc 인스턴스에 연결을 시도하는 모든 클라이언트 프로그램 또는 프로세스는 동일한 포트를 사용해야 합니다. -p (포트) 옵션을 사용하여 수신 대기할 포트를 nc 에 알려줍니다.

이 명령은 nc 를 소켓 서버로 시작하여 포트 6566에서 연결을 수신 대기합니다.

 nc -l -p 6566 

nc를 소켓 서버로 시작하기

들어오는 연결을 기다리는 동안 nc 는 출력을 생성하지 않습니다. 연결되면 검색된 모든 정보가 터미널 창에 표시됩니다. 여기에서 자신을 "클라이언트 1"로 식별하는 클라이언트 프로그램에 의해 연결이 설정되었습니다.

nc 클라이언트로부터 데이터 수신

nc 가 표시하는 모든 것은 클라이언트에서 수신됩니다. 이 클라이언트는 이름과 시간 및 날짜가 포함된 번호가 매겨진 메시지를 보냅니다.

클라이언트가 연결을 nc 가 종료되고 터미널 프롬프트로 돌아갑니다.

nc는 클라이언트 측에서 연결이 끊긴 후 종료되었습니다.

파일로 데이터 보내기

클라이언트의 데이터를 파일로 캡처하기 위해 리디렉션을 사용하여 nc 에서 파일로 출력을 보낼 수 있습니다. 이 명령어는 수신된 데이터를 "logfile.txt"라는 파일에 저장합니다.

 nc -l -p 6566 > logfile.txt 

nc에서 텍스트 파일로 출력 리디렉션

어떤 출력도 볼 수 없으며(파일로 들어갑니다) 역설적으로 nc 가 종료될 때까지 연결이 발생했는지 알 수 없습니다. 명령 프롬프트로 돌아가면 연결이 발생했고 클라이언트에 의해 종료되었음을 나타냅니다.

less 를 사용하여 "logfile.txt" 파일의 내용을 검토할 수 있습니다.

 적은 logile.txt 

less를 사용하여 텍스트 파일 검사하기

그런 다음 데이터를 스크롤하고 less의 내장 기능을 사용하여 검색할 수 있습니다.

nc에서 캡처한 출력 검토

관련: Linux에서 less 명령을 사용하는 방법

파일 및 터미널 창으로 데이터 보내기

터미널 창에서 스크롤되는 데이터를 보고 동시에 파일로 보내려면 nc 의 출력을 tee 로 파이프하십시오.

 nc -l -p 6566 | 티 logfile.txt 

nc에서 파일과 터미널 창으로 동시에 출력 보내기

다중 연결 수락

다 좋은데 한계가 있습니다. 하나의 연결만 수락할 수 있습니다. 우리는 단일 클라이언트로부터 데이터를 수신하는 것으로 제한됩니다. 또한 해당 클라이언트가 연결을 끊으면 소켓 서버 nc 가 종료됩니다.

다중 연결을 허용해야 하는 경우 ncat 을 사용해야 합니다. 우리는 nc 에서 했던 것처럼 ncat 에게 청취하고 특정 포트를 사용하도록 지시해야 합니다. 그러나 -k (연결 유지) 옵션도 사용합니다. 이것은 ncat 이 마지막 활성 연결이 끊어진 경우에도 계속 실행하고 클라이언트의 연결을 수락하도록 지시합니다.

이것은 ncat 이 "Ctrl-C"로 종료하기로 선택할 때까지 실행됨을 의미합니다. ncat 이 현재 클라이언트에 연결되어 있는지 여부에 관계없이 새 연결이 허용됩니다.

 ncat -k -l -p 6566 

ncat으로 다중 연결 수신 대기

연결할 때 ncat 의 출력에 나타나는 다른 클라이언트의 데이터를 볼 수 있습니다.

ncat에 연결하는 두 번째 및 세 번째 클라이언트

서버에 연결

또한 nc 를 소켓 클라이언트로 사용하고 연결을 수락하고 서버 역할을 하는 다른 프로그램에 연결할 수 있습니다. 이 시나리오에서 nc 는 소켓 클라이언트입니다. 이렇게 하려면 네트워크에서 서버 소프트웨어가 있는 위치를 nc 에 알려야 합니다.

이를 수행하는 한 가지 방법은 IP 주소와 포트 번호를 제공하는 것입니다. 서버가 nc 를 실행하는 동일한 PC에 있는 경우 루프백 IP 주소 127.0.0.1을 사용할 수 있습니다. 서버 주소와 포트 번호를 나타내는 데 사용되는 플래그가 없다는 것은 아닙니다. 우리는 적절한 값을 제공할 뿐입니다.

동일한 PC의 서버에 연결하고 포트 6566을 사용하려면 루프백 IP 주소를 사용할 수 있습니다. 사용할 명령은 다음과 같습니다.

 NC 127.0.0.1 6566 

nc를 소켓 클라이언트로 사용하기

nc 가 서버에서 검색하는 데이터는 터미널 창에서 스크롤됩니다.

nc를 사용하여 소켓 서버에서 데이터 검색

서버 소프트웨어를 실행하는 컴퓨터의 네트워크 이름을 알고 있는 경우 IP 주소 대신 해당 이름을 사용할 수 있습니다.

 NC 술라코 6566 

nc를 사용하여 서버가 실행 중인 PC 이름을 사용하여 소켓 서버에 연결

"Ctrl+C"를 사용하여 연결을 끊습니다.

빠르고 쉬운

ncncat 은 사용자 정의 소켓 핸들러를 작성하고 싶지 않지만 소켓 사용 소스에서 데이터를 수집해야 할 때 청구서에 맞습니다. 출력을 파일로 리디렉션하면 less 를 사용하여 출력을 검토하고 grep 과 같은 유틸리티를 사용하여 파일을 구문 분석할 수 있습니다.

관련: Linux에서 grep 명령을 사용하는 방법