ฉันจะตรวจสอบเทอร์มินัลใดที่ฉันกำลังใช้อยู่ได้อย่างไร


23

ฉันมี Ubuntu บนเครื่องของฉันและฉันใช้ตัวจัดการหน้าต่างที่ยอดเยี่ยมอยู่ด้านบน ฉันจะตรวจสอบเทอร์มินัลใดที่ฉันกำลังทำงานอยู่ได้อย่างไร มีคำสั่งสำหรับมันหรือไม่?


5
คุณหมายถึงสิ่งใด คลิกความช่วยเหลือ -> เกี่ยวกับมันคืออะไร?
JoKeR

3
เทอร์มินัลใดที่มีความหมายต่อโปรแกรมเทอร์มินัลหรือเชลล์?
heemayl

คำตอบ:


24

TL; DR

  • เพื่อค้นหาการใช้เชลล์ในปัจจุบัน ls -l /proc/$$/exe
  • เพื่อหาสิ่งที่กำลังทำงานอยู่ terminal, xprop _NET_WM_PID WM_CLASSการใช้งาน ค่าของpidภายหลังสามารถส่งผ่านไปยังps -p <pid> -o argsคำสั่ง
  • ในทางเทคนิคสำหรับเทอร์มินัลอีมูเลเตอร์คุณไม่จำเป็นต้องมีคำสั่งตามที่ระบุในความคิดเห็น :

    คุณหมายถึงสิ่งใด คลิกความช่วยเหลือ -> เกี่ยวกับมันคืออะไร? - JoKeR

เชลล์กับเทอร์มินัล

สิ่งแรกที่เราต้องชี้แจงคือสิ่งที่ถูกถามอย่างแน่นอน - หาเชลล์ที่กำลังรันหรือเทอร์มินัลที่ใช้งาน บ่อยครั้งที่คำสองคำนี้ใช้สลับกันได้ แต่เป็นสิ่งที่ต่างออกไปโดยสิ้นเชิง เชลล์เป็นล่ามบรรทัดคำสั่งโดยเฉพาะเชลล์แบบโต้ตอบคือพร้อมท์พร้อมฟิลด์ข้อความที่คุณป้อนคำสั่ง เชลล์ยังสามารถเป็นแบบไม่โต้ตอบตัวอย่างเช่นสคริปต์เริ่มเชลล์ที่ไม่มีการโต้ตอบหรือbash -c 'echo hello world'เริ่มเชลล์ที่ไม่มีการโต้ตอบ

ในทางตรงกันข้ามเทอร์มินัลคือส่วนต่อประสานกับเชลล์ (แม้ว่าอาจเป็นแอปพลิเคชันอื่นเช่นกัน) เทอร์มินัลเดิมอ้างถึงฮาร์ดแวร์จริง แต่ทุกวันนี้พวกเขาส่วนใหญ่เป็นซอฟต์แวร์ สิ่งที่คุณเห็นเมื่อคุณกดCtrl+ Alt+ tหรือคลิกที่ไอคอนเทอร์มินัลใน GUI ที่เริ่มต้นเทอร์มินัลอีมูเลเตอร์หน้าต่างที่เลียนแบบพฤติกรรมของฮาร์ดแวร์และภายในหน้าต่างนั้นคุณจะเห็นเปลือกทำงาน Ctrl+ Alt+ F2(หรือใด ๆ ของปุ่มฟังก์ชั่ 6) ttyจะเปิดคอนโซลเสมือนอาคา ฉันขอแนะนำให้อ่านทำไมเทอร์มินัลเสมือน“ เสมือน” และเทอร์มินัล“ จริง” คืออะไรและทำไม สำหรับข้อมูลเพิ่มเติมเกี่ยวกับข้อมูลเฉพาะ

รับข้อมูลเชลล์

ผู้ใช้แต่ละคนมีเชลล์เริ่มต้นที่กำหนดให้กับพวกเขาใน/etc/passwdสำหรับชื่อผู้ใช้ของพวกเขา สมมติว่าคุณกำลังใช้การกำหนดค่าเริ่มต้นและยังไม่ได้เรียกเชลล์อื่นอย่างชัดเจนว่าเป็นคำสั่งก็เพียงพอที่จะทำ:

echo $SHELL

แต่แน่นอนว่านี่จะแสดงค่าเริ่มต้นเท่านั้น สมมติว่าเราทำสิ่งต่อไปนี้:

user@ubuntu:~$ dash
$

เราอยู่ในตอนแรกbashแต่เริ่มเซสชั่นการโต้ตอบของ/bin/dash, อูบุนตูของ POSIX หรือเปลือกระบบ ตัวแปร$SHELLจะไม่เปลี่ยนแปลงเพราะนั่นไม่ใช่จุดประสงค์ - มันแสดงค่าเริ่มต้นไม่ใช่ค่าปัจจุบัน เราจะต้องเข้าหาสิ่งนี้จากมุมมองอื่น - มุมมองของกระบวนการซึ่งเป็นสิ่งที่ฉันกล่าวถึงในฉันกำลังใช้ทุบตีหรือดวลจุดโทษ?

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

ที่นี่เราใช้ประโยชน์จาก/proc/ระบบไฟล์ ชื่อของกระบวนการและพารามิเตอร์บรรทัดคำสั่งจะปรากฏ/proc/<pid>/commขึ้น สิ่งที่เราต้องทำก็คือให้ PID ของเชลล์ซึ่งเป็นสิ่งที่$$ทำ ในตัวอย่างด้านบนฉันกำลังเพิ่มแยกต่างหาก แต่ไม่มีอะไรหยุดเราจากการทำเพียงแค่

cat /proc/$$/comm

การเปลี่ยนแปลงในชุดรูปแบบอาจเป็น

ps -p $$ -o args

/proc/<pid>/exeวิธีที่เราสามารถเข้าใกล้นี้ก็คือผ่านการตรวจสอบที่ ไฟล์นี้เป็น symlink ที่ชี้ไปที่ไฟล์ปฏิบัติการ ดังนั้นเราสามารถทำได้

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

วิธีใดวิธีหนึ่งจากสองวิธีนี้ทำงานได้ใน 99% ของคดีทั้งหมด แน่นอนมีวิธีที่พวกเขาสามารถล้มล้าง ยกตัวอย่างเช่น symlink จะไม่ชี้ทุกที่ถ้าปฏิบัติการถูกลบไม่นานหลังจากที่เปลือกเริ่มต้น (และในกรณีที่คุณอาจจะพบปัญหาระบบตั้งแต่การลบ/bin/sh, /bin/dashหรือแม้กระทั่ง/bin/bashไม่ถูกแนะนำ - หลังจากทั้งหมดเป็นจำนวนมากของสคริปต์พึ่งพาพวกเขา โดยเฉพาะรายการระดับระบบ) ชื่อคำสั่งสำหรับเชลล์มักจะถูกตั้งค่าเป็นอาร์กิวเมนต์แรกในexecve()syscall สิ่งนี้ครอบคลุมในวิธีทุบตีจะรู้ได้อย่างไรว่ามันถูกเรียกอย่างไร ดังนั้นหากคุณมีแอพพลิเคชั่นที่เปิดตัวเชลล์ผ่านexecve()มันอาจให้ชื่อใด ๆ แต่สิ่งเหล่านี้ไม่ใช่สิ่งที่ไม่ได้มาตรฐานและไม่ใช่เรื่องปกติที่ควรหลีกเลี่ยงเพื่อความมั่นคงและความปลอดภัย


การรับข้อมูลเทอร์มินัล

เราสามารถเริ่มต้นด้วยตัวแปรสภาพแวดล้อม ขั้วหลายคนดูเหมือนจะปกปิดตัวเองเป็นxtermใช้ได้กับระบบปฏิบัติการซึ่งมีรายงานโดยหรือecho $TERM echo $COLORTERMแต่ตัวแปรสภาพแวดล้อมไม่ใช่เครื่องมือที่เชื่อถือได้มาก สามารถตั้งค่าและยกเลิกการตั้งค่า เราสามารถทำสิ่งเดียวกันกับ PID อีกครั้งยกเว้นครั้งนี้เราจะดูที่ PID หลัก ดังที่คุณอาจจำได้ว่าเทอร์มินัลคือส่วนต่อประสานกับเชลล์และมักจะเริ่มเชลล์เอง ดังนั้นเราสามารถค้นหาว่ากระบวนการใดเป็นกระบวนการหลักของเชลล์:

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

ลองด้วยแอปปลายทางอื่นsakura:

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

จากตรงนั้นเราจะเห็นได้ว่าเชลล์เริ่มต้นคือgnome-terminalอะไร แน่นอนว่าวิธีการนี้ใช้งานได้สมมติว่าคุณกำลังทำงานกับเชลล์แบบโต้ตอบ หากเราพยายามค้นหาพาเรนต์ของbash -c '...'หรือเชลล์ที่เริ่มต้นด้วยsshเช่น PID อาจมาจากแอปพลิเคชันที่ไม่ใช่เทอร์มินัลและอาจไม่ใช่ GUI เลย

ดังนั้นหากเราต้องการจัดการเฉพาะกับเทอร์มินัล GUI สิ่งที่เราสามารถทำได้คือxpropคลิกที่หน้าต่างที่ต้องการ grep pid และค้นหาว่าชื่อของกระบวนการนั้นตรงกับ pid อย่างไร หรือในคำอื่น ๆ :

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

นอกจากนี้ตามรายละเอียดผู้จัดการหน้าต่างควรตั้งค่าWM_CLASSคุณสมบัติ ดังนั้นเราสามารถรับได้จากxprop:

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

แน่นอนว่าสิ่งนี้มีข้อเสีย 1% ด้วย: การตั้งค่าWM_CLASSคุณสมบัติขึ้นอยู่กับตัวจัดการหน้าต่างที่ทำเช่นนั้นและ PID ไม่รับประกันว่าหน้าต่างจะมีความถูกต้อง (ดูกระบวนการใดที่สร้างหน้าต่าง X11 นี้ ) ซึ่งอาจเกี่ยวข้องกับการดีบักแบบซับซ้อน และสิ่งเหล่านี้ไม่ได้เป็นข้อบกพร่องของวิธีการของตัวเอง แต่ของเซิร์ฟเวอร์ X11 อย่างไรก็ตามตัวจัดการหน้าต่างที่มีเสถียรภาพและเป็นที่รู้จักมากที่สุด (เช่น openbox, Metacity, blackbox) และแอปพลิเคชันส่วนใหญ่มีพฤติกรรมที่ดีดังนั้นเราไม่ควรคาดหวังว่าจะมีปัญหากับสิ่งต่าง ๆ เช่น Gnome Terminal หรือ Terminator

แต่เมื่อพูดถึงตัวเลียนแบบเทอร์มินัล GUI เราไม่จำเป็นต้องค้นหาคำสั่ง เราสามารถใช้Aboutกล่องโต้ตอบของหน้าต่างเอง xtermข้อยกเว้นที่เป็น


O_o $SHELLแน่นอน
AB

จี๊ด ทำไมคนที่คุณใช้ps | grep? ps -p $$! ps -p $$ -o cmd=หรือเพียงเพื่อคำสั่ง
muru

@muru เพราะฉันเป็นผู้ใช้ที่มีประสบการณ์น้อยกว่าคุณและฉันไม่ได้จดจำสถานะ ps ทั้งหมด> _ <โผงผาง
Sergiy Kolodyazhnyy

2
ฉันไม่ได้ทำ แต่ps | grepเป็นรูปแบบที่ไม่ดี ส่วนใหญ่ของสิ่งที่คุณสามารถ grep สามารถได้รับจริงโดยpsตัวเองหรือโดยเครื่องมืออื่น ๆ
muru

หมายเหตุ: ฉันได้อัปเดตคำตอบของฉันแล้วเนื่องจากคำถามนี้โดยทั่วไปยังไม่ชัดเจนและบางส่วนต้องการพื้นหลัง; เมื่อเวลาผ่านไปฉันก็พบว่ามีวิธีที่ดีกว่าในการเรียกใช้คำสั่ง
Sergiy Kolodyazhnyy

12

รุ่นสั้น (ขอบคุณ@Serg )

cat /etc/alternatives/x-terminal-emulator

รุ่นยาว

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

และค้นหา*ในผลลัพธ์

;)


ตัวอย่างผลลัพธ์

There are 7 alternatives which provide `x-terminal-emulator’.
ทางเลือกการคัดเลือก
----------------
    1 / usr / bin / xterm
    2 / usr / bin / uxterm
    3 / usr / bin / koi8rxterm
    4 / usr / bin / lxterm
 * + 5 /usr/bin/gnome-terminal.wrapper
    6 / usr / bin / konsole
    7 /usr/bin/xfce4-terminal.wrapper
Press enter to keep the default[*], or type selection number:

หรือขอบคุณ@muruนี่คือผลลัพธ์ที่มีรายละเอียดมากขึ้น

$ 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

จำเป็นต้องติดตั้งยูทิลิตี้หรือไม่? ฉันได้รับBinary file (standard input) matchesหรือupdate-alternatives: error: unknown argument
Terrance

ไม่เป็นไรมันคือ--config
Terrance

1
sudoคุณไม่จำเป็นต้อง ใช้งานupdate-alternatives --display x-terminal-emulator
muru

สำหรับเวอร์ชั่นสั้นคุณอาจลองใช้file /etc/alternatives/x-terminal-emulatorเพื่อให้ได้เป้าหมายของลิงก์สัญลักษณ์นี้แทนที่จะใช้catกับมัน fileยูทิลิตี้ควรจะติดตั้งในระบบส่วนใหญ่และสามารถนำมาใช้ในการหาที่ปฏิบัติเป้าหมาย catบนลิงก์สัญลักษณ์สามารถพิมพ์เชลล์สคริปต์ใด ๆ หรือแม้แต่ไฟล์ไบนารีขึ้นอยู่กับเป้าหมายของลิงค์นี้ (เชลล์สคริปต์สำหรับgnome-terminalไฟล์ไบนารีurxvtฯลฯ )
chris544

9

หากคุณต้องการรู้ว่าโปรแกรมปลายทางที่คุณใช้อยู่ให้ใช้สิ่งนี้:

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

เรียกใช้เพียงแค่นี้หลังจากที่เปิดขั้ว (เปลือก) โดยไม่ต้องฟอร์กเช่นเปลือกเพิ่มเติมใด

เมื่อคุณเปิดโปรแกรมเทอร์มินัลโดยทั่วไปจะวางไข่โปรแกรมลูกเชลล์ ดังนั้นพาเรนต์ของเชลล์ที่เกิดใหม่คือเทอร์มินัลเอง กล่าวอีกนัยหนึ่ง PPID ของเชลล์คือ PID ของโปรแกรมเทอร์มินัล

ที่นี่เรากำลังค้นหา parent process ID (PPID) ของ shell ( bash) โดยps -o 'ppid=' -p $$ซึ่งจะเป็น ID กระบวนการของโปรแกรมเทอร์มินัล

จากนั้นเรากำลังค้นหาชื่อกระบวนการจาก PID:

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

โดยพื้นฐานแล้วเป็นหนึ่งในสายการบิน:

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

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

1
sshd: username@pts/4เมื่อผมใช้คำสั่งนี้ฉันได้รับ หมายเหตุฉันใช้ PuTTY เพื่อเชื่อมต่อกับเครื่อง ที่sshdจริงแล้วเทอร์มินัลอีมูเลเตอร์?
3731622

3

พิมพ์printenvจากหน้าต่างเทอร์มินัลเพื่อดูตัวแปรทั้งหมดของเซสชันที่เปิดอยู่

พิมพ์echo $COLORTERMจากหน้าต่างเทอร์มินัล หมายเหตุ:สิ่งนี้ไม่สามารถใช้ได้กับเครื่องเทอร์มินัลทั้งหมดเครื่องหนึ่งที่เหมือนกับsakuraไม่ได้รายงานกลับ

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

ด้านล่างมาจากatermเทอร์มินัล

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

echo $ COLORTERM ใน sakura รายงานว่างเปล่า
Sergiy Kolodyazhnyy

@Serg ขอบคุณ ดูเหมือนว่าจะแตกต่างจาก xterm แล้ว
Terrance

@Serg แค่สงสัยว่าคุณชอบซากุระไหม? และอะไรที่ทำให้คุณประทับใจ
Terrance

ไม่เป็นไรไม่มีอะไรพิเศษเลยค่อนข้างเรียบง่าย ฉันลองใช้เทอร์มินัลอีมูเลเตอร์: เทอร์มิเนเตอร์, roxterm, tilde, ดร็อปดาวน์หนึ่ง (ลืมสิ่งที่มันเรียกว่ามีบางอย่างที่เริ่มต้นด้วย R) ฉันเดาว่ามันเป็นการประนีประนอมระหว่าง xterm และ gnome-terminal
Sergiy Kolodyazhnyy

@Serg Ah นั่นเป็นเรื่องดีที่จะรู้ ฉันจะตรวจสอบว่า :-) ฉันมักจะมองหาขั้วที่ดีที่ทำงานกับสคริปต์ keepalive ของฉันที่ส่งคีย์ xdotool ให้พวกเขา
Terrance

3

หากคุณต้องการชื่อโปรแกรมเทอร์มินัลคุณอาจพบได้ในวิธีใช้> เกี่ยวกับ


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

ตัวอย่างผลลัพธ์:

exec ( 'gnome-ขั้ว' @ args);

มีคำตอบให้ระบบของฉันเป็น: คำพังเพยขั้ว

ดังนั้นการพิมพ์gnome-terminalลงในเทอร์มินัลของฉันจะเปิดขึ้นอีกหน้าต่างเทอร์มินัลเหมือนกัน

แหล่งที่มา:

  • ความคิดเห็น Sergiy Kolodyazhnyy ภายใต้คำตอบของ AB

-1

คำตอบง่ายๆ ใช้งานได้ทั้งคอนโซลหรือ ssh

ตัวอย่างสำหรับเทอร์มินัลอักขระอย่างง่าย:

ssh username@systemname
echo $TERM
dumb

บอกคุณว่าคุณไม่สามารถเปิดแอพ GUI ในการเชื่อมต่อนั้นได้

ตัวอย่างสำหรับ xterm (ใช้ได้กับ PuTTY / Xming บน Windows)

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

หมายความว่าคุณสามารถใช้คำสั่ง GUI เช่นการเปิดตัวแก้ไข leafpad หรือโปรแกรมจัดการไฟล์ nautilus

บนคอนโซลมันเหมือนกัน:

Open terminal window
echo $TERM
xterm

TERMไม่ใช่ตัวแปรที่กำหนดเทอร์มินัลอีมูเลเตอร์เริ่มต้น แต่เป็นตัวแปรที่กำหนดความสามารถของเทอร์มินัลปัจจุบัน ตัวอย่างเช่นการตั้งค่าตัวแปรเป็น "xterm-color" ช่วยให้โปรแกรมใด ๆ ที่ทำงานในเทอร์มินัลรู้ว่าเทอร์มินัลปัจจุบันควรเข้าใจสี การตั้งค่าเป็น "linux" จะบอกโปรแกรมว่าควรจะเป็น VT ฯลฯ
Cybolic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.