สั่งปิดเครื่อง remote host ผ่าน ssh โดยไม่ต้องใส่รหัส

Somprasong Damyos
Open Source Technology
1 min readMar 3, 2017

วันนี้เจอโจทย์ว่า “ผมต้องการจะปิดเครื่อง Ubuntu Server ที่ไม่ต่อจอ ไม่มีคีย์บอร์ด และใช้คำสั่ง Unix ไม่เป็นเลย ทำอย่างไรได้บ้าง” ซึ่งเราเองก็ไม่ถนัดด้วยนี่สิ

ตอนแรกก็คิดง่ายๆ ก็เขียนไฟล์ shutdown.sh ใส่คำสั่ง ssh username@remote.host sudo shutdown -P 0 ไว้ที่เครื่อง Windows client รันผ่านโปรแกรม Git bash แค่นี้ก็น่าจะได้ แต่!!! มันต้องใส่รหัสผ่านด้วยนี่สิ อันนี้ปัญหาแรกคือไม่ต้องการใส่รหัสผ่าน ต่อมาเจอปัญหาที่สองพอใส่รหัสผ่านแล้วมันไม่ยอมรันคำสั่ง shutdown อีก งานเข้าเลยทีนี้ ก็ลองถามอากู๋ไปเรื่อยๆ สุดท้ายค้นพบทางออกจาก รอดตัวไป

ปัญหาแรกไม่ใส่รหัสผ่านตอน login

ก็แก้โดยการสร้าง ssh key ของเครื่อง client แล้วเอาไปใส่ไว้ในเครื่อง server ก็ไม่ต้องใส่รหัสผ่านละ

  • Step 1: ติดตั้ง ssh ก่อน แต่เนื่องจากมีโปรแกรม Git bash อยู่แล้ว เลยไม่ได้ติดตั้งใหม่
  • Step 2: สร้าง ssh key (public key และ private key)ของเครื่อง client โดยใช้คำสั่ง ssh-keygen -t rsa -b 4096 -C "your_email@mail.com" ซึ่งค่าเริ่มต้นจะสร้างไว้ที่ /Users/you/.ssh/id_rsa
  • Step 3: คัดลอก public ไปยังเครื่อง server (remote-host) โดยใช้คำสั่ง
    ssh-copy-id -i ~./ssh/id_rsa.pub username@remote.host
  • Step 4: ทดสอบ login ใหม่ ssh username@remote.host จะพบว่าไม่ถามรหัสผ่านแล้ว

ปัญหาที่สอง สั่ง shutdown โดยไม่ต้อง sudo password

คือให้ไปแก้ /etc/sudoers ที่เครื่อง server ว่าให้รันคำสั่ง shutdown โดยไม่ต้อง sudo และไม่ต้องถามรหัส (แต่จริงๆ แล้วก็ยังต้องพิมพ์ sudo อยู่ดี)

  • Step 1: Login ไปยัง server
    ssh username@remote.host
  • Step 2: แก้ไขไฟล์ /etc/sudoers ผ่านคำสั่ง
    sudo visudo
  • Step 3: เพิ่มบรรทัดใหม่ตามนี้
    yourusername ALL = NOPASSWD: /sbin/shutdown
    เพื่อบอกว่าไม่ถามรหัสผ่านเมื่อสั่ง shutdown ผ่าน username นี้
  • Step 4: กลับมาที่ client ทดลองรันไฟล์ shutdown.sh หรือทดลองกับคำสั่ง
    ssh username@remote.host sudo shutdown -P 0

สำเร็จ!!!

Ref:

http://serverfault.com/questions/241588/how-to-automate-ssh-login-with-password

http://linux.byexamples.com/archives/315/how-to-shutdown-and-reboot-without-sudo-password/

--

--