Por que o SCP falha quando a opção “RequestTTY force” está habilitada?

3

No meu arquivo de configuração do SSH, tenho que ativar o RequestTTY force por alguns motivos importantes. E atualmente meu arquivo de configuração é assim:

Host x.x.x.x
    HostName yyyy
    StrictHostKeyChecking no
    RequestTTY force
    IdentityFile ~/path/id_rsa

Mas agora, quando executo um comando scp , ele conclui, mas cria um arquivo vazio no caminho de destino, e abaixo está o log que ele gera:

debug2: channel 0: read<=0 rfd 4 len 0
debug2: channel 0: read failed
debug2: channel 0: close_read
debug2: channel 0: input open -> drain
debug2: channel 0: ibuf empty
debug2: channel 0: send eof
debug2: channel 0: input drain -> closed
debug2: channel 0: write failed
debug2: channel 0: close_write
debug2: channel 0: send eow
debug2: channel 0: output open -> closed

Mas se eu comentar a opção RequestTTY force no arquivo de configuração, ela será executada corretamente e também copiará o arquivo adequadamente.

Por que esse comportamento ocorre? Alguém pode me fornecer uma solução alternativa para que eu não precise desativar a opção RequestTTY force e também o arquivo seria copiado corretamente?

    
por Punit Naik 22.04.2016 / 09:20

3 respostas

6

Existem muitas soluções possíveis para isso:

  • Você pode configurar sudo para não exigir tty: RequireTTY in /etc/sudoers
  • Você pode forçar a alocação tty na linha de comando nesses casos específicos, onde você precisa: ssh -tt host command
  • Você pode informar a scp para não alocar o TTY pela opção de linha de comando -T ou -o RequestTTY=no : scp -T file host:path/ ou scp -o RequestTTY=no file host:path/

As razões pelas quais isso acontece já estão explicadas. Você estraga o protocolo binário por caracteres de controle TTY e vice-versa.

    
por 22.04.2016 / 12:18
6
  1. O protocolo SCP é binário.
  2. Com o TTY ativado, os caracteres de controle têm seu significado.

Então, assim que o TTY vê um caractere nos dados binários do protocolo SCP que aparece como um caractere de controle, ele o interpreta. Particularmente, assim que há ^C (ASCII 0x03), ele aborta o processo SCP.

Use ssh -t para forçar o TTY para sessões interativas, em vez de forçá-lo globalmente usando RequestTTY .

    
por 22.04.2016 / 09:40
0

Para mim, o seguinte funcionou:

Host *.bla.fasel.com
   User horst
   RequestTTY yes

ssh com sudo -i :

$ ssh guenther.bla.fasel.com sudo -i
[email protected]'s password:
[email protected]:~#

scp com nome de usuário / senha auth:

$ scp guenther.bla.fasel.com:/etc/passwd .
Pseudo-terminal will not be allocated because stdin is not a    terminal.
[email protected]'s password:
passwd
    
por 24.02.2017 / 10:59