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첫 번째 이스케이프 시퀀스를 인쇄하기 전에 하나를 추가로 얻고 마지막에 하나를 더 얻는 것을 다시 볼 수 있습니다 . 이 두 가지 외에도 \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^@^@^@$
^@%                                       

이 모든 것을 종합해 보면 귀하의 경우에는 세 가지 주요 문제가 있으며 그 중 하나가 해결되면 다른 문제도 제거될 수 있다고 추측할 수 있습니다.

  • 첫째, 터미널 장치가 터미널 색상 이스케이프를 올바르게 해석하지 않거나 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차이도 발생하지 않습니다.

답변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 매개변수)을 다운로드하면 셸에서 생성된 색상을 확인하고 표시된 이스케이프 시퀀스를 제거할 수 있습니다.

관련 정보