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
オプションを無効にする必要がなく、ファイルが適切にコピーされるように、誰かが回避策を教えてもらえますか?
そのための多くの可能な解決策があります:
Sudo
を構成できます:RequireTTY
in /etc/sudoers
ssh -tt Host command
-T
または-o RequestTTY=no
コマンドラインオプション:scp -T file Host:path/
またはscp -o RequestTTY=no file Host:path/
を使用して、scp
にTTYを割り当てないように指示できます。それが起こる理由はすでに説明されています。 TTY制御文字によってバイナリプロトコルを台無しにし、その逆も同様です。
したがって、TTYは、制御文字として表示されるSCPプロトコルバイナリデータ内の文字を検出するとすぐに、それを解釈します。特に^C
(ASCII 0x03)があるとすぐに、SCPプロセスを中止します。
RequestTTY
を使用してグローバルに強制するのではなく、ssh -t
を使用してインタラクティブセッションのTTYを強制します。
私にとって、以下はうまくいきました:
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