Python 스크립트 내에서 rsync를 사용하고 싶습니다. 모듈 을 사용하여 호출 하고 원격 시스템의 파일 subprocess
에 저장된 공개 키를 사용하여 인증합니다 .authorized_key
유일한 문제는 잘못된 원격 사용자 이름을 사용하여 rsync를 사용할 때 비밀번호를 묻는 메시지가 표시되어 백업 스크립트가 영원히 중단된다는 것입니다.
rsync
인증할 수 없는 경우 비밀번호를 묻는 대신 오류가 발생하면서 강제로 종료할 수 있나요 ?
우디
답변1
SSH 원격 셸(예를 들어 rsync 서버가 아닌)에서 rsync를 사용한다고 가정하면 rsync를 통해 비밀번호를 묻지 않는 방식으로 SSH를 실행할 수 있습니다. 예를 들어 다음 호출을 한 번 사용할 수 있습니다.
rsync -e 'ssh -o "NumberOfPasswordPrompts 0"' source user@target:/path
이렇게 하면 rsync가 0번의 비밀번호 시도로 SSH를 사용하게 됩니다. 다른 인증 방법(공개 키 또는 GSSAPI 등)을 사용하여 액세스할 수 없는 경우 오류와 함께 실패합니다. 그런 일이 발생하면 rsync는 사용자를 좋아하지 않으며 STDERR에 큰 소리로 불평하고 종료 코드 255로 중단됩니다.
답변2
다음은 조용히 유지하기 위해 사용하는 SSH용 명령줄 옵션입니다.
ssh -o stricthostkeychecking=no -o userknownhostsfile=/dev/null -o batchmode=yes -o passwordauthentication=no
Known_hosts 파일을 유지 관리하지 않고 MitM 경고가 표시되는 것이 걱정되는 경우에만 호스트 키 항목이 필요합니다. James F가 제안한 인증 유형을 지정하는 대신 비밀번호 인증을 명시적으로 제한해야 했습니다. 하지만 나는 이것을 몇 가지 다른 OS 버전을 사용하는 수백 개의 호스트에 사용하므로 단순히 비호환성일 수 있습니다.
답변3
re: James의 제안(tty를 제공하지 않음), 하위 프로세스의 경우 stdin=None을 Popen에 매개변수로 넣어보세요.
답변4
rsync를 시작하는 방법에 따라 TTY 또는 PTY를 제공하지 않는 것이 도움이 될 수 있습니다.
많은 프로그램은 사용자에게 입력하라는 메시지를 표시하기로 결정하기 전에 제어 TTY가 있는지 확인합니다. system() 및 유사한 호출의 기본 동작은 하위 프로그램에 tty를 제공하는 것이지만 이를 비활성화할 수 있습니다.
또한 두 시스템을 모두 제어하고 이 문제를 해결하는 동안 보안상의 이점을 위해 비밀번호 인증을 피하려는 경우 원격 측에서 비밀번호 인증을 완전히 비활성화할 수도 있습니다.
SSH를 통해 rsync를 수행하는 경우 해당 호스트의 ssh_config 파일에 또는 -o 명령줄 스위치를 통해 다음을 추가할 수 있습니다.
PreferredAuthentications publickey
빠른 테스트(rsync가 아닌 ssh만)에서 공개 키가 승인되지 않으면 비밀번호를 묻는 메시지가 표시되지 않고 SSH가 즉시 종료되었습니다.