Я хотел бы использовать rsync в скрипте python. Я вызываю его с помощью модуля subprocess
и аутентифицируюсь с помощью открытых ключей, хранящихся вauthorized_key
файле на удаленной машине.
Единственная проблема заключается в том, что когда я использую rsync, используя неправильное имя удаленного пользователя, мне предлагается ввести пароль, что, очевидно, навсегда останавливает сценарий резервного копирования.
Могу ли я заставитьrsync
завершить работу с ошибкой, если не удается пройти аутентификацию, вместо запроса пароля?
Уди
решение1
Если вы используете rsync с удаленной оболочкой SSH (а не, например, с сервером rsync), то вы можете заставить rsync запустить SSH таким образом, что он никогда не будет запрашивать пароль. Например, можно использовать этот вызов:
rsync -e 'ssh -o "NumberOfPasswordPrompts 0"' source user@target:/path
Это заставит rsync использовать SSH с 0 возможными попытками ввода пароля - если он не сможет получить доступ с помощью какого-либо другого метода аутентификации (например, открытого ключа или GSSAPI), то он выдаст ошибку. Обратите внимание, что rsync не понравится вам, когда это произойдет, и громко пожалуется в STDERR и прервется с кодом выхода 255.
решение2
Вот параметры командной строки для ssh, которые я использую, чтобы он не выдавал никаких сообщений.
ssh -o stricthostkeychecking=no -o userknownhostsfile=/dev/null -o batchmode=yes -o passwordauthentication=no
Hostkey вам нужен только в том случае, если вы не ведете свой файл known_hosts и беспокоитесь о получении предупреждений MitM. Вместо того, чтобы указывать типы аутентификации, как предлагает Джеймс Ф., мне пришлось явно ограничить аутентификацию по паролю. Я использую это, чтобы охватить сотни хостов с несколькими разными версиями ОС, так что это может быть просто несовместимостью.
решение3
re: Предложение Джеймса (не давая ему tty), для подпроцесса попробуйте указать stdin=None в качестве параметра Popen.
решение4
В зависимости от того, как вы запускаете rsync, может помочь отсутствие указания TTY или PTY.
Многие программы проверяют, есть ли у них управляющий TTY, прежде чем решить, запрашивать ли у пользователя ввод. Поведение по умолчанию system() и подобных вызовов — предоставлять tty подпрограммам, но вы можете отключить это.
Также можно полностью отключить аутентификацию по паролю на удаленной стороне, если вы контролируете обе системы и хотите отказаться от аутентификации по паролю ради повышения безопасности при решении этой проблемы.
Если вы используете rsync через SSH, вы можете добавить следующее в файл ssh_config для соответствующего хоста или с помощью переключателя командной строки -o:
PreferredAuthentications publickey
В ходе быстрого теста (только ssh, а не rsync) SSH немедленно завершил работу, когда мой открытый ключ не был принят, без запроса пароля.