나는 터미널과 유사하지만 http를 통해 서버와 "대화"할 수 있는 것을 찾고 있습니다. 이 같은:
$ connect http://myserver.com
Welcome to myserver.com
Options
A - Fribble the obsticator
B - List Frogits
C - Show the log
Q - Quit
$ A
Obsticator fribbled
blah blah
blah
$ C
Log file
...
$ Q
Bye
나는 http를 통해 실제 Unix 명령줄을 터널링하는 영리한 방법을 찾고 있지 않습니다. 텍스트 모드 브라우저도 아닙니다. 이는 이러한 방식으로 액세스되고 있음을 알고 HTML이 아닌 일반 텍스트를 반환하는 간단한 사용자 정의 서버와 통신합니다.
하지만 다른 프로토콜이 아닌 http를 통해 이루어져야 합니다. 컬 같은 명령을 하고 싶지 않아요
$ curl http://myserver.com?opt=A
URL을 한 번 캡처할 수 있어야 합니다. 명령을 CGI 매개변수로 변환하는 작업은 사용자에게 투명해야 합니다.
업데이트: 또한 단일 연결에서 이 대화를 열어 두어도 괜찮습니다. 전송 및 수신된 각 명령은 별도의 http 요청이 될 수 있습니다. (사실 이렇게 하면 서버가 더 단순해지기 때문에 더 좋습니다)
업데이트 2: 제가 이것을 원하는 이유는 Python Hug(http://www.hug.rest/) 그러나 브라우저 대신 명령줄에서 직접 일부 작업에 액세스하는 것이 편리할 것입니다.
복잡성을 추가하는 대신(서버에서 다른 프로토콜을 사용하고 별도의 상호작용 리스너를 관리함) 간단한 명령줄 클라이언트를 사용하여 표준 http 요청을 통해 API와 상호작용할 수 있습니다.
그럼 그런 것도 있나요? (자리에 앉아 글을 쓰기 전에.)
답변1
텔넷을 사용하여 서버에 연결할 수 있습니다. 여기서는 HTTP 사양의 제약 조건 내에서 그렇게 해야 한다는 것을 알고 있습니다(여기서는 웹 서버를 사용하여 통신하려고 한다고 가정합니다).
예를 들어 사양 https://www.w3.org/Protocols/rfc2616/rfc2616.txt
상태:
원본 서버는 다음 예외를 제외하고 모든 응답에 날짜 헤더 필드를 포함해야 합니다.
이것은 텔넷을 통해 웹 서버에 대한 "대화"의 터미널 출력입니다.
네트워크 서버 구성에 따라 TCP 연결이 활성 상태로 유지되는 기간, 즉 서버가 "비활성"으로 인해 TCP 연결을 끊기 전에 올바른 형식의 HTTP 요청을 입력해야 하는 기간이 결정됩니다. 하지만 이는 구성 가능합니다.
시간 초과 전에 각 요청을 입력하면 실제로 많은 HTTP 요청과 응답이 단일 연속 TCP 연결을 통해 전송됩니다.
% telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1 <---- this in where you type characters "interactively"
Host: localhost <---- this in where you type characters "interactively"
<-- per the HTTP specification this has to be an emtpy line
to tell the server you are done with your "message"
HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Sat, 17 Sep 2016 07:38:08 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
45d
<html>
[truncated ... ]
</html>
0
GET / HTTP/1.1 <-- now you are back at prompt
Host: localhost Note: you need to enter the `Host` header if you are talking
to a webserver
HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Sat, 17 Sep 2016 07:41:07 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
45d
<html>
[truncated]
분명히 더 명확한 "대화"를 얻으려면 요청을 처리하는 웹 서버나 애플리케이션의 출력을 정리해야 합니다.
nginx는 ttp_core_module
다음을 사용하여 기본 유형을 관리합니다.
http://nginx.org/en/docs/http/ngx_http_core_module.html#default_type
제목을 추가하려면 다음을 사용할 수 있습니다.http_headers_module
http://nginx.org/en/docs/http/ngx_http_headers_module.html
답변2
백엔드 로 사용해도 괜찮고 curl
매번 전체 URL을 입력하고 싶지 않다면 curl
다음과 같은 루프에서 실행할 수 있습니다.
read -p "Server name: " s && curl -fs "$s" && while true; do read -p "$ " x && curl -fs "$s?opt=${x^^}" || break; done
alias
매번 전체 내용을 입력하거나 붙여넣고 싶지 않은 경우에도 좋습니다.
거기에는 오류 검사가 많지 않습니다. 신뢰할 수 있는 서버와 통신하는 간단한 방법을 원하고 자신의 스크립트를 해킹하려고 시도하고 싶지 않은 경우에는 아마도 괜찮을 것입니다. 고급 스크립트는 서버 이름을 확인하거나 반환된 웹 페이지를 표시하기 전에 구문 분석을 시도할 수 있지만 둘 다 신뢰할 수 없는 입력을 방지해야 합니다.
나두 가지 옵션이 추가되었습니다도착하다 curl
:
-f
21
웹페이지가400
이상의 오류를 반환하면 오류 코드와 함께 종료됩니다(quit
명령에 유용함).-s
자동 모드에서는 각 명령에 대한 연결 데이터가 표시되지 않습니다.
그 외에도 각 쿼리에 대해 서버가 출력하는 내용을 정확하게 볼 수 있습니다.
답변3
좋아요
@drewbenn의 답변에서 영감을 받아 요청을 사용하여 Python으로 직접 작성했습니다.http://requests.readthedocs.io/en/master/) 도서관:
import requests
import sys
url = sys.argv[1]
print "Connecting ", url
r = requests.get(url)
print r.text
flag = True
while flag :
s = raw_input()
data = {"opt": s}
r = requests.get(url, params=data)
print r.text
답변4
특히 HATEOAS 다양한 RESTful HTTP API인 경우 Spring의 Rest-shell을 사용할 수 있습니다.
https://github.com/spring-projects/rest-shell
사용 예:
http://localhost:8080:> discover
rel href
========================================================
address http://localhost:8080/address
family http://localhost:8080/family
people http://localhost:8080/person
profile http://localhost:8080/profile
http://localhost:8080:> follow people
http://localhost:8080/person:> list
rel href
===================================================
people.Person http://localhost:8080/person/1
people.Person http://localhost:8080/person/2
people.search http://localhost:8080/person/search
http://localhost:8080/person:> get 1
...