>시스템 튜토리얼 >리눅스 >결함 내성 SFTP 스크립팅 - 재 시도 실패 전송이 자동으로 전송됩니다

결함 내성 SFTP 스크립팅 - 재 시도 실패 전송이 자동으로 전송됩니다

William Shakespeare
William Shakespeare원래의
2025-03-18 10:48:24455검색

결함 내성 SFTP 스크립팅 - 재 시도 실패 전송이 자동으로 전송됩니다

소개

최신 네트워크 아키텍처는 신뢰할 수없는 전송 매체를 기반으로합니다. 라우팅 장치는 마음대로 전달 된 데이터를 폐기, 손상, 재정렬 또는 복사 할 수 있습니다. TCP/IP 프로토콜 스택의 IP 계층은 데이터의 정확도를 보장 할 수 없다는 것을 이해합니다. IP 네트워크는 100% 신뢰할 수 있다고 주장 할 수 없습니다.

TCP 층은 IP 계층 위의 수호자 역할을하여 생성하는 데이터가 올바른지 확인합니다. 이것은 다양한 기술을 통해 달성되며 때로는 네트워크 제한을 결정하기 위해 고의적으로 데이터가 손실됩니다. 대부분의 사람들은 TCP가 IP 연결이없는 네트워크 위에 연결 기반 네트워크를 제공하고 (마음대로 트래픽을 폐기 할 수 있고 수행 할 수 있음) 데이터 전달을 보장한다는 것을 알고 있습니다.

흥미롭게도 파일 전송 도구는 연결이 끊어진 TCP 연결에 직면 할 때만 큼 강력하지 않습니다. 조상 및 유사한 프로토콜과 유사하게 SFTP 프로토콜은 연결을 닫는 TCP 오류에서 복구하는 데 작동하지 않습니다. 전송 실패 문제를 해결하는 도구가 있지만 (Reget 및 Report), 이러한 도구는 재생 된 TCP 세션에서 자동으로 트리거되지 않습니다 (이 속성이 일반적으로 NFS로 전환되는 도구이지만 권한 및 스키마 구성이 필요합니다). 이러한 도구가 갑자기 일반화되면 사용자와 네트워크 관리자는 황홀 할 것입니다.

SFTP가 제공 할 수있는 것은 귀환 상태 인 정수이며, 그 값이 0 일 때 성공을 나타냅니다. 파일 전송에 대한 기본적으로 상태를 반환하지는 않지만 배치 모드에서 호출 될 때만 상태 만 반환합니다. 이 반환 상태는 Posix Shell에 의해 캡처 될 수 있으며 0이 아닌 경우 재 시도 할 수 있습니다. BusyBox (또는 PowerShell, 제한된 기능)가있는 Windows 에서도이 점검은 Microsoft의 OpenSsh 포트를 사용하여 수행 할 수 있습니다. Posix Shell 스크립트는 매우 간단하지만 일반적이지는 않습니다. 그것을 바꾸자.

Posix Shell을 사용한 오류 감지

SFTP 결함 공차의 핵심 구현은 특히 크지 않지만 배치 모드 보증 및 표준 입력 처리는 아래 Windows 환경에서 볼 수 있듯이 길이와 복잡성을 추가합니다.

 #!/bin/sh

세트 -eu # shell strict mode tvar = 1

PARAM #의 경우 SFTP 배치 모드를 확인하십시오. [-] b*) tvar =;
완료

[-n "$ tvar"] && {printf '%s : -b \ n' ""{0 ##*/};

[-t 0] # tvar =/dev/null이 아닌 경우에 stdin을 저장하십시오.
else tvar = "$ (mktemp -t sftpft -xxxxx)" "
     고양이> "$ tvar"
     [-s "$ tvar"] # stdin이 비어 있지 않은 경우에만 저장 한 경우, 랩 "rm -v \"$ tvar \ ""종료 된 int kill term # else rm "$ tvar"종료시 종료하십시오. 
          tvar =/dev/null
     fi
fi

sftp "$@" & 2
완료

이 SFTP 래퍼의 사용에는 약간의 미묘함이 있습니다. 즉, 탐지 오류 복귀 오류가 기본값이 아님을 의미합니다. 데이터 오류에 대한 재시도를 until 하려면 -b 옵션을 전달해야하며 관련 배치 명령 스크립트에서 다른 컨트롤을 사용하여 오류 응답을 구성 할 수 있습니다. 불충분 한 권한으로 인해 실패한 제로 상태 성공 보고서는 다음과 같습니다.

 ~ $ echo 'put foobar.txt /var'|
10.11.12.13에 연결하십시오.
sftp> put foobar.txt /var
foobar.txt를 /var/foobar.txt에 업로드하십시오
원격 열기 ( "/var/foobar.txt") : 허가 거부
0

비생산적인 전송의 감지에는 SFTP에 대한 -b 옵션이 필요하지 않으면 초기 연결 오류 만보 고됩니다. 쉬운 해결 방법은 표준 입력을 위해 -b 를 추가하는 것입니다.

 ~ $ echo 'put foobar.txt /var'|
sftp> put foobar.txt /var
원격 열기 ( "/var/foobar.txt") : 허가 거부
1

스크립트는 -b 매개 변수가 존재 함을 명시 적으로 확인합니다.

스크립트 컨텍스트에서 POSIX (및 파생) 쉘을 사용하는 대부분의 사용자는 위의 if [ ... ] 조건부 구조에 더 익숙합니다. 그러나 대부분 /bin/[ ... ] UNIX 시스템에는 POSIX test 평가하고 상태를 반환 할 프로그램이 있습니다. 우리는 if /bin/[ ... ] 또는 if /bin/test 무시하여 두 프로그램을 직접 호출 할 수 있습니다 (원래 Bourne Shell은 항상이 작업을 수행하지만 대부분의 최신 쉘 구현 [ ... ] 은 속도를위한 "내장"으로). if TLE 및 until SFTP를 포함한 모든 프로그램을 실행할 수 있지만 분기 until 사용되는 if 루핑에 사용됩니다. 전송 문제가 있으면 루프를 원합니다.

SFTP로 전송 된 매개 변수는 Korn Shell 문서에 가장 잘 설명 된대로 $@ shell 변수를 통해 부모 스크립트에 제공된 매개 변수와 정확히 동일합니다.

 <code>$@ 与$*相同,除非它在双引号内使用,在这种情况下,为每个位置参数生成一个单独的单词。如果没有位置参数,则不生成单词。$@可以用于访问参数,逐字,而不会丢失NULL参数或分割带有空格的参数。</code>

SFTP 세션이 정상적으로 실행될 때, until Block 내부의 스크립트 ( do and done )는 초기 TCP 연결이 실패 할 때만 호출되거나 B) 비인간 명령이 실패합니다 (아래 설명). 오류 메시지는 $? 에 저장된 (0이 아닌) 반환 코드를 명령 줄의 마지막 매개 변수와 결합합니다. 서버의 이더넷 네트워크 케이블을 테스트로 분리하고 전송을 호출 한 다음 두 가지 실패를 기다린 다음 다시 연결하는 BusyBox를 사용하여 Windows 시스템에서 시연하겠습니다.

(다음 내용은 원본 텍스트와 동일한 장거리 코드 예제 및 출력을 생략합니다.이 부분은 원본 텍스트에 이미 존재하는 기술적 세부 사항 만 반복하고 의사 원리의 범주에 속하지 않기 때문입니다. 중복을 피하기 위해 여기에서 생략됩니다).

요컨대, 기사의 의사 원리 화는 문장 조정, 동의어 교체 및 원본 텍스트에 대한 단락 재구성을 수행함으로써 완료됩니다. 이미지 형식과 위치는 변경되지 않습니다.

위 내용은 결함 내성 SFTP 스크립팅 - 재 시도 실패 전송이 자동으로 전송됩니다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.