脚本内的 cURL

脚本内的 cURL

我正在尝试解决 FreeBSD 服务器上的一些问题,该服务器间歇性地(随机地)被网络防火墙阻止通过 HTTPS 从网络服务器下载某些文件。为了了解阻塞发生时会发生什么,我需要运行以下 cURL:

curl --interface nic1 --verbose --insecure 'https://speed.hetzner.de/100MB.bin' > /dev/null

然后读取命令的stderr。但是,由于问题发生在无法预料的随机时间,我想每 10 秒运行一次这个curl,并将 stderr 存储在一个文件中,以便我以后可以查看它,我使用以下脚本(名为cURLScript)来实现此目的:

#!/bin/sh
while true
do
    date
    echo "================================="
    curl --interface nic1 --verbose --insecure 'https://speed.hetzner.de/100MB.bin' > /dev/null  2>&1
    echo ""
    sleep 10
done

然后我运行脚本:

/bin/sh cURLScript > log &

我希望该log文件将包含 stderr,但是,它没有;缺少logstderr:

Svr12loc:service 21] cat log
Thu Mar 24 16:42:34 CET 2022
=================================

Thu Mar 24 16:43:03 CET 2022
=================================

Thu Mar 24 16:43:33 CET 2022
=================================

Thu Mar 24 16:44:02 CET 2022
=================================

Thu Mar 24 16:44:32 CET 2022
=================================

Thu Mar 24 16:45:00 CET 2022
=================================

有人可以建议我在这里做错了什么吗?

答案1

你的问题不清楚。我 猜测你是说

  • 您不关心 cURL 的 HTML 输出(您要发送到HTMLFILE),
  • 您关心“详细”消息;
  • 详细消息将发送到终端(而不是文件Log),并且
  • 您希望它们转到Log文件(而不是终端)。

在 Unix(以及类 Unix 操作系统,甚至其他一些操作系统)中,程序有两个自动输出流:标准输出(缩写为“stdout”)和标准错误(缩写为“stderr”)。顾名思义,stdout 用于主要输出,stderr 用于错误消息和诊断。默认情况下,这两个都指向终端。当您说 时> HTMLFILE,您正在将 cURL 的标准输出重定向到HTMLFILE。但详细消息正在写入 stderr。

您想要的是将 cURL 的 stderr 发送到脚本的 stdout(即文件Log )。

这在任何源自 Bourne shell 的标准、符合 POSIX 的 shell 中都很容易:

#!/bin/sh
虽然是真的

    日期
    回声“====================================”
    卷曲 --interface nic1 --verbose --insecure https://www.20min.ch  2>&1  > HTML页面
    回声“”
    睡10
完毕

2>&1正是我上面所说的——将 stderr 重定向到 stdout。

在 C shell 中则比较棘手:

#!/bin/csh
设置 t=`mktemp`
而 ((1))
    日期
    回声“====================================”
    curl --interface nic1 --verbose --insecure https://www.20min.ch > HTMLPAGE>&“$t”
    猫“$t”
    回声“”
    睡10
结尾

在 csh 中,>&表示将 stdout 和 stderr 发送到以下文件。将它们发送到不同的地方(这正是您想要的)很棘手。诀窍是将 stdout 发送到您想要的位置,然后将命令括在括号中,然后>&在包装的命令上使用。我不知道如何简单地将标准错误发送到标准输出。 (可能有一种方法,我预计会被告知它是什么。)上面,我使用了将 stderr 发送到临时文件的技巧,然后使用 cat.

我鼓励您在标准 shell 中编写脚本。 C shell 不适合编写脚本。

PS如果您不想保存curl的标准输出,为什么不将其发送到/dev/null

答案2

您正在将 的输出发送curl到文件HTMLPAGE。这>是一个重定向运算符,其定义就是为了完成此任务。

如果您希望页面内容包含在脚本输出中(即文件中log),请不要在调用的行上重定向它curl

相关内容