web-dev-qa-db-ja.com

「RequestTTYforce」オプションが有効になっているとSCPが失敗するのはなぜですか?

SSH構成ファイルで、いくつかの重要な理由からRequestTTY forceを有効にする必要があります。そして現在、私の設定ファイルは次のようになっています。

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オプションを無効にする必要がなく、ファイルが適切にコピーされるように、誰かが回避策を教えてもらえますか?

4
Punit Naik

そのための多くの可能な解決策があります:

  • Ttyを必要としないようにSudoを構成できます:RequireTTY in /etc/sudoers
  • 必要に応じて、コマンドラインでttyの割り当てを強制できます。ssh -tt Host command
  • -Tまたは-o RequestTTY=noコマンドラインオプション:scp -T file Host:path/またはscp -o RequestTTY=no file Host:path/を使用して、scpにTTYを割り当てないように指示できます。

それが起こる理由はすでに説明されています。 TTY制御文字によってバイナリプロトコルを台無しにし、その逆も同様です。

7
Jakuje
  1. SCPプロトコルはバイナリプロトコルです。
  2. TTYを有効にすると、制御文字に意味があります。

したがって、TTYは、制御文字として表示されるSCPプロトコルバイナリデータ内の文字を検出するとすぐに、それを解釈します。特に^C(ASCII 0x03)があるとすぐに、SCPプロセスを中止します。

RequestTTYを使用してグローバルに強制するのではなく、ssh -tを使用してインタラクティブセッションのTTYを強制します。

6
Martin Prikryl

私にとって、以下はうまくいきました:

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

ssh with Sudo -i

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

scp with username/password auth:

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