Ssh

為什麼啟用“RequestTTY force”選項時 SCP 會失敗?

  • February 24, 2017

RequestTTY force在我的 SSH 配置文件中,出於一些重要原因,我必須啟用 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選項並且文件也可以正確複製?

有很多可能的解決方案:

  • 您可以配置sudo不要求 tty:RequireTTY/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 控製字元破壞了二進制協議,反之亦然。

  1. SCP 協議是二進制的。
  2. 啟用 TTY 後,控製字元有其含義。

因此,一旦 TTY 在 SCP 協議二進制數據中看到一個作為控製字元出現的字元,它就會對其進行解釋。特別是一旦出現^C(ASCII 0x03),它就會中止 SCP 程序。

用於ssh -t強制 TTY 進行互動式會話,而不是使用RequestTTY.

引用自:https://unix.stackexchange.com/questions/278284