ฉันมี Ubuntu บนเครื่องของฉันและฉันใช้ตัวจัดการหน้าต่างที่ยอดเยี่ยมอยู่ด้านบน ฉันจะตรวจสอบเทอร์มินัลใดที่ฉันกำลังทำงานอยู่ได้อย่างไร มีคำสั่งสำหรับมันหรือไม่?
ฉันมี Ubuntu บนเครื่องของฉันและฉันใช้ตัวจัดการหน้าต่างที่ยอดเยี่ยมอยู่ด้านบน ฉันจะตรวจสอบเทอร์มินัลใดที่ฉันกำลังทำงานอยู่ได้อย่างไร มีคำสั่งสำหรับมันหรือไม่?
คำตอบ:
ls -l /proc/$$/exe
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
ข้อยกเว้นที่เป็น
$SHELL
แน่นอน
ps | grep
? ps -p $$
! ps -p $$ -o cmd=
หรือเพียงเพื่อคำสั่ง
ps | grep
เป็นรูปแบบที่ไม่ดี ส่วนใหญ่ของสิ่งที่คุณสามารถ grep สามารถได้รับจริงโดยps
ตัวเองหรือโดยเครื่องมืออื่น ๆ
รุ่นสั้น (ขอบคุณ@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'.
cat /etc/alternatives/x-terminal-emulator | grep exec
Binary file (standard input) matches
หรือupdate-alternatives: error: unknown argument
--config
sudo
คุณไม่จำเป็นต้อง ใช้งานupdate-alternatives --display x-terminal-emulator
file /etc/alternatives/x-terminal-emulator
เพื่อให้ได้เป้าหมายของลิงก์สัญลักษณ์นี้แทนที่จะใช้cat
กับมัน file
ยูทิลิตี้ควรจะติดตั้งในระบบส่วนใหญ่และสามารถนำมาใช้ในการหาที่ปฏิบัติเป้าหมาย cat
บนลิงก์สัญลักษณ์สามารถพิมพ์เชลล์สคริปต์ใด ๆ หรือแม้แต่ไฟล์ไบนารีขึ้นอยู่กับเป้าหมายของลิงค์นี้ (เชลล์สคริปต์สำหรับgnome-terminal
ไฟล์ไบนารีurxvt
ฯลฯ )
หากคุณต้องการรู้ว่าโปรแกรมปลายทางที่คุณใช้อยู่ให้ใช้สิ่งนี้:
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
sshd: username@pts/4
เมื่อผมใช้คำสั่งนี้ฉันได้รับ หมายเหตุฉันใช้ PuTTY เพื่อเชื่อมต่อกับเครื่อง ที่sshd
จริงแล้วเทอร์มินัลอีมูเลเตอร์?
พิมพ์printenv
จากหน้าต่างเทอร์มินัลเพื่อดูตัวแปรทั้งหมดของเซสชันที่เปิดอยู่
พิมพ์echo $COLORTERM
จากหน้าต่างเทอร์มินัล หมายเหตุ:สิ่งนี้ไม่สามารถใช้ได้กับเครื่องเทอร์มินัลทั้งหมดเครื่องหนึ่งที่เหมือนกับsakura
ไม่ได้รายงานกลับ
root@terrance-Linux:~# echo $COLORTERM
gnome-terminal
ด้านล่างมาจากaterm
เทอร์มินัล
root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm
หากคุณต้องการชื่อโปรแกรมเทอร์มินัลคุณอาจพบได้ในวิธีใช้> เกี่ยวกับ
cat /etc/alternatives/x-terminal-emulator | grep exec
ตัวอย่างผลลัพธ์:
exec ( 'gnome-ขั้ว' @ args);
มีคำตอบให้ระบบของฉันเป็น: คำพังเพยขั้ว
ดังนั้นการพิมพ์gnome-terminal
ลงในเทอร์มินัลของฉันจะเปิดขึ้นอีกหน้าต่างเทอร์มินัลเหมือนกัน
คำตอบง่ายๆ ใช้งานได้ทั้งคอนโซลหรือ 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 ฯลฯ