Bash 네트워크 리디렉션을 사용하면 다음과 같이 간단한 get 메시지를 모든 서버에 보낼 수 있습니다.
:> /dev/tcp/localhost/3306
그러나 저는 경로가 포함된 URL에 요청을 보내는 좀 더 복잡한 작업을 수행하고 싶습니다. 나는 다음을 시도했다:
:> /dev/tcp/url/50070/webhdfs/v1/user/user_name/new_file?user.name=user_name&op=READ
던진 것 :
[1] 69
root@9ec4a825d97d:/# *bash: 50070/webhdfs/v1/user/user_name/new_file?user.name=user_name: Servname not supported for ai_socktype
bash: /dev/tcp/url/50070/webhdfs/v1/user/user_name/new_file?user.name=user_name: Invalid argument
URL(포함 &
)이 인용된 경우에도 마찬가지입니다.
가능하다면 bash net Redirect를 사용하여 경로가 있는 URL로 요청을 보내려면 어떻게 해야 합니까?
답변1
bash
(이 기능이 원래 나온 ksh와 같은) 에서 /dev/tcp/host/port
TCP 소켓 생성 및 연결을 엽니다.
이 외에도 HTTP 요청을 보낼 수 있지만 HTTP 프로토콜에 수동으로 작성해야 합니다. 예를 들면 다음과 같습니다.
exec 3<> /dev/tcp/host/port # connected TCP socket on fd 3
printf >&3 '%s\r\n' 'GET /some/path?query HTTP/1.0' \
'Host: host' \
'Connection: close' \
''
cat <&3 # read the response
exec 3<&- # close the connection
또는 zsh
동등하게:
zmodload zsh/net/tcp
ztcp -d3 host port
printf >&3 '%s\r\n' 'GET /some/path?query HTTP/1.0' \
'Host: host' \
'Connection: close' \
''
cat <&3 # read the response
ztcp -c 3 # close the connection
이는 암호화되지 않은 HTTP이므로 비교적 쉬운 텍스트입니다. HTTPS를 수행하려면 TLS 프로토콜에 바이너리 데이터를 작성해야 합니다. 이는 더 나은 방법(예: socat
또는 ) 으로 TCP 연결 자체를 생성할 수 있는 특수 도구를 사용하지 않고는 거의 불가능합니다. openssl s_client
특별한 도구를 사용하지 않아도 괜찮습니다. ,,,,... 와 같은 HTTP(S) 요청을 수행하도록 설계되었습니다 curl
.wget
perl
LWP
elinks
w3m
lynx