Перевод rsync в неинтерактивный режим

Перевод rsync в неинтерактивный режим

Я хотел бы использовать 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 немедленно завершил работу, когда мой открытый ключ не был принят, без запроса пароля.

Связанный контент