Shell-Script

腳本內的 cURL

  • March 27, 2022

我正在嘗試解決 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文件將包含標準錯誤,但是,它沒有;缺少log標準錯誤:

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
=================================

有人可以建議我在這裡做錯了什麼嗎?

你的問題不清楚。我 你是這麼說的

  • 你不關心 cURL 的 HTML 輸出(你發送到HTMLFILE),
  • 你關心“冗長”的資訊;
  • 詳細消息將發送到終端(而不是Log文件),並且
  • 您希望他們轉到Log文件(而不是終端)。

在 Unix(以及類 Unix 作業系統,甚至其他一些作業系統)中,程序有兩個自動輸出流:標準輸出(縮寫為“stdout”)和標準錯誤(縮寫為“stderr”)。顧名思義,stdout 用於主要輸出,stderr 用於錯誤消息和診斷。預設情況下,這兩個都指向終端。當您說 時> HTMLFILE,您將 cURL 的標準輸出重定向到HTMLFILE. 但是冗長的消息被寫入標準錯誤。

您想要的是將 cURL 的標準錯誤發送到腳本的標準輸出(即Log 文件)。

這在從 Bourne shell 派生的任何標準的、符合 POSIX 的 shell 中都很容易:

#!/bin/sh
雖然是真的
**做**
日期
迴聲“==================================
curl --interface nic1 --verbose --insecure https://www.20min.ch  ***2>&1*   > HTMLPAGE**
迴聲“”
睡覺 10
**完畢**

2>&1完全按照我上面所說的去做——將標準錯誤重定向到標準輸出。

在 C shell 中更棘手:

#!/bin/csh
**設置 t=`mktemp`**
而((1))
日期
迴聲“==================================
   **(** curl --interface nic1 --verbose --insecure https://www.20min.ch > HTMLPAGE **) *>& "$t"*** 
   ***cat "$t"***
迴聲“”
睡覺 10
結尾

在 csh 中,>&表示將 stdout 和 stderr 發送到以下文件。將它們發送到不同的地方(這是您想要的)很棘手。訣竅是將標準輸出發送到您想要的位置,然後將命令包裝在括號中,然後>&在包裝的命令上使用。我不知道如何簡單地將標準錯誤發送到標準輸出。(可能有一種方法,我預計會被告知它是什麼。)上面,我使用了將 stderr 發送到臨時文件,然後將文件發送到 stdout 的技巧 cat

我鼓勵您在標準 shell 中編寫腳本。C shell 不適合編寫腳本。

PS 如果您不想保存 curl 的標準輸出,為什麼不將其發送到/dev/null

引用自:https://unix.stackexchange.com/questions/694194