"RequestTTY 적용" 옵션이 활성화되면 SCP가 실패하는 이유는 무엇입니까?

"RequestTTY 적용" 옵션이 활성화되면 SCP가 실패하는 이유는 무엇입니까?

RequestTTY force내 SSH 구성 파일에서 몇 가지 중요한 이유로 이를 활성화해야 합니다. 현재 내 구성 파일은 다음과 같습니다.

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

그러나 이제 명령을 실행하면 scp완료되지만 대상 경로에 빈 파일이 생성되고 아래는 생성되는 로그입니다.

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

RequestTTY force그러나 구성 파일의 옵션을 주석 처리하면 올바르게 실행되고 파일이 올바르게 복사됩니다.

왜 이런 문제가 발생합니까? 옵션 을 비활성화하지 않아도 RequestTTY force파일이 올바르게 복사될 수 있도록 해결 방법을 제공할 수 있는 사람이 있습니까?

답변1

가능한 해결 방법은 다양합니다.

  • sudotty가 필요하지 않도록 구성할 수 있습니다 RequireTTY./etc/sudoers
  • 이러한 특정한 경우에는 필요할 때 명령줄에서 tty 할당을 강제로 수행할 수 있습니다.ssh -tt host command
  • 명령줄 옵션을 통해 TTY를 할당하지 않도록 지정할 수 있습니다 scp. 또는-T-o RequestTTY=noscp -T file host:path/scp -o RequestTTY=no file host:path/

이런 일이 발생하는 이유는 이미 설명되었습니다. TTY 제어 문자는 바이너리 프로토콜을 깨뜨리고 그 반대의 경우도 마찬가지입니다.

답변2

  1. SCP 프로토콜은 바이너리 프로토콜입니다.
  2. TTY가 활성화되면 제어 문자에 의미가 있습니다.

따라서 TTY는 SCP 프로토콜 바이너리 데이터에서 제어 문자로 나타나는 문자를 확인하면 이를 해석합니다. 특히, 이 문제가 발생하면 ^C(ASCII 0x03) SCP 프로세스가 중단됩니다.

ssh -t를 사용하는 대신 대화형 세션에 대해 TTY를 강제하는 데 사용됩니다 RequestTTY.

답변3

나에게는 다음이 효과적이었습니다.

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

ssh그리고 sudo -i:

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

scp사용자 이름/비밀번호 인증 사용:

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

관련 정보