私のWindows7コンピュータでPuTTyアプリケーションのインストールパスに移動し、次を実行します。
plink <hostname>
リモートLinuxホストに接続します。
出力に認識できない文字が一部表示されます。
-bash-3.2$ ls -lrt
←[00mtotal 96
drwx------ 5 lg262728 lg262728 4096 Jun 10 15:32 ←[00;34mmyScripts←[00m
drwx------ 2 lg262728 lg262728 4096 Jun 12 13:19 ←[00;34mmyLangs←[00m
drwxr-xr-x 4 lg262728 lg262728 4096 Jul 1 07:43 ←[00;34mmyWorkSpace←[00m
←[m-bash-3.2$
ここに問題がありますか?エンコーディングに関連していますか?
答え1
ミハスが説明するように、これは端末エスケープシーケンスです。解析方法は端末によって異なります。 michasが提案したように実行してls
likeを呼び出すと、通常のシェルエイリアスの代わりに実行可能ファイルの実行可能ファイルを\ls
呼び出すことができます。このシェルエイリアスを削除するには、次のようにします。ls
$PATH
ls --color=auto
unalias ls
オプションを追加することもできます。
ls ${opts} --color=never
...いつでもオフにしてください。たとえば、カラーシーケンスを無効にする別の方法は次のとおりです。
ls ${opts} | cat
--color=auto
これは、モードでls
出力をチェックしてttyデバイスであることを確認します。そうであれば、ターミナルエスケープを注入して出力に色を付けるために機能します。端末デバイスでない場合(たとえば、|pipe
上記の例のようにファイルの場合)、ls
エスケープシーケンスは印刷されません。これは、出力色を指定できるほとんどのアプリケーションの標準動作です。
しかし、もっと興味深いのは、ほとんどの実装でこの動作を制御するために提供するAPIですls
。私はこれが面白かったし、この答えを書くようになりました。
ls
環境変数の値によって、出力のどの部分に色が割り当てられるかを決定します$LS_COLORS
。このdircolors
アプリケーションは、この問題を処理するためのインターフェースです。たとえば、私のコンピュータでは次のようになります。
dircolors -p
...
# Below are the color init strings for the basic file types. A color init
# string consists of one or more of the following numeric codes:
# Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
#NORMAL 00 # no color code at all
#FILE 00 # regular file: use no color at all
RESET 0 # reset to "normal" color
DIR 01;34 # directory
LINK 01;36 # symbolic link. (If you set this to 'target' instead of a
# numerical value, the color is as for the file pointed to.)
...など。比較すると...
printf %s "$LS_COLORS"
rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:\
bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:\
ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:...
ls
...私たちは何が起こっているのか理解し始めることができます。しかし、どちらにも具体的に表示されていないのはコンパイルされた値です。
lc=\e[:rc=m:ec=:
これらのそれぞれは、ターミナルエスケープコードの左側、ターミナルエスケープコードの右側、およびターミナルエスケープシーケンスの終わりを処理します。出力が示すように、通常のファイルは通常シェーディングされていないため、dircolors
myはfi=:
デフォルトに設定されません。ls
しかし、これらすべてをまとめてもう少し追加すると、次のようになります。
mkdir dir ; touch file1 file2
LS_COLORS=\
'lc=\nLEFT_SIDE_ESCAPE_SEQUENCE\n:'\
'rc=\nRIGHT_SIDE_ESCAPE_SEQUENCE\n:'\
'ec=\nEND_OF_ESCAPE_SEQUENCE:'\
'fi=REGULAR_FILE_ESCAPE_CODE:'\
'di=DIRECTORY_ESCAPE_CODE:'\
ls -l --color=always | cat -A
total 0$
drwxr-xr-x 1 mikeserv mikeserv 0 Jul 10 01:05 $
END_OF_ESCAPE_SEQUENCE$
LEFT_SIDE_ESCAPE_SEQUENCE$
DIRECTORY_ESCAPE_CODE$
RIGHT_SIDE_ESCAPE_SEQUENCE$
dir$
END_OF_ESCAPE_SEQUENCE/$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 $
LEFT_SIDE_ESCAPE_SEQUENCE$
REGULAR_FILE_ESCAPE_CODE$
RIGHT_SIDE_ESCAPE_SEQUENCE$
file1$
END_OF_ESCAPE_SEQUENCE$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 $
LEFT_SIDE_ESCAPE_SEQUENCE$
REGULAR_FILE_ESCAPE_CODE$
RIGHT_SIDE_ESCAPE_SEQUENCE$
file2$
END_OF_ESCAPE_SEQUENCE$
$
LEFT_SIDE_ESCAPE_SEQUENCE$
$
RIGHT_SIDE_ESCAPE_SEQUENCE$
ls
ec
エスケープ文字は出力の先頭に一度印刷し、エスケープ文字はlc
最後に一度印刷する必要があります。rc
毎回ファイル名の直前または後ろに表示されます。このec
シーケンスは設定されている場合にのみ表示されます。デフォルトの動作は、andと組み合わせるreset
代わりに、またはシーケンスを使用することです。rs
出力には、次のような構成が表示されます。lc
rc
`lc=\033[:rc=m:rs=0...`
...一般的ですが、ec
より多くの制御機能を提供します。たとえば、\0
null で区切られたものが必要な場合は、ls
次のように簡単に実行できます。
LS_COLORS='lc=\0:rc=:ec=\0\0\0:fi=:di=:' ls -l --color=always | cat -A
total 0$
drwxr-xr-x 1 mikeserv mikeserv 0 Jul 10 01:05 ^@^@^@^@dir^@^@^@/$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file1^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file2^@^@^@$
^@%
ec
最初のエスケープシーケンスを印刷する前に、もう1つを取得し、最後にもう1つを取得することを再確認できます。これら2つに加えて、\0
ヌルバイトはファイル名の直前または後ろにのみ表示されます。/
周囲のnull以外のディレクトリを表す追加のスラッシュも表示できます。
これは、新しい行を含むファイル名にも適用されます。
touch 'new
line
file'
LS_COLORS='lc=\0:rc=:ec=\0\0\0:fi=:di=:' \
ls -l --color=always | cat -A
total 0$
drwxr-xr-x 1 mikeserv mikeserv 0 Jul 10 01:05 ^@^@^@^@dir^@^@^@/$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file1^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file2^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:43 ^@new$
line$
file^@^@^@$
^@%
これらすべてをまとめると、あなたの場合には3つの主な問題があります。
- まず、端末デバイスが端末の色エスケープを正しく解釈しないか、端末から
plink
読み取ることができないようにします。どちらが本当かはわかりませんが、plink
文書これについてはこんな言葉があります。
サーバーから送信された出力はコマンドプロンプトウィンドウに直接書き込まれるため、サーバーが期待する方法で端末制御コードを解釈できない可能性があります。たとえば、フルスクリーンアプリケーションを実行すると、ウィンドウに奇妙な文字が表示されることがあります。このようなインタラクティブな接続はPlinkの焦点ではありません。
他のプロトコルを使用して接続するには、コマンドラインオプションに、
-ssh
またはを-telnet
提供できます。たとえば、SSH接続を確立するには、次のようにします。-rlogin
-raw
Z:\sysosd>plink -ssh login.example.com
login as:
PuTTY保存セッションを設定した場合は、ホスト名の代わりに保存されたセッション名を指定できます。これにより、公開鍵認証を使用し、ユーザー名を指定し、PuTTYの他のほとんどの機能を使用できます。
Z:\sysosd>plink my-ssh-session
Sent username "fred"
Authenticating with public key "fred@winbox"
Last login: Thu Dec 6 19:25:33 2001 from :0.0
fred@flunky:~$
これらのオプションのいずれかが機能しない場合、または実行可能な場合は、
plink
ログイン時に取得したファイルで確認を実行して問題を解決できます。.${shell}rc
したがって、ls
エイリアスを有効にできます。ただログインデバイスが次の場合いいえ接続plink
。または完全に削除することもできますが、そうすると、ls
すべてのログインセッションが無色でレンダリングされます。ログインunalias ls
を使用してエイリアスのみを削除するには、ログインコマンドにコマンドを追加することもalias ls='ls --color=never
できます。plink
plink
最後の問題は、
ls
エイリアスコマンドラインオプションに関係なくinを提供することです$LS_COLORS
。質問2の後者の場合と同様に、$LS_COLORS
loginを使用するときに単にnull値に設定できますplink
。これにより、カラーコードがレンダリングされず、ls --color=auto
違いも発生しません。
答え2
色を設定するエスケープシーケンスは次のとおりです。
←[00;34
青を開こう←[00m
色をリセットしてみてください。
これらのシーケンスの解釈と色の指定は端末に依存します。
現実はputty
それを解釈できる独自の端末を持っています。
を使用している場合は、plink
印刷する以外に、これを行うことができない Windows 端末を使用しています。
リモートホストにこれを入力すると、type ls
次のように印刷されます。
ls is aliased to `ls --color=auto'
これにより--color=auto
、これらの色のシーケンスが生成されます。と入力してエイリアシングを無効にすると、\ls
色の順序が消えます。
答え3
次の内容が役に立ちます。
http://adoxa.altervista.org/ansicon/
plinkを引数として呼び出すと、ansicon.exe
エスケープシーケンスが自動的に変換されます。 Linuxボックスに接続するとls
。
答え4
この奇妙な動作は、ansiエスケープコードによって引き起こされます。 ansiコードを解釈し、それを表示するansicon.exeプログラム(ansicon plink.exe plinkパラメータ)をダウンロードすると、シェルによって生成された色を確認し、表示されたエスケープシーケンスを削除できます。