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

8

Я хотел бы использовать rsync в скрипте Python. Я звоню с помощью subprocessмодуля и проверяю подлинность с помощью открытых ключей, хранящихся в authorized_keyфайле на удаленном компьютере.

Единственная проблема заключается в том, что когда я использую rsync, используя неверное имя удаленного пользователя, у меня запрашивается пароль, который, очевидно, навсегда останавливает сценарий резервного копирования.

Могу ли я принудительно rsyncзавершить работу с ошибкой, если она не может аутентифицироваться, вместо запроса пароля?

Уди

Адам Матан
источник

Ответы:

9

Предполагая, что вы используете rsync с удаленной оболочкой SSH (а не, например, с сервером rsync), вы можете заставить rsync запускать SSH так, чтобы он никогда не запрашивал пароль. Например, однажды можно использовать этот вызов:

rsync -e 'ssh -o "NumberOfPasswordPrompts 0"' source user@target:/path

Это заставит rsync использовать SSH с 0 возможными попытками пароля - если он не может получить доступ, используя какой-либо другой метод аутентификации (например, открытый ключ или GSSAPI), то произойдет сбой с ошибкой. Обратите внимание, что rsync не понравится вам, когда это произойдет, и будет громко жаловаться на STDERR и порвать с кодом выхода 255.

Guss
источник
5

Вот параметры командной строки для ssh, которые я использую, чтобы сохранить его в тайне.

ssh -o stricthostkeychecking=no -o userknownhostsfile=/dev/null -o batchmode=yes -o passwordauthentication=no

Вам нужны только файлы hostkey, если вы не поддерживаете файл known_hosts и беспокоитесь о получении предупреждений MitM. Вместо того, чтобы указывать типы аутентификации, предложенные Джеймсом Ф., мне пришлось явно ограничить аутентификацию по паролю. Я использую это, чтобы поразить сотни хостов несколькими версиями ОС, поэтому это может быть просто несовместимостью.

Чад Хунейкутт
источник
1
Пожалуйста, НЕ используйте эти настройки. См. Раздел 11.5 «SSH, защищенная оболочка: полное руководство, второе издание». Согласно книге: «К сожалению, эффективный пропуск аутентификации сервера отключает важную часть безопасности SSH: устойчивость к спуфингу хоста сервера и атакам« человек посередине »! Эта ситуация также делает нецелесообразным периодическую замену ключей сервера, как и должно быть». сделано, или отозвать ключ в случае, если он, как известно, скомпрометирован (то есть, сказать клиентам больше не доверять ему). "
Мик
1
@ Мик: проблема с такой критикой в ​​том, что в некоторых случаях они совершенно неуместны. Например, я работаю в среде, где целью операций rsync является, как правило, множество встроенных систем в частной сети, скрытой глубоко внутри лаборатории. Нет никакого соединения с внешним миром вообще, и система сборки должна быть в состоянии выдвинуть обновленный код на цели. Это вполне законное использование ssh и rsync, и очевидным решением является отключение проверки хоста. Делать абсолютное правило по этому поводу не имеет никакого смысла.
Конюшня
@Stabledog - Мой совет - правильный совет для подавляющего большинства случаев использования. Тем не менее, я допускаю, что, если вы не верите, что злоумышленник может получить доступ к вашей сети для выполнения атаки MiTM, вы можете выбрать слабую конфигурацию безопасности. Конфигурация безопасности, необходимая для лабораторной среды (как вы упомянули), очевидно, будет отличаться от производственной среды, поскольку риск естественным образом уменьшается.
Мик
Справедливо. Вот философская проблема, а также практическая, хотя: ssh ценится гораздо больше, чем его способность быть защищенным , и на самом деле ... в большинстве настроек, которые я видел, безопасность - наименее важная проблема , Это просто швейцарский армейский нож для удаленных подключений всех типов. Таким образом, существует эта разница между ругательствами «пуристов безопасности» и тем, как реальные люди постоянно используют его в повседневной практике. Я не верю, что мы все просто дураки, а пуристы "правы". Вопрос в том, чтобы знать, когда нужно заботиться.
Конюшня
1

Re: предложение Джеймса (не указав tty), для подпроцесса, попробуйте ввести stdin = None в качестве параметра для Popen.

Адам Бранд
источник
0

Сначала заставьте rsync работать из оболочки, команда должна выглядеть следующим образом.

Если это не удалось, отладьте команду ssh самостоятельно. Когда все это работает, посмотрите, что происходит с сценарием Python.

Это не плохой учебник

Джеймс
источник
0

В зависимости от того, как вы запускаете rsync, отсутствие TTY или PTY может помочь.

Многие программы проверяют наличие контрольного TTY, прежде чем предлагать пользователю ввести данные. Поведение system () и аналогичных вызовов по умолчанию заключается в предоставлении tty подпрограммам, но вы можете отключить это.

Также возможно полностью отключить аутентификацию по паролю на удаленной стороне, если вы управляете обеими системами и хотите избежать аутентификации по паролю для обеспечения безопасности при решении этой проблемы.

Если вы выполняете rsync через SSH, вы можете добавить следующее в файл ssh_config для рассматриваемого хоста или через ключ командной строки -o:

PreferredAuthentications publickey

На быстром тесте (просто ssh, а не rsync), который заставил SSH немедленно завершить работу, когда мой открытый ключ не был принят без запроса пароля.

Джеймс Ф
источник