Às vezes você pensa demais sobre as coisas.
O Rsync não foi instalado no sistema remoto.
/ facepalm
Estou usando o seguinte comando no crontab do root no Debian.
rsync -vqrlHEAXogDtzhi --log-file=${LOG} --progress --rsync-path="sudo /usr/bin/rsync" --exclude-from=$CONFIG_DIR/excludes -e "ssh -i /home/backups/.ssh/id_rsa" backups@${HOSTNAME}:/ ${BACKUP_DIR}
E estou recebendo o seguinte:
sudo: no tty present and no askpass program specified
Eu tentei adicionar -t ao comando ssh e recebo:
Pseudo-terminal will not be allocated because stdin is not a terminal.
Eu tentei adicionar -t -t ao comando ssh e recebo:
protocol version mismatch -- is your shell clean?
Eu adicionei um .hushlogin ao usuário de backups na caixa remota e confirmei que eu posso ssh como backups usando uma chave para a caixa remota sem nada exibido (o login é silenciado). Eu ainda recebo essas mensagens.
Note que eu posso fazer ssh como backups para a caixa remota usando uma chave com sucesso.
Note que meu sudo não tem a opção -tt.
Observe que o seguinte é definido no arquivo / etc / sudoers de origem e destino:
backups ALL= NOPASSWD:/usr/bin/rsync
Observe que meu arquivo / etc / sudoers não possui nenhuma referência a:
Defaults requiretty
Observe que não irei ecoar minha senha no comando.
Como posso eliminar esse gato? : |
Obrigado
Colocando isso aqui para que eu possa lembrar & compartilhe este truque:
rsync -av -e "ssh -tt" --rsync-path="stty raw -echo; sudo /usr/bin/rsync" user@${HOSTNAME}:/ ${DEST_DIR}
Este método parece ignorar o requisito de um tty como imposto em algum arquivo /etc/sudoers
padrão do sistema com Defaults requiretty
. Esta informação foi criada depois de analisar esta SO question & respostas .
Nessa resposta, eles recomendam remover Defaults requiretty
de /etc/sudoers
. Esse é o método mais fácil. No entanto, se você não conseguir modificar o host remoto /etc/sudoers
para remover essa opção de configuração, tente forçar o local rsync
a usar ssh -tt
. Essa opção para ssh
é descrita na ssh
página do manual do cliente assim:
Force pseudo-terminal allocation. This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services. Multiple -t options force tty allocation, even if ssh has no local tty.
Assim, forçamos o ssh a alocar uma pseudo-tty para evitar o erro:
Pseudo-terminal will not be allocated because stdin is not a terminal.
stty: standard input: Inappropriate ioctl for device
sudo: sorry, you must have a tty to run sudo
Em seguida, o --rsync-path
é substituído por um comando para fazer o seguinte:
stty raw -echo; sudo /usr/bin/rsync
stty raw -echo
é definir a disciplina de linha do terminal remoto como passagem. Isso efetivamente faz com que ele se comporte como um pipe que seria usado em vez de um pseudo-terminal sem -tt
.
Em seguida, o comando rsync remoto será sudo /usr/bin/rsync
, que agora tem uma pseudo-tty e passará a requiretty
para sudo
.
sudo
se o trabalho cron
estiver sendo executado como root. -rlptgoD
; remova e substitua por -a
. sudo
é para o local TTY, enquanto a opção -t
para ssh
é para o remoto TTY. Não confunda os dois. -v
e -q
se contradizem? stdin
não é um TTY; elas não são executadas em um terminal ou emulador de terminal). EDIT / UPDATE :
cron
estiver sendo executado e o SSH não alocar um remotamente, já que não há um local. Vou adivinhar que assim é um problema de chave ssh. A chave privada do backup tem uma frase secreta ou a chave pública não está no keychain do usuário remoto. Talvez sua tentativa anterior tenha usado uma chave que já estava carregada no seu chaveiro?