원격 파일을 diff로 가져올 때 비밀번호 문제

원격 파일을 diff로 가져올 때 비밀번호 문제

로컬 파일을 원격 파일과 비교하려는 경우 일반적으로 다음 중 하나가 작동합니다.

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

그러나 때때로(특히 비밀번호를 요구할 때) 다음과 같이 실패합니다.

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

여기서는 완료를 diff기다리지 않고 ssh두 번째 파일이 비어 있는 것으로 간주합니다. diff완료될 때까지 비밀번호를 묻지 않지만 ssh너무 늦었습니다.

$ 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
< ...
< ...

이번에는 ssh비밀번호를 물어보는데, 입력한 비밀번호가 단말기에 에코되지만 ssh검색할 수는 없습니다. 마지막으로 ssh실패하고 diff빈 두 번째 파일로 계속됩니다.

왜 이런 일이 발생하는지 설명해 주시겠습니까? 아니면 무슨 일이 일어나고 있는지 자세히 설명해 주시겠습니까?후드?

답변1

SSH를 먼저 실행하면:

ssh remote 'cat file' | cat

ssh는 제어 터미널을 표준 입력으로 사용하므로 문제 없이 비밀번호를 입력할 수 있습니다.

배쉬를 사용할 때프로세스 교체, stdin은 첫 번째 명령에 연결된 상태로 유지되고 하위 프로세스의 출력 파이프는 첫 번째 명령에 인수로 전달됩니다.

cat <(ssh remote 'cat file')

SSH 협상이 성공하면 /dev/fd/63출력이 포함된 파이프가 생성됩니다 ssh remote 'cat file'.

이는 다음 명령으로 시연할 수 있습니다.

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

중요한 부분은터미널이 catstdin 에 연결되어 있지 ssh않습니다.. 실행되면 cat명령줄 인수를 얻습니다(예 /dev/fd/63: cat은 stdin을 완전히 무시하지만 대신 여전히 cat 프로세스에 연결되어 있으므로 ssh비밀번호를 사용할 수 없습니다).

이를 변경하려면 먼저 위에 표시된 대로 ssh출력을 실행하고 에 파이프 해야 합니다.diff

ssh remote 'cat file' | diff file -

관련 정보