bash 네트워크 리디렉션을 사용하여 경로가 있는 URL에 http 요청을 보내는 방법은 무엇입니까?

bash 네트워크 리디렉션을 사용하여 경로가 있는 URL에 http 요청을 보내는 방법은 무엇입니까?

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/portTCP 소켓 생성 및 연결을 엽니다.

이 외에도 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.wgetperlLWPelinksw3mlynx

관련 정보