por que a opção ssh -t adiciona cr & lf na saída redirecionada

1

Eu conecto do meu windowsbox com putty a uma caixa linux. Depois disso, faço o seguinte:

no servidor A:

serverA: file /etc/motd
/etc/motd: : ASCII English text

no servidor B:

serverB: ssh -t user@serverA "cat /etc/motd" > /etc/motd.serverA
serverB: file /etc/motd.serverA
/etc/motd.serverA:  ASCII text, with CRLF line terminators

Por que a saída redistribuída agora tem CR & LF Isso acontece apenas com a opção -t do ssh. -t é necessário se eu precisar executar comandos em um login ssh com sudo. como por exemplo:

serverB: ssh -t user@serverA "sudo cat /etc/shadow" > /etc/shadow

Obrigado pelas suas sugestões

    
por pkr 29.01.2018 / 16:12

2 respostas

3

Inspecione as configurações de TTY.

$ ssh -t somewhere 'stty -a' | grep cr
iflags: -istrip icrnl -inlcr -igncr -iuclc ixon -ixoff ixany imaxbel
oflags: opost onlcr -ocrnl -onocr -onlret -olcuc oxtabs -onoeot
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -mdmbuf

Elas podem variar, mas mostram aqui que, por padrão, em ssh -t que igncr "ignore CR" está desabilitado na entrada e para a saída que onlcr está definida (mapeia NL para CR-NL) e que CR não são mutilados ou omitidos. Pode-se procurar esses termos no manual stty(1) , e ver também termios(4) (que o linux pode colocar em alguma outra seção man).

As configurações também podem ser manipuladas (mas isso pode, no entanto, quebrar coisas que, por algum motivo, precisam de onlcr set):

$ ssh -t somehost 'stty onlcr; cat /etc/motd' > x ; file x
x: ASCII English text, with CRLF line terminators
$ ssh -t somehost 'stty -onlcr; cat /etc/motd' > x ; file x
x: ASCII English text
$ 

Pode ser mais sensato usar scp ou sftp para copiar dados para eliminar o risco de (pseudo) tty manuseio CR / NL causar alterações no conteúdo do arquivo.

    
por 29.01.2018 / 16:46
0

A opção -t que você está usando para forçar uma alocação pseudo-tty para sua sessão ssh faz com que STDOUT seja armazenado em buffer de linha, porque (em poucas palavras) o shell supõe que os recursos estão sendo informados. está usando um terminal interativo.

Portanto, a saída é entregue de uma maneira que faria sentido em um terminal interativo. Dependendo do que você está fazendo nesse shell e de como seu ambiente está configurado, se você observar mais de perto os dados, poderá até ver os códigos de cores, que podem parecer com [^[0;32m] .

O Sudo é um aplicativo projetado para solicitar uma senha, portanto, o requisito para um TTY. Ele quer ser capaz de efetuar os recursos do terminal, a) pedir uma senha para STDOUT e b) mascarar a entrada que você fornece de volta no STDIN de ser exibida no STDOUT.

Portanto, o Sudo requer a saída de buffers da linha -t e -t , para que você veja os caracteres de controle adicionais que normalmente seriam interpretados pelo terminal em si, e não transmitidos para STDOUT.

    
por 29.01.2018 / 16:46