บันทึกหน้าจอลีนุกซ์เทอร์มินอลด้วยคำสั่ง script

เคยประสบปัญหาแบบนี้หรือไม่ ต้องการเก็บการพิมพ์คำสั่งและผลลัพธ์ที่เกิดขึ้นทั้งหมดที่ทำผ่านหน้าจอเทอร์มินอล เพื่อบันทึกไว้ในไฟล์ ไม่ว่าจะเป็นทางคอนโซลของลีนุกซ์โดยตรง หรือผ่านการ telnet หรือ secure shell ซึ่งไฟล์ที่เก็บนี้สามารถนำมาดูย้อนหลังได้

ถ้าผ่าน telnet หรือ secure shell สามารถทำได้โดยใช้คุณสมบัติ session logging ของโปรแกรมที่ใช้ เช่น โปรแกรม PuTTY ก็มีให้เลือกทำ session logging แล้วเก็บเป็นไฟล์ได้ แต่ถ้าใช้ผ่านคอนโซล (tty) ล่ะ ???

ได้อ่านบทความจากนิตยสาร Linux Journal แนะนำการใช้คำสั่ง script เพื่อบันทึกหน้าจอ ซึ่งตรงกับที่ต้องการ เลยนำมาแนะนำให้ใช้กัน

คำสั่ง script เป็นส่วนหนึ่งของชุดโปรแกรม util-linux-ng ซึ่งโดยทั่วไปจะติดตั้งมาพร้อมกับลีนุกซ์เวอร์ชั่นต่างๆ อยู่แล้ว

การใช้คำสั่ง script

วิธีการใช้คำสั่ง ก็แค่พิมพ์คำสั่ง script ก่อนที่เราจะเริ่มต้นบันทึกหน้าจอ โดยดีฟอลต์ ถ้าไม่มีการระบุออปชั่นใดๆ เลย คำสั่ง script จะเก็บหน้าจอไว้บันทึกเป็นชื่อไฟล์ typescript

เมื่อรันคำสั่ง script จะมีการเรียก shell ใหม่ขึ้นมา โดย shell สามารถใช้งานได้ตามปกติ แต่หน้าจอการพิมพ์คำสั่ง รวมทั้งผลลัพธ์ที่เกิดขึ้นทั้งหมดใน shell นี้ จะถูกบันทึกเก็บไว้ในไฟล์ typescript

หากต้องการหยุด หรือสิ้นสุดการบันทึกหน้าจอ ให้พิมพ์คำสั่ง exit จะเป็นการออกจาก shell ที่คำสั่ง script สร้างขึ้น กลับเข้าสู่ shell ก่อนหน้า

ตัวอย่างการใช้คำสั่ง script

[user01@server script]$ script
Script started, file is typescript
[user01@server script]$ ls -l
total 0
-rw-r--r-- 1 user01 users 0 2008-10-26 00:28 typescript
[user01@server script]$ date
Sun Oct 26 00:30:38 ICT 2008
[user01@server script]$ exit
exit
Script done, file is typescript

ใช้คำสัง cat เพื่อดูไฟล์ที่บันทึกไว้ได้ โดยพิมพ์ cat แล้วตามด้วยชื่อไฟล์

ตัวอย่างการใช้คำสั่ง cat เพื่อดูไฟล์ที่บันทึกไว้

[user01@server script]$ cat typescript
Script started on Sun 26 Oct 2008 12:28:00 AM ICT
[user01@server script]$ ls -l
total 0
-rw-r--r-- 1 user01 users 0 2008-10-26 00:28 typescript
[user01@server script]$ date
Sun Oct 26 00:30:38 ICT 2008
[user01@server script]$ exit
exit
Script done on Sun 26 Oct 2008 12:30:42 AM ICT

ไฟล์ที่บันทึกไว้ จะเก็บเวลาเริ่มต้นและสิ้นสุดในการบันทึกหน้าจอไว้ด้วย

ถ้าต้องการตั้งชื่อไฟล์ที่บันทึก เป็นชื่ออื่น นอกจาก typescript สามารถพิมพ์ชื่อไฟล์ที่ต้องการต่อท้ายคำสั่งได้เลย เช่นต้องการบันทึกชื่อไฟล์เป็น server-capture-session.log สามารถทำได้ดังนี้

[user01@server script]$ script server-capture-session.log
Script started, file is server-capture-session.log
[user01@server script]$ ls
server-capture-session.log
[user01@server script]$ exit
exit
Script done, file is server-capture-session.log

การบันทึกหน้าจอและดูจากเครื่องอื่นพร้อมกัน แบบ real-time

การใช้คำสั่ง script นอกจากจะสามารถบันทึกเป็นไฟล์เพื่อดูย้อนหลังแล้ว หากต้องการให้ผู้ใช้อื่นๆ สามารถดูสิ่งที่เกิดขึ้นในหน้าจอของเราพร้อมกันไปด้วย (real-time) จากเครื่องอื่นๆ  โดยไม่ต้องมายืนดูข้างหลังของเรา สามารถทำได้ดังนี้

หน้าจอของเราต้องพิมพ์คำสั่ง script ตามด้วยออปชั่น ‘-f’ เพื่อสั่งให้คำสั่ง script ทำการ flush ข้อมูลเขียนลงไฟล์ที่บันทึกทุกครั้งเมื่อมีการเปลี่ยนแปลงหน้าจอของเรา

[user01@server script]$ script -f /tmp/capture-real-time.log
Script started, file is /tmp/capture-real-time.log
[user01@server script]$ echo "demo how to capture real-time terminal session logging"
demo how to capture real-time terminal session logging
...

ส่วนผู้ใช้ที่อยู่บนเครื่องอื่นๆ ถ้าต้องการดูไปพร้อมๆ กัน สามารถใช้คำสั่ง tail ด้วยออปชั่น ‘-f’ แล้วตามด้วยชื่อไฟล์ทึ่ถูกบันทึก

[user02@server ~]$ tail -f /tmp/capture-real-time.log
Script started on Sun 26 Oct 2008 12:50:04 AM ICT
[user01@server script]$ echo "demo how to capture real-time terminal session logging"
demo how to capture real-time terminal session logging
...

ผู้ดูจากคำสั่ง tail จะเห็นเหมือนกับหน้าจอเทอร์มินอลของเราทุกอย่าง ทั้งการพิมพ์ การแก้ไข การลบข้อความ

หากต้องการหยุดการดู จากคำสั่ง tail ให้กด [Ctrl]-[c]

ข้อมูลอ้างอิง

  • script(1) man page – make typescript of terminal session
  • ขอบคุณนิตยสาร Linux Journal ที่แนะนำคำสั่ง

Leave a Reply

Your email address will not be published.