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이 포함될 것으로 예상했지만 log
stderr이 없습니다.
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은 오류 메시지 및 진단에 사용됩니다. 기본적으로 둘 다 터미널을 가리킵니다. 라고 말하면 > HTMLFILE
cURL의 표준 출력을 로 리디렉션하는 것입니다 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