Làm cách nào để kiểm tra thiết bị đầu cuối nào tôi đang sử dụng?


23

Tôi có Ubuntu trên máy của mình và tôi đang chạy trình quản lý cửa sổ tuyệt vời trên đầu trang. Làm cách nào để kiểm tra thiết bị đầu cuối nào tôi đang chạy? Có một lệnh cho nó?


5
điều gì làm bạn có ý nghĩa bởi đó ? Nhấp vào Trợ giúp -> Giới thiệu có phải vậy không?
JoKeR

3
Thiết bị đầu cuối nào có nghĩa là chương trình thiết bị đầu cuối hoặc vỏ?
heemayl

Câu trả lời:


24

TL; DR

  • để tìm sử dụng shell hiện đang chạy ls -l /proc/$$/exe
  • để tìm thiết bị đầu cuối hiện đang chạy, sử dụng xprop _NET_WM_PID WM_CLASS. Giá trị của pidsau này có thể được truyền cho ps -p <pid> -o argslệnh.
  • Về mặt kỹ thuật, đối với trình giả lập thiết bị đầu cuối, bạn thậm chí không cần một lệnh, như đã nêu trong các bình luận :

    bạn có ý gì Nhấp vào Trợ giúp -> Giới thiệu có phải vậy không? - JoKeR

Shell vs Terminal

Điều đầu tiên chúng ta cần phải làm rõ là chính xác những gì đang được yêu cầu - tìm ra shell đang chạy hoặc thiết bị đầu cuối đang chạy. Thông thường hai thuật ngữ này được sử dụng thay thế cho nhau, nhưng chúng là những thứ khác nhau hoàn toàn. Shell là trình thông dịch dòng lệnh, cụ thể shell tương tác là trường văn bản cộng với dấu nhắc nơi bạn nhập lệnh. Shell cũng có thể không tương tác, ví dụ tập lệnh bắt đầu shell không tương tác hoặc bash -c 'echo hello world'cũng bắt đầu shell không tương tác.

Ngược lại, terminal là giao diện cho shell (mặc dù nó cũng có thể là một ứng dụng khác). Thiết bị đầu cuối ban đầu được gọi là phần cứng thực tế, nhưng ngày nay chúng chủ yếu là phần mềm. Những gì bạn thấy khi nhấn Ctrl+ Alt+ thoặc nhấp vào biểu tượng thiết bị đầu cuối trong GUI, khởi động trình giả lập thiết bị đầu cuối, cửa sổ bắt chước hành vi của phần cứng và trong cửa sổ đó bạn có thể thấy trình bao chạy. Ctrl+ Alt+ F2(hoặc bất kỳ phím nào trong số 6 phím chức năng) sẽ mở bảng điều khiển ảo, aka tty. Tôi khuyên bạn nên đọc Tại sao lại là một thiết bị đầu cuối ảo ảo ảo, và thiết bị đầu cuối thực sự là gì? để biết thêm thông tin về các chi tiết cụ thể.

Lấy thông tin vỏ

Mỗi người dùng có một vỏ mặc định được gán cho họ trong /etc/passwdtên người dùng của họ. Giả sử bạn đang sử dụng cấu hình mặc định và chưa gọi một shell khác một cách rõ ràng như một lệnh, điều đó là đủ để làm:

echo $SHELL

Nhưng tất nhiên điều này chỉ hiển thị giá trị mặc định . Giả sử chúng ta làm như sau:

user@ubuntu:~$ dash
$

Chúng tôi là ban đầu trong bash, nhưng bắt đầu phiên tương tác của /bin/dash, POSIX Ubuntu hoặc vỏ hệ thống . Biến $SHELLsẽ không thay đổi, vì đó không phải là mục đích của nó - nó hiển thị mặc định không phải giá trị hiện tại. Chúng ta sẽ cần tiếp cận vấn đề này từ một góc nhìn khác - viễn cảnh của một quá trình, đó là điều mà tôi đã đề cập trong Tôi đang sử dụng bash hay sh?

$ echo $$
4824
$ cat /proc/4824/comm                                                          
mksh
$ bash
xieerqi@eagle:~$ echo $$
6197
xieerqi@eagle:~$ cat /proc/6197/comm
bash

Ở đây chúng tôi tận dụng /proc/hệ thống tập tin. Tên của quá trình và các tham số dòng lệnh được hiển thị trong /proc/<pid>/comm. Tất cả những gì chúng ta cần là cung cấp PID của shell, đó là những gì $$hiện có. Trong ví dụ trên tôi đang thêm nó một cách riêng biệt, nhưng không có gì ngăn chúng tôi làm

cat /proc/$$/comm

Sự thay đổi về chủ đề cũng có thể là

ps -p $$ -o args

Một cách khác chúng ta có thể tiếp cận điều này là thông qua kiểm tra ở đâu /proc/<pid>/exe. Tệp này là một liên kết tượng trưng cho tệp thực thi. Như vậy chúng ta có thể làm

user@ubuntu:~$ ls -l /proc/$$/exe
lrwxrwxrwx 1 adminx adminx 0 Apr  4 18:20 /proc/1241/exe -> /bin/bash
user@ubuntu:~$ sh
$ ls -l /proc/$$/exe
lrwxrwxrwx 1 adminx adminx 0 Apr  4 18:20 /proc/1255/exe -> /bin/dash

Một trong hai cách tiếp cận hoạt động trong 99% các trường hợp. Tất nhiên, có những cách mà họ có thể bị lật đổ. Ví dụ, liên kết tượng trưng sẽ không chỉ bất cứ nơi nào nếu thực thi đã bị xóa ngay sau khi vỏ bắt đầu (và trong trường hợp đó có thể bạn sẽ gặp phải các vấn đề hệ thống, kể từ khi loại bỏ /bin/sh, /bin/dashhoặc thậm chí /bin/bashlà không được khuyến khích - sau khi tất cả rất nhiều kịch bản dựa vào họ , đặc biệt là những cấp độ hệ thống). Tên lệnh cho shell thường được đặt làm đối số đầu tiên trong execve()syscall. Điều này được đề cập trong Làm thế nào để bash biết nó đang được gọi như thế nào? , vì vậy nếu bạn có một ứng dụng khởi chạy shell execve(), nó có thể đặt cho nó bất kỳ tên nào. Nhưng đây là những điều không chuẩn và không điển hình, nên tránh vì sự nhất quán và bảo mật.


Lấy thông tin thiết bị đầu cuối

Chúng ta có thể bắt đầu với các biến môi trường. Nhiều thiết bị đầu cuối dường như tự che dấu là không xtermtương thích, được báo cáo bởi echo $TERMhoặc echo $COLORTERM. Nhưng sau đó các biến môi trường không phải là công cụ rất đáng tin cậy. Chúng có thể được đặt và bỏ đặt. Chúng ta có thể làm lại điều tương tự với các bộ vi xử lý một lần nữa, ngoại trừ lần này chúng ta sẽ xem xét bộ cha mẹ. Như bạn có thể nhớ, terminal là giao diện của shell và thường tự khởi động shell. Do đó, chúng ta có thể tìm ra quy trình nào là quy trình cha của shell của chúng ta:

$ ps -p $$ -o args,ppid
COMMAND                      PPID
bash                         1234
$ ps -p 1234 -o args
COMMAND
/usr/lib/gnome-terminal/gnome-terminal-server

Hãy thử với một ứng dụng đầu cuối khác , sakura:

$ ps -p $$ -o args,ppid
COMMAND                      PPID
/bin/bash                   16950
$ ps -p 16950 -o args
COMMAND
sakura

Từ đó chúng ta có thể thấy rằng những gì bắt đầu vỏ này là gnome-terminal. Phương pháp này tất nhiên hoạt động giả sử bạn đang làm việc với vỏ tương tác. Ví dụ, nếu chúng tôi đang cố gắng tìm ra cha mẹ của bash -c '...'hoặc trình bao bắt đầu thông qua ssh, thì rất có thể PID là từ ứng dụng không đầu cuối và có thể không phải là GUI.

Vì vậy, nếu chúng ta muốn đối phó cụ thể với thiết bị đầu cuối GUI, những gì chúng ta có thể làm là chạy xprop, nhấp vào cửa sổ mong muốn, grep pid của nó và tìm hiểu tên của quy trình đó phù hợp với quy trình nào. Hay nói cách khác:

$ ps aux | grep $(xprop | awk -F'='  '/PID/ {print $2}')                       
xieerqi   2124  0.6  1.7 208068 34604 ?        Sl   18:47   1:49 gnome-terminal

Ngoài ra, theo thông số kỹ thuật , người quản lý cửa sổ nên đặt thuộc WM_CLASStính. Vì vậy, chúng ta cũng có thể có được điều đó từ xprop:

$ xprop WM_CLASS 
WM_CLASS(STRING) = "sakura", "Sakura"

Tất nhiên, điều này cũng có 1% nhược điểm: thiết lập WM_CLASScác thuộc tính phụ thuộc vào trình quản lý cửa sổ làm điều đó và PID không được đảm bảo cho một cửa sổ chính xác (xem Quá trình nào tạo ra cửa sổ X11 này? ), Có thể liên quan đến việc gỡ lỗi phức tạp. Và đây không phải là những thiếu sót của các phương thức mà là của máy chủ X11. Tuy nhiên, hầu hết các trình quản lý cửa sổ ổn định và nổi tiếng (như openbox, Metacity, blackbox) và hầu hết các ứng dụng đều hoạt động tốt, vì vậy chúng ta không nên mong đợi các vấn đề với thứ gì đó như Gnome Terminal hoặc Terminator.

Nhưng khi nói đến trình giả lập thiết bị đầu cuối GUI, chúng ta thậm chí không cần tìm lệnh. Chúng ta chỉ có thể sử dụng Abouthộp thoại của chính cửa sổ. Ngoại lệ cho quy tắc đó là xterm.


O_o $SHELL, chắc chắn
AB

Eek. Tại sao mọi người sử dụng ps | grep? ps -p $$! Hoặc, chỉ cho lệnh , ps -p $$ -o cmd=.
muru

@muru vì tôi là người dùng ít kinh nghiệm hơn bạn và tôi không có tất cả các cờ ps được ghi nhớ> _ <thẳng thừng
Sergiy Kolodyazhnyy

2
Tôi cũng vậy, nhưng ps | grepchỉ là hình thức tồi tệ. Hầu hết những gì bạn có thể grep, thực sự có thể được lấy bằng pschính nó hoặc bằng các công cụ khác.
muru

LƯU Ý: Tôi đã cập nhật câu trả lời của mình, vì tổng thể câu hỏi này ban đầu không rõ ràng và các phần của nó yêu cầu một số nền tảng; theo thời gian tôi cũng đã tìm ra cách tốt hơn để gọi lệnh.
Sergiy Kolodyazhnyy

12

Phiên bản ngắn (thx @Serg )

cat /etc/alternatives/x-terminal-emulator

Phiên bản dài

sudo update-alternatives --config x-terminal-emulator

và tìm kiếm *trong đầu ra

;)


Ví dụ đầu ra

There are 7 alternatives which provide `x-terminal-emulator’.
Lựa chọn thay thế
Giữa chúng tôi và
    1 / usr / bin / xterm
    2 / usr / bin / uxterm
    3 / usr / bin / koi8rxterm
    4 / usr / thùng / lxterm
 * + 5 /usr/bin/gnome-terminal.wrapper
    6 / usr / thùng / konsole
    7 /usr/bin/xfce4-terminal.wrapper
Press enter to keep the default[*], or type selection number:

Hoặc, nhờ @muru , đây là đầu ra chi tiết hơn

$ update-alternatives --display x-terminal-emulator
x-terminal-emulator - auto mode
  link currently points to /usr/bin/gnome-terminal.wrapper
/usr/bin/gnome-terminal.wrapper - priority 40
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/gnome-terminal.1.gz
/usr/bin/koi8rxterm - priority 20
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/koi8rxterm.1.gz
/usr/bin/lxterm - priority 30
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/lxterm.1.gz
/usr/bin/mate-terminal.wrapper - priority 30
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/mate-terminal.1.gz
/usr/bin/uxterm - priority 20
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/uxterm.1.gz
/usr/bin/xterm - priority 20
  slave x-terminal-emulator.1.gz: /usr/share/man/man1/xterm.1.gz
Current 'best' version is '/usr/bin/gnome-terminal.wrapper'.

2
cat /etc/alternatives/x-terminal-emulator | grep exec
Sergiy Kolodyazhnyy

Có tiện ích nào tôi cần cài đặt không? Tôi nhận được Binary file (standard input) matcheshoặc update-alternatives: error: unknown argument hoặcconfigconfig'`
Terrance

Không bao giờ, đó là--config
Terrance

1
Bạn không cần sudo. Sử dụngupdate-alternatives --display x-terminal-emulator
muru

Đối với phiên bản ngắn, bạn có thể cân nhắc sử dụng file /etc/alternatives/x-terminal-emulatorđể có được mục tiêu của liên kết tượng trưng này thay vì sử dụng catnó. Các filetiện ích nên được cài đặt trên hầu hết các hệ thống và có thể được sử dụng để tìm ra mục tiêu thực thi. cattrên liên kết tượng trưng có thể in bất kỳ tập lệnh shell hoặc thậm chí tệp nhị phân tùy thuộc vào mục tiêu của liên kết này (tập lệnh shell cho gnome-terminal, tệp nhị phân urxvt, v.v.).
chris544

9

Nếu bạn muốn biết chương trình đầu cuối bạn đang sử dụng, hãy sử dụng:

ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)

Chạy nó ngay sau khi mở terminal (shell) mà không cần thêm bất kỳ trường hợp shell nào nữa .

Khi bạn mở chương trình đầu cuối, về cơ bản nó sẽ sinh ra một chương trình con, một trình bao. Vì vậy, cha mẹ của vỏ sinh sản là thiết bị đầu cuối chính nó. Nói cách khác, PPID của shell là PID của chương trình đầu cuối.

Ở đây chúng tôi đang tìm ID tiến trình cha (PPID) của shell ( bash) ps -o 'ppid=' -p $$, đây sẽ là ID tiến trình của chương trình đầu cuối.

Sau đó, chúng tôi đang tìm tên quy trình từ PID:

$ ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)
gnome-terminal

Nó về cơ bản là một lớp lót của:

$ ps -o 'ppid=' -p $$
 2268

$ ps -o 'cmd=' -p 2268
gnome-terminal

1
Khi tôi chạy lệnh này, tôi nhận được sshd: username@pts/4. Lưu ý Tôi đang sử dụng PuTTY để kết nối với máy. Có sshdthực sự là trình giả lập thiết bị đầu cuối?
dùng3731622

3

Nhập printenvtừ cửa sổ đầu cuối để xem tất cả các biến của phiên mở.

Nhập echo $COLORTERMtừ cửa sổ đầu cuối. LƯU Ý: điều này không hoạt động với tất cả các thiết bị đầu cuối, một như sakurakhông báo cáo lại điều này.

root@terrance-Linux:~# echo $COLORTERM
gnome-terminal

cái bên dưới là từ một atermthiết bị đầu cuối.

root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm

echo $ COLORTERM trong sakura báo cáo trống
Sergiy Kolodyazhnyy

@Serg cảm ơn bạn. Có vẻ như nó là một biến thể của xterm rồi.
Terrance

@Serg chỉ tự hỏi nếu bạn thích Sakura? Và điều gì thu hút bạn đến với nó?
Terrance

Không sao, không có gì đặc biệt, khá đơn giản. Tôi đã thử nhiều trình giả lập thiết bị đầu cuối: terminator, roxterm, tilde, trình đơn thả xuống (quên cái gọi là, cái gì đó bắt đầu bằng R). Tôi đoán đó là một sự thỏa hiệp giữa xterm và gnome-terminal
Sergiy Kolodyazhnyy

@Serg Ah, đó là điều tốt để biết. Tôi sẽ kiểm tra xem. :-) Tôi luôn chú ý đến một thiết bị đầu cuối tốt hoạt động với tập lệnh giữ nguyên gửi các khóa xdotool cho chúng.
Terrance

3

Nếu bạn chỉ muốn tên của chương trình thiết bị đầu cuối, rất có thể bạn sẽ tìm thấy nó trong Trợ giúp> Giới thiệu.


0
cat /etc/alternatives/x-terminal-emulator | grep exec

Đầu ra mẫu:

exec ('gnome-terminal', @ args);

Có câu trả lời cho hệ thống của tôi: gnome-terminal .

Vì vậy, gõ gnome-terminalvào thiết bị đầu cuối của tôi bây giờ sẽ mở ra một cửa sổ thiết bị đầu cuối giống hệt nhau.

Nguồn:


-1

Câu trả lời đơn giản. Hoạt động cho cả console hoặc ssh.

Ví dụ cho thiết bị đầu cuối ký tự đơn giản:

ssh username@systemname
echo $TERM
dumb

cho bạn biết rằng bạn không thể mở các ứng dụng GUI trên kết nối đó

Ví dụ cho xterm (cũng hoạt động với PuTTY / Xming trên Windows)

ssh -Y username@systemname      -- omit this if using PuTTY --
echo $TERM
xterm

có nghĩa là bạn có thể sử dụng các lệnh GUI như mở trình soạn thảo leafpad hoặc trình quản lý tệp nautilus.

Trên bàn điều khiển cũng vậy:

Open terminal window
echo $TERM
xterm

TERMkhông phải là một biến xác định trình giả lập thiết bị đầu cuối mặc định, mà là một biến xác định các khả năng của hiện tại. Ví dụ: đặt biến thành "xterm-color" cho phép mọi chương trình đang chạy trong thiết bị đầu cuối biết rằng thiết bị đầu cuối hiện tại có nghĩa vụ phải hiểu màu sắc; đặt nó thành "linux" cho các chương trình biết rằng đây được coi là VT; vv
Cybolic
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.