Vấn đề với đầu ra của plink là gì?


8

Trên máy Windows7 của tôi, tôi đang đi qua đường dẫn đã cài đặt của Ứng dụng PuTTy và đang chạy:

plink <hostname>

để kết nối với máy chủ Linux từ xa của tôi.

Tôi thấy một số ký tự không được nhận dạng trong đầu ra là:

-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$

Có chuyện gì ở đây vậy? Có phải cái gì đó về mã hóa?

Câu trả lời:


7

Như michas đã giải thích , đó là những chuỗi thoát cuối cùng. Làm thế nào họ được giải thích là tùy thuộc vào thiết bị đầu cuối. Bạn có thể làm như michas đã đề xuất và gọi lsnhư thế \ls, sẽ gọi hàm lsthực thi trong $PATH, thay vì bí danh shell thông thường ls --color=auto. Để xóa bí danh shell đó bạn có thể làm:

unalias ls

Bạn cũng có thể thêm tùy chọn ...

ls ${opts} --color=never

... Bất cứ lúc nào để tắt nó đi. Một cách khác để vô hiệu hóa các chuỗi màu chẳng hạn là làm:

ls ${opts} | cat

Điều này hoạt động, bởi vì trong --color=autochế độ lskiểm tra đầu ra của nó để xác định xem nó có phải là một thiết bị tty hay không và nếu vậy, nó sẽ bơm thiết bị đầu cuối thoát ra để tô màu đầu ra của nó. Khi nó không phải là một thiết bị đầu cuối - như khi nó là một |pipetệp như trong ví dụ trên - lskhông in các chuỗi thoát. Đây là hành vi tiêu chuẩn của hầu hết các ứng dụng có thể tô màu đầu ra của chúng.

Tuy nhiên, điều thú vị hơn là api mà hầu hết các lstriển khai cung cấp để kiểm soát hành vi này - điều mà tôi thấy thú vị và điều đó đã thôi thúc tôi viết câu trả lời này.

lsxác định phần nào của đầu ra của nó để tô màu, dựa trên các giá trị trong $LS_COLORSbiến môi trường. Các dircolorsứng dụng là một giao diện để xử lý này. Chẳng hạn, trên máy của tôi:

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.)

... và như thế. Khi so sánh với...

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:...

... Chúng ta có thể bắt đầu có ý tưởng về những gì lsđang làm. Điều đặc biệt không được hiển thị trong một trong hai điều này, là được biên dịch theo các giá trị cho ...

lc=\e[:rc=m:ec=:

Mỗi trong số này xử lý những gì đi về phía bên trái của mã thoát thiết bị đầu cuối, bên phải của mã thoát thiết bị đầu cuối và kết thúc chuỗi thoát thiết bị đầu cuối. Như bạn có thể thấy trong dircolorsđầu ra, my fi=:không được đặt làm mặc định - vì thông thường lskhông tô màu các tệp thông thường.

Nhưng nếu chúng ta kết hợp tất cả những thứ này lại với nhau và thêm một chút, chúng ta có thể làm những việc như ...

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$

lsnên in ecthoát một lần khi bắt đầu đầu ra lcrcthoát và thoát một lần ở cuối. Mỗi lần chúng xảy ra là ngay trước hoặc theo tên tệp. Trình ectự chỉ xảy ra nếu nó được đặt - hành vi mặc định là sử dụng resethoặc rstrình tự, thay vào đó kết hợp với lcrc. Đầu ra của bạn hiển thị một cấu hình giống như:

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

... Đó là điển hình, mặc dù eccho phép bạn kiểm soát nhiều hơn. Ví dụ, nếu bạn từng muốn một \0giới hạn null ls, nó có thể được thực hiện đơn giản như:

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^@^@^@$
^@%

Một lần nữa bạn có thể thấy rằng chúng tôi nhận được thêm một ecngay trước khi chuỗi thoát đầu tiên được in và một ở cuối. Ngoài hai điều đó, \0byte rỗng chỉ xảy ra ngay trước hoặc theo tên tệp. Bạn thậm chí có thể thấy rằng /dấu gạch chéo bổ sung được sử dụng để chỉ ra một thư mục nằm ngoài các null bao quanh nó.

Điều này cũng hoạt động tốt cho tên tệp chứa dòng mới:

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^@^@^@$
^@%                                       

Nếu chúng ta kết hợp tất cả những điều này lại với nhau, chúng ta có thể phỏng đoán rằng, trong trường hợp của bạn, có ba vấn đề chính, và nếu một trong hai vấn đề được giải quyết, nó sẽ có khả năng làm khó những người khác.

  • Ở nơi đầu tiên, thiết bị đầu cuối của bạn chỉ đơn giản là không hiểu màu của thiết bị đầu cuối thoát chính xác hoặc plinktheo một cách nào đó khiến chúng không thể đọc được cho thiết bị đầu cuối của bạn. Tôi không chắc đó là sự thật, nhưng các plinktài liệu có điều này để nói về nó:

Đầu ra được gửi bởi máy chủ sẽ được ghi thẳng vào cửa sổ nhắc lệnh của bạn, rất có thể sẽ không diễn giải các mã điều khiển đầu cuối theo cách mà máy chủ mong đợi. Vì vậy, nếu bạn chạy bất kỳ ứng dụng toàn màn hình nào, chẳng hạn, bạn có thể mong đợi thấy các ký tự lạ xuất hiện trong cửa sổ của mình. Các kết nối tương tác như thế này không phải là điểm chính của Plink.

Để kết nối với một giao thức khác nhau, bạn có thể cung cấp cho các tùy chọn dòng lệnh -ssh, -telnet, -rloginhoặc -raw. Để tạo kết nối SSH, ví dụ:

Z:\sysosd>plink -ssh login.example.com
login as:

Nếu bạn đã thiết lập phiên lưu PuTTY, thì thay vì cung cấp tên máy chủ lưu trữ, bạn có thể cung cấp tên phiên đã lưu. Điều này cho phép bạn sử dụng xác thực khóa chung, chỉ định tên người dùng và sử dụng hầu hết các tính năng khác của 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:~$
  • Nếu một trong hai tùy chọn đó không phù hợp với bạn hoặc không khả thi, thì bạn có thể giải quyết vấn đề này bằng cách có thể chạy một kiểm tra đối với tệp plinkcủa bạn .${shell}rccó nguồn gốc khi đăng nhập. Do đó, bạn có thể bật lsbí danh, chỉ khi thiết bị đăng nhập của bạn không phảiplinkkết nối. Ngoài ra, tôi có thể loại bỏ nó hoàn toàn, tôi cho rằng, nhưng làm như vậy sẽ khiến lskhông màu cho bất kỳ phiên đăng nhập nào. Bạn cũng có thể thêm một unalias lshoặc thậm chí một alias ls='ls --color=neverlệnh vào plinklệnh đăng nhập và do đó chỉ xóa bí danh khi đăng nhập bằng plink.

  • Vấn đề cuối cùng là ls- bất kể các tùy chọn dòng lệnh bí danh của nó - được cung cấp một môi trường chỉ định thiết bị đầu cuối thoát vào $LS_COLORS. Tương tự như trường hợp sau của vấn đề 2, bạn có thể chỉ cần đặt thành $LS_COLORSgiá trị null khi đăng nhập bằng plink. Theo cách đó, sẽ không có mã màu để kết xuất và ls --color=autosẽ không có sự khác biệt nào cả.


giải thích rất tốt, đặc biệt là mã màu, nhưng ls | mèo sẽ không cho tôi ls -l loại đầu ra, mặc dù cảm ơn!
Keyshov Borate

@Keys - không bạn phải làm gìls -l | cat
mikeerv

vừa mới làm, nhưng làm cho toàn bộ hoạt động, theo như tôi biết thì mèo cần một tên tệp làm tham số, ở đây chúng ta chỉ chuyển đầu ra đó cho mèo!
Keyshov Borate

@Keys - tốt, catmục đích chính của nó là nối nó stdinvới nó stdout. Vâng ... ok, vì vậy nó cũng có thể thêm các tập tin hiện có chỉ định trên dòng lệnh đểstdinnhưng nó vẫn chỉ concatenating hai dòng - <inđể >out. Tôi sử dụng nó ở trên trong một số ví dụ vì phiên bản GNU cũng có thể diễn giải và hiển thị các ký tự điều khiển - các ^@byte NUL đại diện. Trong mọi trường hợp các |pipetập tin là nó stdin- đó cũng là ls's stdout- và thiết bị đầu cuối của bạn là catstdoutđể nó < ls> $TTYngoài.
mikeerv

7

Đó là các chuỗi thoát để thiết lập màu sắc:

  • ←[00;34 cố gắng bật màu xanh
  • ←[00m cố gắng thiết lập lại màu sắc

Tùy thuộc vào thiết bị đầu cuối của bạn để giải thích các chuỗi đó và thực hiện tô màu.

Thực tế puttymang đến thiết bị đầu cuối của riêng nó, có thể giải thích những điều này.

Nếu bạn sử dụng plink, bạn đang sử dụng thiết bị đầu cuối windows, không thể làm như vậy và chỉ cần in chúng ra.

Trên loại máy chủ từ xa type ls, sẽ in một cái gì đó như:

ls is aliased to `ls --color=auto'

Điều này --color=autođang tạo ra các chuỗi màu. Nếu bạn vô hiệu hóa bí danh bằng cách gõ \ls, các chuỗi màu sẽ biến mất.


mát mẻ! Dù sao để vô hiệu hóa vĩnh viễn màu sắc, hoặc biết chữ nhắc lệnh windows để biết "← [00; 34" & "← [00m" này là gì.
Keyshov Borate

Để vô hiệu hóa vĩnh viễn điều này, hãy tìm vị trí đặt bí danh. Đây có lẽ là một số tập tin init như ~/.bashrchoặc ~/.profile. Chỉ cần loại bỏ / bỏ ghi chú bí danh ở đó.
michas

3

Bạn sẽ thấy cái này hữu ích:

http://adoxa.altervista.org/ansicon/

Nếu bạn gọi plink là một đối số ansicon.exe, điều này sẽ tự động dịch các chuỗi thoát. Khi tôi kết nối với hộp linux của mình, đầu ra của lsđược tô màu tự động.


1

Bạn có thể muốn chạy plink trong cửa sổ lệnh PowerShell, có thể hiển thị các ký tự ANSI chính xác hoặc trong cửa sổ cmd.exe, chạy này:

C: \ Users \ decui> powershell plink.exe root@your.own.host

(Tôi đã thử nghiệm điều này trong Win10)


Không hoạt động theo Win7. Hay ý bạn là ISE? Điều đó có thể đã làm việc nhưng chỉ đơn giản là treo cho tôi.
Adil Hindistan

đối với tôi nó không hoạt động trên W10, nó không thể hiển thị các ký tự
stiv

0

Beahvior lạ là do mã thoát ansi. Bạn có thể tải xuống chương trình ansicon.exe để giải thích mã ansi và hiển thị nó (đối số plink.exe plink.exe) Bằng cách này bạn có thể thấy các màu được tạo bởi trình bao và loại bỏ các chuỗi thoát được hiển thị ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.