web-dev-qa-db-ja.com

ssh -tオプションがリダイレクトされた出力にcr&lfを追加するのはなぜですか

PuTTYを使用してWindowsボックスからLinuxボックスに接続します。その後、私は次のことを行います。

サーバーA:

serverA: file /etc/motd
/etc/motd: : ASCII English text

サーバーB:

serverB: ssh -t user@serverA "cat /etc/motd" > /etc/motd.serverA
serverB: file /etc/motd.serverA
/etc/motd.serverA:  ASCII text, with CRLF line terminators

再定義された出力にCRとLFが含まれるのはなぜですか?これは、sshの-tオプションでのみ発生します。 -sudoを使用してsshログインでコマンドを実行する必要がある場合は、tが必要です。たとえば:

serverB: ssh -t user@serverA "Sudo cat /etc/shadow" > /etc/shadow

あなたの推測をありがとう

2
pkr

TTY設定を調べます。

_$ ssh -t somewhere 'stty -a' | grep cr
iflags: -istrip icrnl -inlcr -igncr -iuclc ixon -ixoff ixany imaxbel
oflags: opost onlcr -ocrnl -onocr -onlret -olcuc oxtabs -onoeot
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -mdmbuf
_

これらは異なる場合がありますが、ここでは、デフォルトで_ssh -t_の下で、入力でigncr "ignore CR"が無効になっており、出力ではonlcrが設定されていることを示しています(NLをCR-NL)およびそのCRは、それ以外の場合はマングルまたは省略されません。これらの用語はstty(1)マニュアルで検索でき、termios(4)(Linuxが他のmanセクションに配置する場合もあります)も参照できます。

設定をいじることもできます(ただし、これは何らかの理由でonlcr setが必要なことを壊す可能性があります):

_$ ssh -t somehost 'stty onlcr; cat /etc/motd' > x ; file x
x: ASCII English text, with CRLF line terminators
$ ssh -t somehost 'stty -onlcr; cat /etc/motd' > x ; file x
x: ASCII English text
$ 
_

代わりにscpまたはsftpを使用してデータをコピーし、(疑似)tty CR/NL処理によってファイルの内容が変更されるリスクを排除する方が賢明な場合があります。

4
thrig

Sshセッションに疑似tty割り当てを強制するために使用している-tオプションにより、STDOUTがラインバッファリングされます。これは、シェルが(簡単に言えば)伝えられている機能から、あなたがインタラクティブ端末を再使用します。

したがって、出力はインタラクティブ端末で意味のある方法で配信されます。そのシェルで何をしているか、および環境がどのように設定されているかに応じて、データをさらに詳しく調べると、[^[0;32m]のようなカラーコードが表示される場合があります。

Sudoは、パスワードを要求するように設計されたアプリケーションであるため、TTYが必要です。これは、端末機能を有効にして、a)STDOUTのパスワードを要求し、b)STDINに入力した入力をSTDOUTに表示されないようにマスクできるようにする必要があります。

したがって、Sudoは-tおよび-t行バッファー出力を必要とするため、通常は端末自体によって解釈され、STDOUTに渡されない追加の制御文字が表示されます。

0
Tim Kennedy