Eu gostaria de usar o rsync em um script python. Estou chamando-o usando o subprocess
módulo e autenticando usando chaves públicas armazenadas no authorized_key
arquivo da máquina remota.
O único problema é que quando uso o rsync com um nome de usuário remoto incorreto, sou solicitada uma senha, o que obviamente interrompe o script de backup para sempre.
Posso forçar rsync
a saída com erro se não for possível autenticar, em vez de solicitar a senha?
Udi
Responder1
Supondo que você use o rsync com um shell remoto SSH (e não - por exemplo - com um servidor rsync), você poderá fazer com que o rsync execute o SSH de uma maneira que nunca solicitará uma senha. Por exemplo, uma vez pode usar esta chamada:
rsync -e 'ssh -o "NumberOfPasswordPrompts 0"' source user@target:/path
Isso forçará o rsync a usar SSH com 0 possíveis tentativas de senha - se não conseguir obter acesso usando algum outro método de autenticação (como chave pública ou GSSAPI), ele falhará com um erro. Observe que o rsync não gostará de você quando isso acontecer e reclamará em voz alta com o STDERR e interromperá o código de saída 255.
Responder2
Aqui estão as opções de linha de comando para ssh que eu uso para mantê-lo silencioso.
ssh -o stricthostkeychecking=no -o userknownhostsfile=/dev/null -o batchmode=yes -o passwordauthentication=no
Você só precisa do material hostkey se não mantiver seu arquivoknown_hosts e estiver preocupado em receber avisos do MitM. Em vez de especificar os tipos de autenticação sugeridos por James F, tive que restringir explicitamente a autenticação por senha. Eu uso isso para atingir centenas de hosts com algumas versões de sistema operacional diferentes, portanto, pode ser apenas uma incompatibilidade.
Responder3
re: sugestão de James (sem dar tty), para subprocesso, tente colocar stdin=None como parâmetro para Popen.
Responder4
Dependendo de como você está iniciando o rsync, não fornecer um TTY ou PTY pode ajudar.
Muitos programas verificam se possuem um TTY de controle antes de decidir solicitar a entrada do usuário. O comportamento padrão de system() e chamadas semelhantes é fornecer um tty para subprogramas, mas você pode desabilitar isso.
Também pode ser possível desabilitar totalmente a autenticação por senha no lado remoto se você estiver no controle de ambos os sistemas e quiser evitar a autenticação por senha para obter benefícios de segurança ao resolver esse problema.
Se estiver fazendo rsync por SSH, você pode adicionar o seguinte ao seu arquivo ssh_config para o host em questão ou por meio da opção de linha de comando -o:
PreferredAuthentications publickey
Em um teste rápido (apenas ssh, não rsync) que fez com que o SSH fosse encerrado imediatamente quando minha chave pública não foi aceita sem solicitar uma senha.