Python for Mikrotik Engineer [Userman]

Pao Payungsak Klinchampa
Next-Hop Co., Ltd.
Published in
2 min readFeb 2, 2020

จริงๆเเล้ว ส่วนตัวผมก็ใช้ Python มานานหลายปีเเล้ว เเต่เริ่มมาใช้จริงจัง ก็ช่วงปีที่เเล้วนี่เอง ประกอบกับกระเเส หรือเทรนใหม่ๆ ที่ทำให้เหล่า Network Engineer ต้องมาเรียนรู้ Python กัน หรือจริงๆจะเป็นภาษาอื่นก็ได้ ส่วนอีกเรื่องก็ REST API เรื่องนี้ก็สำคัญไม่เเพ้กัน

สำหรับบทความนี้ เป็นเรื่องของการเอา Python มาสั่ง run คำสั่งบน Mikrotik ครับเนื่องจากว่ามี Site ที่ดูเเลอยู่ปรับระบบนิดหน่อย เเละจำเป็นต้อง Add Username ลงระบบ Userman โดยยังคงใช้ Username เดิม เเละต้องเอาข้อมูลส่วนตัวของลูกค้าเข้าไปด้วย (จะได้รู้ว่าใครเป็นใคร) จึงเป็นที่มาของบทความนี้

ตอนเเรกผมพยายามเชื่อมต่อโดยใช้ API เเต่ปรากฎว่า Log in ไม่ได้ซะงั้น อันนี้ไม่เเน่ใจว่าเป็นเรื่อง Firmware ที่ปรับใหม่รึเปล่านะ เเต่ลองเเล้วใช้ไม่ได้ ก็เลยต้องใช้วิธีที่สอง ซึ่งก็คือ

ใช้วิธี SSH เข้าไปครับ ซึ่งผมก็นึกถึง Paramiko ลูกรักที่ผมมักจะใช้ SSH เข้าพวก Linux Server บ่อยๆ เเละเเน่นอนว่า ได้ผลครับ สามารถ Run คำสั่งต่างๆตามที่ต้องการได้

ไม่รอช้าเเล้ว เริ่มกันเลยดีกว่า

สำหรับคำสั่งที่ใช้ Run ในบทความนี้มีอยู่คำสั่งเดียวครับ ซึ่งก็คือ

/tool user-manager user add username=”” password=”” customer=”” first-name=”” last-name=”” …

ส่วน Router OS ที่ใช้ จะเป็นรุ่น 6.46.2 ตัวล่าสุด ณ ขณะนี้ครับ

และ Python ที่ใช้ ของผมใช้ Python3.7

เมื่อทราบคำสั่งกันเเล้ว ก็มาเขียน Python Script กัน

import paramikossh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=””,port=2222,username=”admin”,key_filename=”key.pem”)
stdin , stdout , stderr = ssh.exec_command('tool user-manager user add username=”test” password=”test1234” customer=”admin” first-name=”TEST” last-name=”Next-Hop”')print (stdout.read())ssh.close()

หน้าตาที่ได้ ก็จะออกมาประมาณนี้ครับ เพียงเเค่นี้เราก็สามารถส่งคำสั่งไปรันบน Mikrotik ได้เเล้ว

ขออธิบายคำสั่งต่างๆนะครับ

import paramiko ก็คือการดึง paramiko ซึ่งเป็น Package ที่ใช้ในการทำ SSH Client เพื่อต่อไปยัง Server นั่นเอง

จากนั้นก็จะเป็นการเรียกใช้ Paramiko โดยสร้างตัวเเปรชื่อ ssh ขึ้นมาเรียกใช้ครับ

ส่วนตรง set_missing_host_key_policy อันนี้เอาไว้ใช้ในการ Accept Key ครับ ถ้านึกไม่ออก ลองนึกถึงเวลาเรากำลังจะ SSH เข้าไปที่ Linux Server ซักที่ เเล้วมันจะมีให้กดปุ่ม Yes/No หรือถ้าใช้ Command เราก็ต้องพิมพ์ yes เพื่อให้สามารถสร้างการเชื่อมต่อได้

บรรทัดต่อมา ที่ ssh.connect ก็คือคำสั่งที่ใช้ในการเชื่อมต่อครับ โดยเราต้องระบุ IP หรือ Domain name ของ Mikrotik ลงไป ระบุ Port เเละ Username ส่วน Password ผมลองใช้เเล้ว ต่อไม่ได้ เลยต้องเปลี่ยนวิธี Authen เป็นเเบบใช้ Key Chain เเทน ซึ่งเราต้องจัดการ Import Public Key ของเราลงไปใน Mikrotik ก่อนจะเชื่อมต่อด้วยนะครับ ส่วนวิธีการ ไปศึกษาได้จากที่นี่

และก็มาถึงบรรทัดที่เป็นพระเอกของบทความนี้ ก็คือ ssh.exec_command ที่เอาไว้ใช้ในการ Run คำสั่งที่เราต้องการครับ ในที่นี้ก็คือคำสั่ง add user นั่นเอง

จากนั้น เราก็ใช้คำสั่ง print (stdout.read()) เพื่อเอาไว้ดูผลลัพธ์จากการรันคำสั่ง ซึ่งโดยปกติเเล้ว หากการรันคำสั่งถูกต้อง มันจะไม่มีอะไรออกมาเลย เเต่ถ้าใช้ Python นี้มันจะ print ค่าออกมาเป็น b’’ ครับ อันนี้เท่าที่ผมหาข้อมูลมา ได้ความมาว่า Output เป็น Binary เลยออกมาเเบบนี้

และปิดท้าย ด้วยมารยาทที่ดีงาม เมื่อสร้างการเชื่อมต่อ ใช้งานเสร็จเเล้ว เราก็ต้องปิดการเชื่อมต่อ ด้วยคำสั่ง ssh.close()

ก่อน run ก็จัดการ install Paramiko โดยใช้คำสั่ง

$ pip3.7 install paramiko

และก็ run คำสั่งด้วย

$ python3.7 add-user.py

ตรง add-user.py อันนี้เเล้วเเต่ว่าจะ save file เป็นชื่ออะไร ซึ่งถ้าเกิดมันทำงานได้ มันก็จะมี b’’ เเสดงขึ้นมาบนจอครับ ถ้าไม่ได้ก็จะเป็น Error ต่างๆ

จบไปเเล้วสำหรับการใช้คำสั่งระดับเริ่มต้นครับ เพราะของจริงที่ผมใช้ ผมเขียน Python ให้มันไปอ่านชื่อ นามสกุลเเละข้อมูลส่วนตัวต่างๆจาก file .csv เเล้วจัดการ Gen Password ใหม่ จากนั้นก็ส่งมันไป Run คำสั่งเพื่อ add user เข้า userman เเละเก็บข้อมูลที่ได้ลงใน .csv อีกรอบ (file .csv นี้จะเก็บ Password ไว้เพื่อส่งให้ลูกค้า)

ส่วนใครสนใจ ไปตามดูได้จาก Github นี้เลย

https://github.com/PayungsakCNR/mikrotik-userman-python

ก็หวังว่าจะเป็นประโยชน์นะครับ ใครสงสัยตรงไหน ก็เข้ามาพูดคุย สอบถามได้ มีไอเดียอะไรในการเอา Python ไปใช้ก็ลองเขียนเป็น Code ขึ้นมานะครับ ช่วยลดเวลาในการทำงานได้เยอะเลย

ขอจบบทความเเต่เพียงเท่านี้ สวัสดีครับ

--

--