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:RequireTTY
in/etc/sudoers
- 在这些特定情况下,您可以在需要时在命令行上强制 tty 分配:
ssh -tt host command
- 您可以通过或命令行选项告诉
scp
不分配 TTY :或-T
-o RequestTTY=no
scp -T file host:path/
scp -o RequestTTY=no file host:path/
发生这种情况的原因已经解释过了。 TTY 控制字符会破坏二进制协议,反之亦然。
答案2
- SCP 协议是二进制协议。
- 启用 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