【问题标题】:Getting curl: (3) URL using bad/illegal format获取 curl:(3)使用错误/非法格式的 URL
【发布时间】:2021-12-14 05:30:18
【问题描述】:

我的 bash 代码就是这样。我正在尝试学习 docker,但同时也是一个使用 bash 脚本的新手。我为读取命令输入了一些简单的内容,例如 google.com,但它给了我 curl:(3) URL 使用错误/非法格式或缺少 URL。有谁知道我做错了什么?

docker exec -it missingDependencies sh -c "echo 'Input Website:'; read website; echo 'Searching..'; sleep 1; curl http://$website;"

【问题讨论】:

  • 您是否尝试使用 echo 将其打印出来以验证传递给 curl 的内容?
  • 哦,谢谢,我试试。我对此很陌生。谢谢。我做了 docker exec -it missingDependencies sh -c "curl google.com" 并且有效
  • 我测试了它,但没有任何结果,所以我现在要弄清楚为什么

标签: linux bash docker ubuntu curl


【解决方案1】:

当像这样调用(没有域)时,Curl 会给出警告:

curl http://

让我们定义一个有 curl 的图像。

$ cat Dockerfile 
  FROM ubuntu:latest
  RUN apt-get update
  RUN apt-get install -y curl

并组装它:

docker build .  -t foobar

所以现在我们可以运行你的脚本了。

$ docker run -it --rm foobar /bin/sh -c \
  "set -x; echo 'Input Website:'; read website; echo 'Searching..'; curl https://$website ;"

+ echo Input Website:
Input Website:
+ read website
google.com
+ echo Searching..
Searching..
+ curl https://

解决方案

 docker run -it --rm foobar /bin/sh -c \
  "set -x; read -p 'which website?: ' website; echo 'Searching..'; curl https://\$website;"

+ read -p which website?:  website
which website?: google.com
+ echo Searching..
Searching..
+ curl https://google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://www.google.com/">here</A>.
</BODY></HTML>

问题在于,当您运行 bash -c "echo whatever $website" 时,$website 变量将从您当前的环境中获取,而不是从 docker 环境中获取(来自读取的网站)。为了抵消 $website 变量被插值,您可以使用单引号,例如 sh -c 'read foo; echo $foo',或者转义美元符号:sh -c "read foo; echo \$foo"

【讨论】:

  • 非常感谢。我会仔细阅读您的回复,并在了解后回复您
  • 好的,我试过这个:C:\Users\Eric Goto&gt; docker exec -it asdf /bin/sh -c 'read xd; curl https://${xd}' 并且它有效。我现在正试图让 `'read xd; echo "正在搜索 ${xd}";'上班
  • 只是一个后续问题,您是否知道任何可以指导我的资源来解释您在回复中提到的一些事情?诸如插值、\ 以及 " 和 ' 之间的区别之类的东西
  • 啊,好吧,我得到了我正在工作的东西。 'read xd; echo "$xd" you typed that;'。但在 ubuntu 中,我可以使用 read xd; echo You typed $xdread xd; echo "You typed $xd",它们都可以工作。为什么他们都不能通过 docker exec 工作? docker exec -it asdf /bin/sh -c 'read xd; echo "$xd you typed that";' 不起作用 docker exec -it asdf /bin/sh -c 'read xd; echo "$xd" you typed that;' 起作用
猜你喜欢
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 2022-10-14
  • 2016-06-28
  • 2015-06-25
相关资源
最近更新 更多