有人可以帮助我理解为什么第二个命令按预期工作,但第一个命令却不能。
# first
SESSION=$(curl http://172.21.0.4:4444/status 2>&1 | grep sessionId | cut -d ":" -f2 | tr -d "\r\n\","); echo $SESSION; curl -X DELETE http://127.0.0.1:4444/session/$SESSION
# second
SESSION=$(curl http://172.21.0.4:4444/status 2>&1 | grep sessionId | cut -d ":" -f2 | tr -d "\r\n\","); echo $SESSION; curl -X DELETE http://127.0.0.1:4444/session/$(echo $SESSION)
第一个命令结果
1f7838f7-c2ff-4d5a-90c1-e3ad89e74159
{
"value": {
"message": "Unable to find session with ID: \nBuild info: version: '4.19.1', revision: 'abe0ee07dc'\nSystem info: os.name: 'Linux', os.arch: 'amd64', os.version: '6.5.0-27-generic', java.version: '17.0.10'\nDriver info: driver.version: unknown",
"stacktrace":
..
..
"error": "invalid session id"
}
}curl: (6) Could not resolve host: 1f7838f7-c2ff-4d5a-90c1-e3ad89e74159
第二个命令按预期工作
1f7838f7-c2ff-4d5a-90c1-e3ad89e74159
{"value":null}
我不确定是否相关,但这是通过远程计算机上的 ssh 实现的。 谢谢。
编辑:我尝试过的。 使用 python 启动本地 http 服务器。 这是一个不同的环境,但版本 #1 似乎可以工作 就好了。
$ python3 -m http.server 9000
Serving HTTP on 0.0.0.0 port 9000 (http://0.0.0.0:9000/) ...
..
..
SESSION=bc8bcf9f-a901-440b-af9a-2da8a7fe6f2e
..
$ echo $SESSION
bc8bcf9f-a901-440b-af9a-2da8a7fe6f2e
..
$ curl localhost:9000/test/$SESSION
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error response</title>
</head>
<body>
<h1>Error response</h1>
<p>Error code: 404</p>
<p>Message: File not found.</p>
<p>Error code explanation: 404 - Nothing matches the given URI.</p>
</body>
</html>
..
# python http server log
127.0.0.1 - - [04/May/2024 12:20:38] "GET /test/bc8bcf9f-a901-440b-af9a-2da8a7fe6f2e HTTP/1.1" 404 -
编辑2: 下面添加了curl http://172.21.0.4:4444/status的输出。 命令 #2 已经得到了我所需要的,这就是我 很好奇有什么区别。
如果没有 stderr 重定向,我会得到这个
$ curl http://10.10.14.70:8000/status | grep sessionID
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 418 100 418 0 0 1620 0 --:--:-- --:--:-- --:--:-- 1626
$ curl http://172.21.0.4:4444/status
{
"value": {
"ready": false,
"message": "Selenium Grid not ready.",
"nodes": [
{
"id": "0b1917b4-8a51-4af8-8fe7-e21ebc1f7d0e",
"uri": "http:\u002f\u002f172.21.0.4:4444",
"maxSessions": 1,
"osInfo": {
"arch": "amd64",
"name": "Linux",
"version": "6.5.0-27-generic"
},
"heartbeatPeriod": 30000,
"availability": "UP",
"version": "4.19.1 (revision abe0ee07dc)",
"slots": [
{
"id": {
"hostId": "0b1917b4-8a51-4af8-8fe7-e21ebc1f7d0e",
"id": "c0508b7d-84ce-48d5-bfe8-7f5ae3ee89f1"
},
"lastStarted": "2024-05-04T14:58:20.936580226Z",
"session": {
"capabilities": {
"acceptInsecureCerts": true,
"browserName": "firefox",
"browserVersion": "124.0.2",
"moz:accessibilityChecks": false,
"moz:buildID": "20240401114208",
"moz:debuggerAddress": "127.0.0.1:14907",
"moz:geckodriverVersion": "0.34.0",
"moz:headless": false,
"moz:platformVersion": "6.5.0-27-generic",
"moz:processID": 431,
"moz:profile": "\u002ftmp\u002frust_mozprofileu9zHDw",
"moz:shutdownTimeout": 60000,
"moz:webdriverClick": true,
"moz:windowless": false,
"pageLoadStrategy": "normal",
"platformName": "linux",
"proxy": {
},
"se:bidiEnabled": false,
"se:cdp": "ws:\u002f\u002f172.21.0.4:4444\u002fsession\u002fb67e09ac-ef3f-4b01-8aba-353436770fc9\u002fse\u002fcdp",
"se:cdpVersion": "85.0",
"se:noVncPort": 7900,
"se:vnc": "ws:\u002f\u002f172.21.0.4:4444\u002fsession\u002fb67e09ac-ef3f-4b01-8aba-353436770fc9\u002fse\u002fvnc",
"se:vncEnabled": true,
"se:vncLocalAddress": "ws:\u002f\u002f172.21.0.4:7900",
"setWindowRect": true,
"strictFileInteractability": false,
"timeouts": {
"implicit": 0,
"pageLoad": 300000,
"script": 30000
},
"unhandledPromptBehavior": "dismiss and notify"
},
"sessionId": "b67e09ac-ef3f-4b01-8aba-353436770fc9",
"start": "2024-05-04T14:58:20.936580226Z",
"stereotype": {
"browserName": "firefox",
"browserVersion": "124.0",
"moz:firefoxOptions": {
"binary": "\u002fusr\u002fbin\u002ffirefox"
},
"platformName": "linux",
"se:noVncPort": 7900,
"se:vncEnabled": true
},
"uri": "http:\u002f\u002f172.21.0.4:4444"
},
"stereotype": {
"browserName": "firefox",
"browserVersion": "124.0",
"moz:firefoxOptions": {
"binary": "\u002fusr\u002fbin\u002ffirefox"
},
"platformName": "linux",
"se:noVncPort": 7900,
"se:vncEnabled": true
}
}
]
}
]
}
}
尝试使用 grep+cut 或任何不是为处理 JSON 构建的东西来解析 JSON 是徒劳的。
在管道中运行以下行
grep sessionId | cut -d ":" -f2 | tr -d "\r\n\","
:
"sessionId": "b67e09ac-ef3f-4b01-8aba-353436770fc9",
将打印
b67e09ac-ef3f-4b01-8aba-353436770fc9
,并带有前导空格字符。
您的下一个错误是扩展未加引号的参数。
curl -X DELETE http://127.0.0.1:4444/session/$SESSION
将扩展为:
curl -X DELETE http://127.0.0.1:4444/session/ b67e09ac-ef3f-4b01-8aba-353436770fc9
你能看到这个空间吗?
但是,跑步
curl -X DELETE http://127.0.0.1:4444/session/$(echo $SESSION)
将扩展到
curl -X DELETE http://127.0.0.1:4444/session/$(echo b67e09ac-ef3f-4b01-8aba-353436770fc9)
你还能看到空间吗?
扩展时引用参数至关重要,以避免各种意外(字段分割、路径名扩展)。
但是对于您的具体问题,最好的做法是不要使用从未用于解析 JSON 的工具来解析 JSON。使用专门为解析 JSON 构建的工具,例如
jq
:
session="$(… | jq -r '.sessionId')"
(是的,这些引号是多余的,但始终引用扩展是一个好习惯)