CentOS9 Terminal บน Web ด้วย ttyd


ผู้ใช้สามารถเข้าถึง Terminal ของ CentOS 9 ผ่าน GUI บนเว็บเพจ PHP ซึ่งสิ่งนี้จะเป็นเหมือน Web-based Terminal ที่รันคำสั่ง Linux ผ่านเว็บเบราว์เซอร์

เรามีหลายวิธีทำ แต่ต้องระวังเรื่อง ความปลอดภัยสูงมาก เพราะถ้าเปิดให้รันคำสั่งตรง ๆ จากเว็บจะเสี่ยงต่อการถูกโจมตี

ใช้ ttyd แทน (แนะนำบน CentOS 9)

ttyd เป็น modern web terminal และติดตั้งง่ายกว่า:

1.ติดตั้งจาก repo EPEL:

sudo dnf install epel-release -y
sudo dnf install ttyd -y

2.รัน terminal:

ttyd -p 4200 bash

3.เข้าเว็บ:

http://[server-ip]:4200

เปิด port 4200 เมื่อเปิดจากภายนอกไม่ได้

1. Firewall บล็อกพอร์ต 4200

CentOS 9 ใช้ firewalld โดยพอร์ต 4200 ยังไม่ได้เปิดให้เข้าถึงจากภายนอก

ตรวจสอบสถานะ firewall:

sudo firewall-cmd --state

เปิดพอร์ต 4200:

sudo firewall-cmd --permanent --add-port=4200/tcp
sudo firewall-cmd --reload

ตรวจสอบว่าเปิดแล้ว:

sudo firewall-cmd --list-ports

คุณควรเห็น 4200/tcp อยู่ในรายการ

2.ttyd ฟังเฉพาะ localhost

ตอนคุณรันคำสั่ง:

ttyd -p 4200 bash

โดยค่า default ttyd ฟัง เฉพาะ 127.0.0.1 ซึ่งหมายถึงเข้าจากเครื่อง local เท่านั้น

ให้รัน ttyd ให้ฟังทุก IP:

ttyd -p 4200 -i 0.0.0.0 bash

-i 0.0.0.0 = ฟังทุก interface

หลังจากนั้นลองเปิดจากเครื่องอื่น:

http://[ip เครื่อง]:4200

✅ สรุป

  1. เปิดพอร์ต 4200 บน firewall
  2. รัน ttyd ฟังทุก IP (-i 0.0.0.0)

เมื่อคุณเข้าหน้าเว็บ ttyd ได้แต่ พิมพ์อะไรไม่ได้

วิธีแก้: ใช้ --writable หรือ -w

รัน ttyd แบบเขียนได้:

ttyd -p 4200 -i 0.0.0.0 -w bash

-w หรือ --writable = เปิดให้พิมพ์และรันคำสั่งได้

-i 0.0.0.0 = ฟังทุก interface

-p 4200 = พอร์ต 4200

bash = shell ที่จะรัน

หรือ

ttyd -p 4200 -i 0.0.0.0 --writable bash

--writable = เปิดโหมดพิมพ์ได้

bash = shell ที่จะรัน

อยากให้ ttyd รันอัตโนมัติเมื่อเปิดเครื่อง

1.สร้างไฟล์ service

สร้างไฟล์ใหม่ /etc/systemd/system/ttyd.service:

sudo nano /etc/systemd/system/ttyd.service

วางเนื้อหาต่อไปนี้:

[Unit]
Description=ttyd Web Terminal
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/bin/ttyd -p 4200 -i 0.0.0.0 --writable bash
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

User=root → รัน ttyd ด้วย root เพื่อให้สามารถรันคำสั่ง system ได้ทั้งหมด

Restart=always → ถ้า ttyd crash จะ restart อัตโนมัติ

2.รีโหลด systemd และเริ่ม service

sudo systemctl daemon-reload
sudo systemctl enable ttyd.service
sudo systemctl start ttyd.service

ตรวจสอบสถานะ:

sudo systemctl status ttyd.service

คุณควรเห็น active (running)

3.เปิด firewall พอร์ต 4200

sudo firewall-cmd --permanent --add-port=4200/tcp
sudo firewall-cmd --reload

4.ทดสอบ

เปิดเบราว์เซอร์:

http://[server-ip]:4200

คุณจะเห็น web terminal พร้อมพิมพ์คำสั่งได้ทันที

อยากให้ ttyd web terminal รันแล้วมี password login ก่อนเข้าหน้า terminal

ttyd รองรับ authentication ด้วย -c (credential) แบบ user:password

ตัวอย่างแก้ไขไฟล์ systemd

[Unit]
Description=ttyd Web Terminal
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/bin/ttyd -p 4200 -i 0.0.0.0 --writable -c admin:1234 bash
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

-c admin:1234 → ใส่ username = admin และ password = 1234

เมื่อเข้าเว็บ http://<server-ip>:4200 จะขึ้นหน้า login

หลัง login จึงเข้าถึง bash ได้

ขั้นตอน

1.แก้ไขไฟล์ systemd:

sudo nano /etc/systemd/system/ttyd.service

2.เพิ่ม -c user:password เข้าไปใน ExecStart

3.รีโหลด systemd และ restart service:

sudo systemctl daemon-reload
sudo systemctl restart ttyd.service

4.ตรวจสอบสถานะ:

sudo systemctl status ttyd.service

5.เปิดเบราว์เซอร์เข้า:

http://[server-ip]:4200

จะเจอ login prompt ก่อนเข้า terminal

,