มีวิธีใช้ curl แบบโต้ตอบหรือไม่? หรือมีเปลือกขด / wget แบบโต้ตอบ?


9

ลองนึกภาพบางสิ่งเช่นนี้:

$ curlsh http://www.example.org
> GET /foo/bar/bam
...output here...
> POST /thing/pool ...
... result here.... 

มีเครื่องมือที่ให้ฉันทำอย่างนั้นหรือไม่?

คำตอบ:


8

ในระบบ Linux / Unix หลายระบบ pseudocode ของคุณจะทำงานในเชลล์ใด ๆ แม้ว่าเส้นทางของคุณควรเป็น URL เต็ม

ยกตัวอย่างเช่นในระบบ Debian ตามแพคเกจlibwww-perlติดตั้งสาม symlinks จะ LWP คำขอซึ่งเรียกว่า/usr/bin/GET, และ/usr/bin/HEAD /usr/bin/POSTสิ่งเหล่านี้ทำในสิ่งที่คุณคาดหวัง perl-libwww-perlแพ็คเกจล่าสุดของ OpenSuse ละเว้น symlink (ซึ่งอาจเป็นจุดบกพร่อง) ดังนั้นคุณจะต้องสร้างมันเองหรือใช้lwp-requestโดยตรง โดยทั่วไปและเป็นเวลาหลายปีเป็นข้อสันนิษฐานที่ค่อนข้างปลอดภัยว่า GET, HEAD และ POST สามารถใช้งานได้กับระบบยูนิกซ์

แน่นอนว่าคุณสามารถใช้curlงานเหล่านี้ได้ทั้งหมดดังนั้นบางทีฉันอาจไม่เข้าใจว่าทำไมคุณถึงรู้สึกว่าเชลล์บรรทัดคำสั่งเช่น bash ไม่ใช่แบบโต้ตอบ


8

ขอบคุณสำหรับคำตอบ

หลังจาก googling ไปรอบ ๆ ฉันพบว่าrestyซึ่งเป็น wrapper เชลล์สคริปต์รอบ ๆเครื่องมือcurl นี่คือสิ่งที่ฉันต้องการจริงๆ มันคือเชลล์สคริปต์จำนวน 155 บรรทัดและเมื่อฉันรันมันฉันจะได้รับฟังก์ชั่นสำหรับ GET, PUT, POST, DELETE และ OPTIONS ฟังก์ชั่นเหล่านี้เป็นเพียงการล้อมรอบโปรแกรม curl ที่พบในเส้นทางของฉัน

มันใช้งานได้เช่นนี้บน MacOSX bash:

$ . resty

$ resty https://api.example.org
https://api.myhost.com*

$ GET /v1/o/orgname -u myusername:password
{
  "createdAt" : 1347007133508,
  "createdBy" : "admin",
  "displayName" : "orgname",
  "environments" : [ "test", "prod" ],
  "lastModifiedAt" : 1347007133508,
  "lastModifiedBy" : "admin",
  "name" : "orgname",
  "properties" : {
    "propertyList" : [ ... ]
  },
}
$

บรรทัดแรกมีเพียงรันคำสั่งในเชลล์ปัจจุบัน

บรรทัดถัดไปคำสั่ง "resty" ตั้งค่าฐาน URL หลังจากนั้นมีการเรียก GET, PUT, POST ... โดยอ้างอิงฐานนั้น ฉันแสดงตัวอย่างที่ปล่อย JSON ที่สวยงาม ฉันคิดว่าถ้าเซิร์ฟเวอร์ของคุณปล่อย JSON ขนาดเล็กคุณสามารถพิมพ์ได้ด้วยสคริปต์ภายนอกโดยการส่งออกไปป์ไลน์

มีการสนับสนุนสำหรับการตั้งค่าตามโฮสต์ สมมติว่าโฮสต์เป้าหมายของคุณคือ api.example.org หยุดแฟ้มที่เรียกว่า ~ / .resty / api.example.org และใส่เข้าไปในนั้นบรรทัดที่ระบุอาร์กิวเมนต์ที่ควรถูกส่งผ่านไปยังทุกการเรียก curl ไปยังโฮสต์ด้วยชื่อนั้น แต่ละกริยา http ได้รับบรรทัดของตนเอง ดังนั้นการแทรกเนื้อหานี้ในไฟล์:

GET -u myusername:mypassword --write-out "\nStatus = %{http_code}\n"

... หมายความว่าทุกครั้งที่ฉันทำ GET เมื่อ api.example.org เป็นชื่อโฮสต์ฐานคำสั่ง curl จะใช้-uและ--write-outargs แสดงโดยปริยาย (-u สำหรับการรับรองความถูกต้องขั้นพื้นฐาน)

เป็นอีกตัวอย่างหนึ่งคุณสามารถระบุส่วนหัวยอมรับในไฟล์นั้นเพื่อให้คุณร้องขอ XML:

GET --header "Accept: application/xml"

arg บรรทัดคำสั่งใด ๆ ที่สนับสนุนได้รับการสนับสนุนในไฟล์การตั้งค่าที่ Curl args สำหรับ host + verb tuple จำเป็นต้องอยู่บนบรรทัดเดียวในไฟล์ preferences

มีประโยชน์


6

lftp:

$ lftp http://repo.xplico.org/pool/
cd ok, cwd=/pool
lftp repo.xplico.org:/pool> ls
drwxr-xr-x  --  /
drwxr-xr-x            -  2012-02-13 09:48  main
lftp repo.xplico.org:/pool> cd main
lftp repo.xplico.org:/pool/main> ls
drwxr-xr-x  --  ..
drwxr-xr-x            -  2012-02-13 09:48  x

รายชื่อไดเรกทอรีใช้งานได้กับเว็บไซต์ที่ส่งดัชนีไดเรกทอรีเท่านั้น แต่แม้ว่าพวกเขาจะไม่ได้คุณยังสามารถใช้getคำสั่งเพื่อรับไฟล์แต่ละไฟล์


getคำสั่งจะดาวน์โหลดไฟล์catออกจะไฟล์ไปยังหน้าจอ ในการรับ http postคุณสามารถใช้สิ่งquote post post.php x=1&y=zต่อไปนี้:
donothingsuccessfully

5

คุณสามารถใช้Netcat

netcat เป็นยูทิลิตี้ยูนิกซ์ง่าย ๆ ที่อ่านและเขียนข้อมูลผ่านการเชื่อมต่อเน็ตเวิร์กโดยใช้โปรโตคอล TCP หรือ UDP

นี่คือตัวอย่างเพื่อดึงหน้าแรกของ VLC

nc www.videolan.org 80
GET http://www.videolan.org/vlc/ HTTP/1.0

HTTP/1.1 200 OK
Date: Tue, 16 Oct 2012 07:34:48 GMT
Server: Apache/2.2.16 (Debian)
Content-Location: index.html
[…]

ส่วนที่เหลือของ HTML จะถูกส่งออกไปยังคอนโซล หมายเหตุ: คุณต้องพิมพ์Return ครั้งที่สองHTTP/1.0หลังจากที่


4
เพื่อนคุณไม่ยอมใครง่ายๆ Netcat ทำ HTTP หรือไม่ อุ๊ย! ฉันหวังว่าจะมีบางอย่างที่มีเสียงระฆังและนกหวีดเพิ่ม
Cheeso

1
ฉันไม่รู้เกี่ยวกับสิ่งที่คุณตามมา อย่างน้อยก็ทำในสิ่งที่คุณระบุไว้ในคำถามซึ่งไม่มีรายละเอียดมากนัก Netcat เป็นเครื่องมือที่มีประโยชน์มากสำหรับการท่องเว็บอาจไม่เหมาะ ขึ้นอยู่กับความต้องการของคุณ
Marco

ไม่มีความผิดฉันแค่พูดมันคงจะดีถ้าเครื่องมือนั้นฉลาดกว่านี้อีกเล็กน้อย เช่นถ้ามีวิธีตั้งค่าส่วนหัว HTTP ก็จะส่ง หรือถ้าฉันไม่ต้องพิมพ์ "HTTP / 1.1" สำหรับแต่ละคำขอ หรืออื่น ๆ
Cheeso

1

คุณสามารถใช้การโต้ตอบshellsทั้งกับpythonหรือperl:

ในภาษา Perl

$ perl -MWWW::Mechanize::Shell -eshell
(no url)> get http://cnn.com
Retrieving http://cnn.com(200)
http://edition.cnn.com/> title
CNN.com International - Breaking, World, Business, Sports, Entertainment and Video News
http://edition.cnn.com/> content
(...)

ดูperldoc WWW::Mechanize::Shellหรือhttp://search.cpan.org/~corion/WWW-Mechanize-Shell-0.52/lib/WWW/Mechanize/Shell.pm


ในPython :

$ python -i -c 'import mechanize; br = mechanize.Browser(factory=mechanize.RobustFactory())'
>>> br.open("http://xkcd.com/")
<response_seek_wrapper at 0x2824a28 whose wrapped object = <closeable_response at 0x27c2710 whose fp = <socket._fileobject object at 0x27be3d0>>>
>>> br.title()
'xkcd: Identity'
>>> print br.response().read()
(...)

ดูhttp://wwwsearch.sourceforge.net/mechanize/


1

ใช่คุณสามารถใช้ตัวเลือก "--config":

ระบุชื่อไฟล์เป็น -K, --config เป็น '-' เพื่อให้ curl อ่านไฟล์จาก stdin

ตัวอย่าง:

$ curl -K-
url https://github.com/blog
remote-name
<Ctrl + D>

0

ฉันชอบคมสำหรับการเรียกดูแบบโต้ตอบบนบรรทัดคำสั่ง มันเป็นเบราว์เซอร์ที่เต็มรูปแบบ (ซึ่งเหมาะกับแอปพลิเคชัน ncurses) มากกว่าเครื่องมือ HTML แบบดิบ ๆ ..

ฉันได้ทดสอบคำสั่ง HTML ดิบผ่าน SSL มาก่อนซึ่งฉันใช้opensslแต่จะอนุญาตเพียงหนึ่งคำสั่งต่อครั้ง ..

> openssl s_client -quiet -connect google.com:443
GET /
... HTML response

> openssl s_client -quiet -connect myprivateserver.com:443
POST /thing/pool ...
... response

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือก s_client openssl man s_clientมีรายละเอียด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.