为什么启用“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

有很多可能的解决方案:

  • 您可以配置sudo为不需要 tty: RequireTTYin/etc/sudoers
  • 在这些特定情况下,您可以在需要时在命令行上强制 tty 分配:ssh -tt host command
  • 您可以通过或命令行选项告诉scp不分配 TTY :或-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

sshsudo -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

相关内容