senha problema ao alimentar um arquivo remoto em diff

2

Quando quero comparar um arquivo local com um arquivo remoto, qualquer um deles geralmente funciona:

$ ssh remote cat file | diff file -
$ diff file <(ssh remote cat file)

No entanto, às vezes (especialmente quando a senha é necessária), eles falham assim:

$ ssh remote cat file | diff file -
1,162d0
< ...
< ...
Password: 

Aqui, diff não espera que ssh seja concluído e considera o segundo arquivo vazio. É somente após diff terminar que ssh pede a senha, mas é tarde demais.

$ diff file <(ssh remote cat file)
Password: 
Password:       # asking again after a few seconds
#&%Pasword:     # the typed raw password leaks into the terminal
user@remote's password:
Permission denied, please try again.
user@remote's password:
Permission denied, please try again.
user@remote's password:
Received disconnect from XXX.XX.XX.XX: 2: Too many authentication failures for user
1,162d0
< ...
< ...

Desta vez, ssh pede a senha, mas a senha digitada é retornada para o terminal e ssh não a obtém. Finalmente, ssh falha e diff continua com um segundo arquivo vazio.

Você pode explicar por que isso está acontecendo ou o que está acontecendo em detalhes sob o capô ?

    
por musiphil 27.07.2012 / 01:55

1 resposta

2

Quando você executa o ssh primeiro:

ssh remote 'cat file' | cat

ssh obtém seu terminal de controle como stdin, para que você possa digitar sua senha sem problemas.

Quando você usa a substituição de processos do bash, o stdin permanece conectado ao primeiro comando, e o canal de saída do subprocesso é passado para o primeiro comando como um argumento:

cat <(ssh remote 'cat file')

Se a negociação ssh tiver êxito, /dev/fd/63 será um canal contendo a saída de ssh remote 'cat file' .

Isso pode ser demonstrado com o seguinte comando:

$ echo <(ls)
/dev/fd/63

A parte importante disso é que seu terminal está conectado à stdin de cat , não à ssh 's . Quando isso é executado, cat obtém um argumento de linha de comando como /dev/fd/63 . Portanto, o gato ignora completamente o stdin; no entanto, ele ainda está conectado ao processo cat, e não ssh , por isso sua senha não chega a lugar nenhum.

Se você quiser mudar isso, você precisará executar ssh primeiro e canalizar a saída para diff , como você já demonstrou acima:

ssh remote 'cat file' | diff file -
    
por 27.07.2012 / 16:18