bash 자체로 설정된 TCP 연결을 종료하는 방법은 무엇입니까?


17

exec 3<>/dev/tcp/192.168.0.101/6435192.168.0.101:6435와의 TCP 연결을 설정하는 데 사용 했습니다. 그리고 나는 pipe명령 과 함께 몇 가지 메시지를 받았을뿐 아니라 받았습니다 .

이제 TCP 연결을 종료하고 싶습니다. 그러나 ss -anpetbash 자체는 자식 프로세스를 방해하지 않고이 연결을 유지한다는 것을 알 수 있습니다.

신호 9와 15를 bash 프로세스로 보내려고했지만 bash는 스스로를 죽일 수 없습니다.

따라서 사용중인 pt를 종료하지 않고 (루트로 죽이거나 Ctrl + D를 보내지 않고) TCP 연결을 종료 할 수 있습니까?


다른 껍질을 얻어 그 껍질로 죽일 수 bash있습니까?
trysis

3
bash확실히 스스로 죽일 는 있지만 실제로는 당신이하고 싶은 것이 아닙니다!
psmears

@TJM은이 매혹적인 질문을 다른 사람들에게 더 유용하게 만들기 위해 pipe사용중인 명령과 시스템에서 찾을 수없는 명령 에 대해 자세히 설명해 주 시겠습니까? 어떤 패키지가 pipe제공됩니까? /dev/tcp/...연결을 통해 데이터를 보내거나 받기 위해 어떤 (예) 매개 변수를 전달할 수 있습니까? 감사.
arielf 2016 년

@arielf 일반적으로 Computer Science의 초보자이며 sedbot이라는 bash 쉘 스크립트에서 이러한 종류의 사용법을 찾았습니다. Github에서 찾을 수 있습니다. 예,에서 파일을 /dev/tcp찾을 수 없으며 찾을 수도 없습니다 /dev/tcp. 그러나 pipe이런 종류의 파일과 함께 데이터를주고받을 수있는 특별한 사용법으로 보입니다 . /dev/tcp/ip/porttcp 연결 및 /dev/udp/ip/portudp 패키지에 사용한다고 합니다. 영어 실력이 좋지 않기 때문에 제대로 설명하는 방법을 모르겠습니다. 질문을 편집하고 답변을 게시하십시오.
TJM

@TJM 감사합니다. 문제는 pipe당신이 언급 한 명령 에 관한 것이 었습니다 . 나는을 보았다 https://github.com/clsr/sedbot/blob/master/sedbot.bash. 거기에는 pipe명령이 없습니다 . 연결 readmsgsendmsg읽기 / 쓰기의 두 가지 기능을 각각 정의합니다. readmsg사용 IFS= read -r -u 3 -t "$READ_TIMEOUT" line변수로 파일 기술자 (3)로부터 읽어 linesendmsg 사용 echo "$(date +%s.%N) >>> $line" >&4전체 방법, 어쨌든 파일 기술자 (4)에 쓰기이 관계를 설명합니다. " pipe명령"언급은 여전히 ​​독자들에게 미스터리로 남아 있습니다.
arielf 2016 년

답변:


18

이 명령은 파일 디스크립터 3에서 연결을 열었습니다. 따라서 연결을 닫으려면 파일 디스크립터 3을 닫아야합니다.

exec 3<&-

1
이것이 적절한 shutdown(3)호출 close(2)입니까 , 아니면 파일 설명자입니까?
케빈

을 수행 close하지만 shutdown닫기보다 더 적합하지 않습니다. shutdown의 유일한 실제 사용은 양면 소켓의 한쪽 만 닫고 싶을 때입니다.
Patrick

4

2
@Kevin RST는 모든 데이터를 먼저 읽지 않고 소켓을 닫으면 발생합니다. 데이터 끝까지 읽은 후 닫기를 수행하면 닫기가 FIN을 보냅니다.
kasperd

@kasperd : UNIX 소켓 API에서 보류중인 데이터가 있는지 여부를 알 수있는 유일한 방법은 비 블로킹 소켓에서 읽거나을 호출하는 것입니다 .bash는 select()옵션 중 하나를 제공한다고 생각하지 않습니다.
Kevin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.