我需要在各种情况下测试我的 http 服务器响应,即使身份验证失败也是如此。如果身份验证失败,我的服务器将返回401 Unauthorized
一个响应主体,其中包含简单的Unauthorized
(或者可能是其他一些详细消息)。
使用 eg curl
or httpie
,我得到了那些响应体,以防万一401
。
$ curl http://10.5.1.1/bla
Unauthorized
$ curl http://10.5.1.1/bla --digest --user joe:wrong
Unauthorized
$ http http://10.5.1.1/bla -b
Unauthorized
$ http http://10.5.1.1/bla -b --auth-type digest --auth joe:wrong
Unauthorized
Run Code Online (Sandbox Code Playgroud)
但是当使用 wget 尝试这个时,我没有输出:
$ wget http://10.5.1.1/bla -q -O /dev/stdout
$ wget http://10.5.1.1/bla -q -O /dev/stdout --user joe --password wrong
Run Code Online (Sandbox Code Playgroud)
在这种情况下,wget 返回退出代码 6,但我需要检查响应消息。
这是使用 httpie 捕获的完整流量的转储:
$ http http://10.5.1.1/bla --print hbHB
GET /bla HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: …
Run Code Online (Sandbox Code Playgroud) 在 bash shell scipt 中,我使用了几个命令行工具(wget
、curl
、httpie
)来测试我的 http 服务器。
当使用例如 curl 调用 GET 请求时,我看到一个 tcp 连接被打开到我的服务器并在 http 通信完成后立即关闭。
$ curl http://10.5.1.1/favicon.ico -o /dev/null
Run Code Online (Sandbox Code Playgroud)
为了更好地测试我的服务器的保持活动行为,我希望在多个 http 请求/响应周期内保持 tcp 连接打开。
我可以像这样直接从 bash 执行糟糕的 http 请求:
exec 3<>/dev/tcp/10.5.1.1/80
printf "GET /\r\n\r\n" >&3
while IFS= read -r -u3 -t2 line || [[ -n "$line" ]]; do echo "$line"; done
exec 3>&-
exec 3<&-
Run Code Online (Sandbox Code Playgroud)
但是因为我的测试通信要复杂得多(包括身份验证等),我不想完全自己用 bash 或其他脚本语言编写代码,而是想使用现有工具。现在的想法是首先在 bash 中打开一个 tcp 套接字,然后强制某些命令行工具使用此连接而不是打开自己的套接字。也许是这样;
exec 3<>/dev/tcp/10.5.1.1/80
curl http://10.5.1.1/message.txt --use-existing-socket-fd=3
# ... do some other …
Run Code Online (Sandbox Code Playgroud) 背景:我想使用 这个 Wifi-to-Serial 适配器 通过 在 Kubuntu 16.04(64 位)上运行的Stellarium来控制望远镜 。
我使用socat
以下命令行创建了一个虚拟 com 端口:
$ sudo socat pty,link=/dev/virtualcom0,raw tcp:10.0.0.1:4030
Run Code Online (Sandbox Code Playgroud)
我在这里看到了新设备:
$ ls -l /dev/virtualcom0
lrwxrwxrwx 1 root root 10 2017-07-03 09:05 virtualcom0 -> /dev/pts/6
$ ls -l /dev/pts/6
crw--w---- 1 root tty 136, 6 2017-07-03 09:05 /dev/pts/6
Run Code Online (Sandbox Code Playgroud)
只要我以 root 权限运行,就尝试使用/dev/virtualcom0
eg withpicocomm
工作picosomm
。但是当我尝试使用具有标准用户权限的端口时,出现错误:
$ picocom /dev/virtualcom0 --baud 9600 --imap lfcrlf
FATAL: cannot open /dev/virtualcom0: Permission denied
Run Code Online (Sandbox Code Playgroud)
知道如何使用标准用户权限访问虚拟 com 端口,也许为此定义一个特殊的 udev 规则?