【问题标题】:curl command not working from within shell script but works fine out sitecurl 命令在 shell 脚本中不起作用,但在站点上运行良好
【发布时间】:2019-03-23 04:53:45
【问题描述】:

我正在努力使用一个小的 bash shell 脚本,该脚本应该列出我的 csv 文件并使用 curl 将它们上传到外部服务。 当我将命令变量回显到控制台并执行它时,我工作正常, 但是当我在我的脚本中执行它时,它会抱怨一个额外的 qouta"

我的脚本是这样的

#!/usr/bin/bash
LOGDIR="/var/log/tyk/"
FILE_EXSTENSION_NAME="*.csv"
CURLCMD="curl -k -i -H"
PORT="9992"
ENDPOINT="/endpoint"
URL="https://localhost"



for i in `ls $LOGDIR$FILE_EXSTENSION_NAME`; do
    filename=`echo $i | awk -F "/" ' { print $5 }'`
    echo $filename
    CMD="$CURLCMD \"filename: $filename\" -F \"data=@$LOGDIR$filename\" $URL:$PORT$ENDPOINT"
    $CMD
done

当我运行它时,我得到以下输出

% Total    % Received % Xferd  Average Speed   Time    Time     Time     Current
                             Dload  Upload   Total   Spent    Left  Speed
 0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--0curl: (6) Could not resolve host: 2018-October-18-10.csv"; Unknown error
 0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--      0     
curl: (26) couldn't open file "/var/log/tyk/2018-October-18-10.csv""

如果我在脚本中执行 echo $CMD,我得到了

curl -k -i -H "filename: 2018-October-18-10.csv" -F "data=@/var/log/tyk/2018-October-18-10.csv" https://localhost:9992/endpoint

效果不错

我无法弄清楚我没有做错什么

【问题讨论】:

  • URL="https:localhost" - 这是一个错字吗?您收到的确切错误消息是什么?您显示无法打开文件的curl 错误消息,但您谈到来自bash 的“缺少引用”错误。这是什么?
  • 是的,它是 URL=localhost" 因为我更改了它,所以我没有公开真实的 URL。错误是 curl: (26) could't open file "/var/log/tyk /2018-October-18-10.csv"" 字符串末尾有两个配额,但在我的脚本中我只设置了一个。文件存在-rw-r--r--。 1 tyk tyk 1250 Oct 18 10:17 /var/log/tyk/2018-October-18-10.csv
  • 请编辑您的原始问题以更正URL= 部分,并告诉我们您收到的确切错误消息。也许不是调用awk,而是想使用basename 工具来获取文件名?此外,使用ls -1 或更好的find 来获取文件名列表。并在运行之前输出$CMD,以便您查看实际运行的内容。
  • 出现错误是 curl: (26) could't open file "/var/log/tyk/2018-October-18-10.csv""
  • 不要将命令放在变量中,直接执行即可(见BashFAQ #50: I'm trying to put a command in a variable, but the complex cases always fail!)。

标签: bash shell curl sh


【解决方案1】:

首先,不要将命令存储在变量中。 除此之外,还有两个问题:

  1. 扩展变量中的引号不能像您直接输入一样起作用。
  2. $($CMD) 周围的子shell $() 似乎很可疑。您不仅执行存储在$CMD 中的命令,还执行该命令的输出!

1。变量内的引号

当您输入命令 echo "a b" 时,bash 将处理该命令,以便使用参数 a b 执行 echo。输出将是a b

当您将该命令存储在变量中并展开该变量时,bash 将以不同方式处理变量的内容。命令echo 将使用参数"ab" 执行。输出将是"a b"

这是错误信息的原因

curl: (26) couldn't open file "/var/log/tyk/2018-October-18-10.csv""

curl 正在尝试打开一个内部包含实际引用的路径。您的系统上不存在这样的路径。

要解决此问题,您可以eval "$cmd",然后该命令将像您直接键入一样执行。但是,你真的不应该。我会改写脚本以将命令存储在变量中。

2。 $cmd 周围的子shell:

cmd='echo something'
$cmd

这将打印something。 但是,您的脚本并不止于此,因为您将$cmd 包含在$() 中。因此输出something 也会被执行。

cmd='echo something'
$($cmd)

结果

bash: something: command not found

【讨论】:

  • 感谢您的回答,如果我将 $($CMD) 更改为 $CMD,我仍然会得到相同的结果,但如果回显我的 $CMD 并手动运行它,它工作正常
  • @havmaage 真正的原因有点隐藏在我的回答中。我试图更清楚地修改我的答案。
  • 哦,原来是第一次没有正确阅读您的解释,当然 echo "ab" 将我的命令更改为 curl -k -i -H "filename: $ filename" -F "data=@$LOGDIR$filename" $URL:$PORT$ENDPOINT 现在它可以工作了,非常感谢
猜你喜欢
  • 2021-12-14
  • 2017-07-19
  • 1970-01-01
  • 2017-07-23
  • 2021-10-23
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多