GNU/Linux >> Linux の 問題 >  >> Linux

Ssh -tオプションがリダイレクト出力にCrとLfを追加するのはなぜですか?

Windowsboxからパテを使ってLinuxボックスに接続します。その後、私は次のことを行います:

サーバーA:

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

サーバーB:

serverB: ssh -t [email protected] "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 [email protected] "sudo cat /etc/shadow" > /etc/shadow

推測してくれてありがとう

承認された回答:

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 「CRを無視する」は、入力では無効になっており、出力ではonlcr が設定され(NLをCR-NLにマップ)、それ以外の場合、CRはマングルまたは省略されません。 stty(1)でこれらの用語を検索できます マニュアル、およびtermios(4)も参照してください (Linuxは他のmanセクションに配置する可能性があります)。

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

$ 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処理がファイルの内容に変更を加えるリスクを排除します。


Linux
  1. シェルコマンド置換が末尾の改行文字を飲み込むのはなぜですか?

  2. sudoがエイリアスを無視するのはなぜですか?

  3. サブシェルの出力をプロセスにリダイレクトしますか?

  1. Ssh – FirefoxがSshよりも遅いのはなぜですか?

  2. Ssh – Tcp-keepaliveはSshでどのように機能しますか?

  3. Unix時間が1970-01-01から始まるのはなぜですか?

  1. なぜ`exit&`が機能しないのですか?

  2. Fork()を使用するプログラムが出力を複数回出力することがあるのはなぜですか?

  3. このシェル パイプラインが終了するのはなぜですか?