Bash: 데이터를 네트워크에 직접 에코하려고 할 때 권한이 거부되었습니다.

Bash: 데이터를 네트워크에 직접 에코하려고 할 때 권한이 거부되었습니다.

다음에 설명된 대로 네트워크 스택에 직접 문자를 보내려고 합니다.이 스레드.

CygWin(Windows)에서는 프로세스가 제대로 실행되지만 Ubuntu v14.04에서는 동일한 줄이 실패합니다.

luis@Zarzamoro:~$ sudo echo -e "\xff">/dev/udp/255.255.255.255/4000
-bash: connect: Permission denied
-bash: /dev/udp/255.255.255.255/4000: Permission denied

PC 버전의 Ubuntu에서 테스트되었습니다.

luis@Lamborghini:~$ bash --version
GNU bash, versión 4.3.11(1)-release (i686-pc-linux-gnu)

RaspBerry Pi 2용 Ubuntu:

luis@Zarzamoro:~$ bash --version
GNU bash, version 4.3.11(1)-release (arm-unknown-linux-gnueabihf)

함으로써NIC로 직접 문자 전송상당히 최신 버전의 Bash를 사용하는 일부 라우터 또는 임베디드 장치(예: NAS)의 경우 대신 netcat 또는 socat을 사용하는 것이 유용할 수 있지만 추가 도구 설치를 허용하지 않습니다(또는 구현하기 어렵습니다).

왜 이런 일이 발생하며 어떻게 해결할 수 있나요?

또한 테스트한 내용:

luis@Zarzamoro:~$ sudo bash -c 'echo -e "\xff" >/dev/udp/255.255.255.255/4000'
bash: connect: Permission denied
bash: /dev/udp/255.255.255.255/4000: Permission denied

그리고:

luis@Zarzamoro:~$ echo -e "\xff" | sudo tee /dev/udp/255.255.255.255/4000
tee: /dev/udp/255.255.255.255/4000: No such file or directory
luis@Zarzamoro:~$

@Emeric의 새로운 정보: 이 문제는 브로드캐스트 주소에만 영향을 미치는 것으로 보입니다.

luis@Zarzamoro:~$ sudo bash -c 'echo -e "\xff" >/dev/udp/192.168.11.255/4000'
bash: connect: Permission denied
bash: /dev/udp/192.168.11.255/4000: Permission denied
luis@Zarzamoro:~$ sudo bash -c 'echo -e "\xff" >/dev/udp/192.168.11.1/4000'
luis@Zarzamoro:~$

Bash v4.2.37을 사용하는 Kali Linux v1.1.0에서도 테스트가 실패했습니다.

luis@Lamborghini:~$ sudo lsb_release -a
No LSB modules are available.
Distributor ID: Kali
Description:    Kali GNU/Linux 1.1.0
Release:        1.1.0
Codename:       moto
luis@Lamborghini:~$ bash --version
GNU bash, versión 4.2.37(1)-release (i486-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.

luis@Lamborghini:~$ sudo bash -c 'echo -e "\xff" >/dev/udp/192.168.11.255/4000'
bash: connect: Permiso denegado
bash: /dev/udp/192.168.11.255/4000: Permiso denegado

Conceptronic CH3SNAS(2개의 하드 드라이브가 있는 NAS)가 설치된 Bash에서의 테스트도 실패했습니다.재미있는 플러그:

sh-4.1# bash --version
GNU bash, version 4.1.11(2)-release (arm-ffp-linux-uclibc)
sh-4.1# su
sh-4.1# echo -e "\xff" > /dev/udp/255.255.255.255/4000
sh: connect: Permission denied
sh: /dev/udp/255.255.255.255/4000: Permission denied

답변1

편집됨사용 사례에 대한 OP의 설명은 다음과 같습니다.

최신 공식 버전 bash(현재 4.3.30) 을 사용하면 이 작업을 수행할 수 없습니다.이 페이지). lib/sh/netopen.cBash를 표시하여 UDP 소켓( SOCK_DGRAM)을 연 다음 IP 주소를 보지 않고 직접 연결을 시도하여 특정 소켓 옵션을 설정하는 것이 적합한지 확인합니다(귀하의 경우 SO_BROADCAST).

가장 좋은 방법은 패치를 현재 관리자나 적절한 메일링 리스트에 보내고 bash공식 릴리스에 포함시킨 다음 NAS의 최신 버전의 bash가 해당 기능을 포함하는 최신 버전으로 업데이트될 때까지 기다리는 것입니다.

짧은 대답: bash지금은 그렇습니다아니요해.

이전 답변:
다음으로 방향을 바꿔야 합니다 socat.

$ echo -e "\xff" | socat - UDP-DATAGRAM:255.255.255.255:4000,broadcast

내장 소켓 구현을 /dev/udp사용하여 작성되었습니다 . bash내가 아는 한, 이 구현에서는 UDP 데이터그램을 브로드캐스트 주소로 보내는 것을 허용하지 않습니다. 왜냐하면 SO_BROADCAST보내기 전에 소켓에 ​​플래그를 설정해야 하기 때문입니다.

다음을 사용하는 netcat것은 UDP 브로드캐스트를 거부하므로 옵션이 아닙니다.

$ echo -e "\xff" | nc -u 255.255.255.255 4000
nc: netcat.c:573: main: Assertion `connect_sock.proto != NETCAT_PROTO_UDP' failed.
Aborted (core dumped)

편집하다:

때때로 netcat에는 -b브로드캐스트 주소를 활성화하는 플래그가 있습니다. 바라보다이 답변Ubuntu의 UDP 브로드캐스트 정보.

답변2

두 개의 터미널을 열고 다음을 입력하세요.

CNC-ul 55555

세 번째 터미널을 열고 필요한 경우 socat을 설치한 후 다음을 입력하세요. (netcat이 브로드캐스팅을 지원하지 않는지 묻는 경우)

echo -n "테스트" | socat -udp 데이터그램: 127.255.255.255:55555, 브로드캐스트

두 터미널 모두 메시지를 수신하는 것을 볼 수 있습니다.

127.0.0.1을 사용하여 동일한 실험을 시도하면 하나의 터미널만 예상한 메시지를 받게 됩니다.

관련 정보