bash 스크립트에서 sftp만 사용하여 로컬 시스템의 파일을 FTP 서버에 "드롭"하고 싶습니다.
오류를 제외한 모든 메시지를 억제하고 싶습니다.
sftp $user@$server 2>&1 1>/dev/null <<EOF
put $local_file_path $remote_file_path
EOF
성공 시 명령 출력:
Connecting to <server>...
왜 아직도 받을 수 있나요?
답변1
Connecting to <server>...
아마도 파일 설명자 2(stderr)로 전송했기 때문일 것입니다 . 파일 설명자 1(stdout)과 2(stderr)의 유일한 차이점은 전자가 다음과 같다는 것입니다.전통적으로일반 메시지에 사용되는 반면 후자는전통적으로디버깅이나 오류 출력에 사용됩니다. 그러나 프로그램은 한 채널 또는 다른 채널에 들어가는 내용을 결정하므로 하나의 출력 또는 다른 출력을 리디렉션할 수 있지만 인쇄할 위치를 결정할 수는 없습니다. 예를 들어, 오류가 stderr에만 전송되도록 강제할 수는 없습니다.
답변2
실제로 같은 문제가 있어서 이 해결책을 생각해냈습니다. 100% 정상적인 출력은 아니지만 stderr
오류의 원인을 파악하는 데 도움이 됩니다.
sftp $user@$server > /dev/null 2>&1 <<EOF
put $local_file_path $remote_file_path
EOF
sftp_status=$?
case $sftp_status in
0) sftp_error="";;
1) sftp_error="Error 1: Generic error - Undetermined error in file copy";;
2) sftp_error="Error 2: Remote host connection failure";;
3) sftp_error="Error 3: Destination is not directory, but it should be";;
4) sftp_error="Error 4: Connecting to host failed";;
5) sftp_error="Error 5: Connection lost for some reason";;
6) sftp_error="Error 6: File does not exist";;
7) sftp_error="Error 7: No permission to access file";;
8) sftp_error="Error 8: Undetermined error from sshfilexfer";;
9) sftp_error="Error 9: File transfer protocol mismatch";;
65) sftp_error="Error 65: Host not allowed to connect";;
66) sftp_error="Error 66: Protocol error";;
67) sftp_error="Error 67: Key exchange failed";;
68) sftp_error="Error 68: Host authentication failed";;
69) sftp_error="Error 69: MAC error";;
70) sftp_error="Error 70: Compression error (not used in SSH2)";;
71) sftp_error="Error 71: Service not available";;
72) sftp_error="Error 72: Protocol version not supported";;
73) sftp_error="Error 73: Host key not verifiable";;
74) sftp_error="Error 74: Connection lost";;
75) sftp_error="Error 75: Disconnected by application";;
76) sftp_error="Error 76: Too many connections";;
77) sftp_error="Error 77: Cancelled by user";;
78) sftp_error="Error 78: No more auth methods available";;
79) sftp_error="Error 79: Illegal user name";;
255) sftp_error="Error 255: Error occurred in SSH";;
*) sftp_error="Unknown sftp Error";;
esac
echo $sftp_error
상태 코드는 다음 목록을 기반으로 합니다.https://support2.microfocus.com/techdocs/2487.html
귀하가 받는 상태 코드는 SFTP 클라이언트에 따라 다릅니다.
따라서 일부 클라이언트는 상태 코드만 사용합니다.0,1&255
답변3
불행하게도 이 질문에 제대로 대답한 사람은 아무도 없었습니다.
노력하다:
sftp_command 2>&1 >/dev/null | grep -v 'Connecting to'
stderr를 stdout으로 리디렉션하고그 다음에stdout을 /dev/null로 리디렉션하면 연결을 제외한 모든 것을 표시할 수 있습니다.
답변4
왜 아직도 받을 수 있나요?
sftp
이 메시지는 으로 인쇄되고 귀하는 로 리디렉션 (예: 터미널 ) stderr
을 사용하고 있기 때문입니다 .stderr
stdout
2>&1
알다시피, 파일 설명자와 같은 것들은 &1
링크(또는 개념에 익숙하다면 포인터)가 아니라 값입니다. 따라서 를 입력하면 2>&1
실제로 일어나는 일은 다음과 같습니다.
stdout
쉘은 파일 설명자 1( )이 현재 가리키는 위치를 찾아냅니다 . 귀하의 경우 대화형 셸에서 이를 실행 중이므로stdout
터미널을 가리킵니다.- 파일 설명자 2(
stderr
)도 터미널에 설정되어 있습니다.
따라서 나중에 첫 번째 파일 설명자를 변경할 1>/dev/null
때 stderr
(stderr
의지하다어떠한 방식 으로 stdout
.
모든 것을 로 리디렉션하려면 /dev/null
파일 설명자 값이 어떻게 서로 복사되는지 고려해야 합니다. 이로 인해 리디렉션이 다음과 같이 재정렬됩니다.
sftp $user@$server 1>/dev/null 2>&1
이제 stdout
값이 로 설정 /dev/null
되고 stderr
현재 값 stdout
, 즉 으로 설정됩니다 /dev/null
. 응!