Rsync sobre SSH não recebendo nenhum presente tty

4

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

    
por Lynn Owens 29.08.2013 / 05:06

4 respostas

6

Às vezes você pensa demais sobre as coisas.

O Rsync não foi instalado no sistema remoto.

/ facepalm

    
por 30.08.2013 / 04:56
2

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 .

    
por 30.06.2017 / 22:39
1
  1. Você não precisa de sudo se o trabalho cron estiver sendo executado como root.
  2. Há uma enorme quantidade de sinalizadores desnecessários: -rlptgoD ; remova e substitua por -a .
  3. A mensagem TTY de sudo é para o local TTY, enquanto a opção -t para ssh é para o remoto TTY. Não confunda os dois.
  4. Não -v e -q se contradizem?
  5. Sua última preocupação deve ser se a chave privada do SSH local está criptografada ou não. O primeiro não pode ser usado com execuções autônomas (por exemplo, aquelas em que stdin não é um TTY; elas não são executadas em um terminal ou emulador de terminal).

EDIT / UPDATE :

  • Eu retiro 1 e 2.
  • 3 deve ser sobre não haver TTY local quando cron estiver sendo executado e o SSH não alocar um remotamente, já que não há um local.
por 29.08.2013 / 05:47
0

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?

    
por 29.08.2013 / 05:21