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