다음에 설명된 대로 네트워크 스택에 직접 문자를 보내려고 합니다.이 스레드.
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.c
Bash를 표시하여 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을 사용하여 동일한 실험을 시도하면 하나의 터미널만 예상한 메시지를 받게 됩니다.