SFTP는 오류를 제외한 모든 메시지를 표시하지 않습니다.

SFTP는 오류를 제외한 모든 메시지를 표시하지 않습니다.

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을 사용하고 있기 때문입니다 .stderrstdout2>&1

알다시피, 파일 설명자와 같은 것들은 &1링크(또는 개념에 익숙하다면 포인터)가 아니라 값입니다. 따라서 를 입력하면 2>&1실제로 일어나는 일은 다음과 같습니다.

  1. stdout쉘은 파일 설명자 1( )이 현재 가리키는 위치를 찾아냅니다 . 귀하의 경우 대화형 셸에서 이를 실행 중이므로 stdout터미널을 가리킵니다.
  2. 파일 설명자 2( stderr)도 터미널에 설정되어 있습니다.

따라서 나중에 첫 번째 파일 설명자를 변경할 1>/dev/nullstderr(stderr의지하다어떠한 방식 으로 stdout.

모든 것을 로 리디렉션하려면 /dev/null파일 설명자 값이 어떻게 서로 복사되는지 고려해야 합니다. 이로 인해 리디렉션이 다음과 같이 재정렬됩니다.

sftp $user@$server 1>/dev/null 2>&1

이제 stdout값이 로 설정 /dev/null되고 stderr현재 값 stdout, 즉 으로 설정됩니다 /dev/null. 응!

관련 정보