BASH 变量和curl

问题描述 投票:0回答:1

有人可以帮助我理解为什么第二个命令按预期工作,但第一个命令却不能。

# 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
            }
          }
        ]
      }
    ]
  }
}
bash curl scripting
1个回答
0
投票

尝试使用 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')"

(是的,这些引号是多余的,但始终引用扩展是一个好习惯)

© www.soinside.com 2019 - 2024. All rights reserved.