plinkの出力にどのような問題がありますか?

plinkの出力にどのような問題がありますか?

私の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が提案したように実行してlslikeを呼び出すと、通常のシェルエイリアスの代わりに実行可能ファイルの実行可能ファイルを\ls呼び出すことができます。このシェルエイリアスを削除するには、次のようにします。ls$PATHls --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=:

これらのそれぞれは、ターミナルエスケープコードの左側、ターミナルエスケープコードの右側、およびターミナルエスケープシーケンスの終わりを処理します。出力が示すように、通常のファイルは通常シェーディングされていないため、dircolorsmyは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$

lsecエスケープ文字は出力の先頭に一度印刷し、エスケープ文字はlc最後に一度印刷する必要があります。rc毎回ファイル名の直前または後ろに表示されます。このecシーケンスは設定されている場合にのみ表示されます。デフォルトの動作は、andと組み合わせるreset代わりに、またはシーケンスを使用することです。rs出力には、次のような構成が表示されます。lcrc

`lc=\033[:rc=m:rs=0...`

...一般的ですが、ecより多くの制御機能を提供します。たとえば、\0null で区切られたものが必要な場合は、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できます。plinkplink

  • 最後の問題は、lsエイリアスコマンドラインオプションに関係なくinを提供することです$LS_COLORS。質問2の後者の場合と同様に、$LS_COLORSloginを使用するときに単にnull値に設定できますplink。これにより、カラーコードがレンダリングされず、ls --color=auto違いも発生しません。

おすすめ記事