스크립트 내의 cURL

스크립트 내의 cURL

HTTPS를 통해 웹 서버에서 특정 파일을 다운로드하지 못하도록 네트워크 방화벽에 의해 간헐적으로(무작위로) 차단되는 FreeBSD 서버의 일부 문제를 해결하려고 합니다. 차단이 발생하면 어떤 일이 발생하는지 이해하려면 다음 cURL을 실행해야 합니다.

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

그런 다음 명령의 stderr을 읽으십시오. 그러나 문제는 예상치 못한 임의의 시간에 발생하므로 이 컬을 10초마다 실행하고 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

귀하의 질문이 불분명합니다. 나 추측하다네 말 뜻은

  • (으로 보내려는 HTMLFILE) cURL의 HTML 출력에는 관심이 없습니다.
  • 당신은 "자세한" 메시지에 관심이 있습니다.
  • 자세한 메시지는 (file 대신) 터미널로 전송됩니다 Log.
  • Log터미널이 아닌 파일 로 이동하기를 원합니다 .

Unix(및 Unix 유사 운영 체제, 심지어 일부 다른 운영 체제)에서 프로그램에는 표준 출력(약어 "stdout")과 표준 오류(약어 "stderr")라는 두 가지 자동 출력 스트림이 있습니다. 이름에서 알 수 있듯이 stdout은 기본 출력에 사용되고 stderr은 오류 메시지 및 진단에 사용됩니다. 기본적으로 둘 다 터미널을 가리킵니다. 라고 말하면 > HTMLFILEcURL의 표준 출력을 로 리디렉션하는 것입니다 HTMLFILE. 그러나 자세한 메시지가 stderr에 기록됩니다.

원하는 것은 cURL의 stderr을 스크립트의 stdout(파일 Log )으로 보내는 것입니다.

이는 Bourne 쉘에서 파생된 모든 표준 POSIX 호환 쉘에서 쉽습니다.

#!/bin/sh
사실이긴 하지만
하다
    날짜
    에코 "===================================="
    컬 --인터페이스 nic1 --verbose --insecure https://www.20min.ch  2>&1  > HTML 페이지
    에코""
    잠 10
완벽한

2>&1위에서 말한 것과 정확히 같습니다. stderr를 stdout으로 리디렉션합니다.

C 셸에서는 더 까다롭습니다.

#!/bin/csh
t=`mktemp`로 설정
그리고 ((1))
    날짜
    에코 "===================================="
    (컬 --인터페이스 nic1 --verbose --insecure https://www.20min.ch > HTMLPAGE)  >&"$t"
    고양이 "$t"
    에코""
    잠 10

csh에서는 >&stdout 및 stderr을 다음 파일로 보내는 것을 의미합니다. 원하는 대로 다른 장소로 보내는 것은 까다롭습니다. 비결은 stdout을 원하는 위치로 보낸 다음 명령을 괄호로 묶고 >&래핑된 명령에 사용하는 것입니다. 표준 오류를 표준 출력으로 보내는 방법을 모르겠습니다. (아마도 방법이 있을 것이고, 그것이 무엇인지 알려줄 것으로 기대합니다.) 위에서는 stderr를 임시 파일로 보낸 후  cat.

표준 쉘에서 스크립트를 작성하는 것이 좋습니다. C 쉘은 스크립팅에 적합하지 않습니다.

추신: 컬의 표준 출력을 저장하고 싶지 않다면 로 보내면 어떨까요 /dev/null?

답변2

curl출력을 파일로 보내고 있습니다 HTMLPAGE. 이는 >리디렉션 연산자이며 이 작업을 수행하기 위해 정의됩니다.

페이지 콘텐츠를 스크립트 출력(예: 파일 log)에 포함하려면 다음을 호출하는 줄에서 리디렉션하지 마세요.curl

관련 정보