แจ้งเตือนเข้าไลน์กลุ่ม ผ่าน Line notify เมื่อมีคน login เข้า server ของเราผ่าน SSH (linux) หรือ remote desktop เข้ามา (windows server)


   เนื่องจาก server ที่ทำงานผมส่วนใหญ่เป็น Linux  และ Windows server มีจำนวนหลายตัวในความดูแล มี admin หลายคนช่วยกันดูแล เพื่อความปลอดภัย จึงอยากทำระบบขึ้นมา หากมีใครพยายาม Login เข้า server เพื่อจะทำอะไร  จะให้แจ้งเตือนเข้าไลน์กลุ่มของผู้ดูแลระบบ  ไม่ยากครับ

  สำหรับการสมัคร line notfiy สามารถหาอ่านได้จากเว็บทั่วไป หรือจากบทความเก่าๆ ของผมได้น่ะครับ https://havespirit.blogspot.com/2017/02/line-notify-php.html   ในบทความนี้จะไม่ขอกล่าวถึงการสมัคร Line notify น่ะครับ  หลังจากสมัครแล้ว ก็ให้เชิญเข้ากลุ่มที่จะแจ้งเตือน และเราจะเอา Line token มาใช้
   
          สำหรับ  Linux การ ssh เข้าไปเป็น root น่ะครับ ส่วน user อื่น ก็แก้ไขได้ครับ เปลี่ยนจาก /root เป็น user ที่เราต้องการครับ
     
          สำหรับ windows server เมื่อมีการ remote desktop เข้าไปทำงาน มันจะแจ้งเตือนผ่านไลน์กลุ่ม ว่ามีคน remote desktop เข้า server มีการทำ 2 ส่วน คือ code php สำหรับการแจ้งเตือนผ่าน Line notify ต้องไปสมัคร Line notify ก่อนน่ะครับ ไม่ยาก

 สำหรับ Linux centos

   เข้าไปแก้ไขได้ที่   vi /root/.bash_profile

////////////////////
[root@localhost ssh]# vi /root/.bash_profile 
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs
curl -X POST -H 'Authorization: Bearer [LINE-TOKEN ของเราครับ]' -F 'message=Server 10.152.7.111 have SSH login' https://notify-api.line.me/api/notify
PATH=$PATH:$HOME/bin
export PATH
unset USERNAME
"~/.bash_profile" 13L, 360C written
[root@localhost ssh]# 
//////////////////////////////


หน้าจอ  ทดสอบการ  Login ผ่าน SSH 


หน้าจอ Line group หลังจาก login ผ่าน SSH เข้ามา server เรา


สำหรับ windows server  2008 R2  

****  ( 2017-03-12 บางทีมันก็ไม่ทำงานครับ ให้ไปใช้ python แทน code อยู่ด้านล่างครับ ***

  ต้องทำ 2 ส่วนด้วยกันครับ
  1. สร้าง code php สำหรับให้ server เรียกใช้ เวลา remote เข้าไป  ดังนี้ครับ
                        /////////////////////////////

<?php 
//$message = $_REQUEST['message'];
$message = 'ไอพีของserver ';
$chOne = curl_init(); 
curl_setopt( $chOne, CURLOPT_URL, "https://notify-api.line.me/api/notify"); 
// SSL USE 
curl_setopt( $chOne, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt( $chOne, CURLOPT_SSL_VERIFYPEER, 0); 
//POST 
curl_setopt( $chOne, CURLOPT_POST, 1); 
// Message 
curl_setopt( $chOne, CURLOPT_POSTFIELDS, $message); 
//ถ้าต้องการใส่รุป ให้ใส่ 2 parameter imageThumbnail และimageFullsize
curl_setopt( $chOne, CURLOPT_POSTFIELDS, "message=$message&imageThumbnail=http://10.10.10.10/server_login.PNG&imageFullsize=http://10.10.10.10/server_login.PNG"); 
// follow redirects 
curl_setopt( $chOne, CURLOPT_FOLLOWLOCATION, 1); 
//ADD header array 
$headers = array( 'Content-type: application/x-www-form-urlencoded', 'Authorization: Bearer [ไลน์token ที่ได้มาจากการสมัคร line notify]', ); 
curl_setopt($chOne, CURLOPT_HTTPHEADER, $headers); 
//RETURN 
curl_setopt( $chOne, CURLOPT_RETURNTRANSFER, 1); 
$result = curl_exec( $chOne ); 
//Check error 
if(curl_error($chOne)) { echo 'error:' . curl_error($chOne); } 
else { $result_ = json_decode($result, true); 
echo "status : ".$result_['status']; echo "message : ". $result_['message']; } 
//Close connect 
curl_close( $chOne ); 

?>


                                    ////////////////////////////


2. ส่วนของ windows ต้องมาสร้าง scheduler หรือให้มันทำงานอัตโนมัติ
        หลักการทำงานของมันคือ เมื่อมีการ remote desktop มายัง server ระบบก็จะไปเรียก chrome ซึ่งจะไปเปิด code php อีกที

    วิธีการทำ

        Administrative tools -> Task Scheduler






 จากนั้น คลิ๊กขวาที่ Task Scheduler แล้ว เลือก New Folder สร้างชื่อ 



   หลังจาก new folder แล้ว คลิ๊กขวา ที่ folder แล้วเลือก create task 
    



     จากนั้นเลือก trigger เลือก  connection  from remote computer 


เลือก Actions  -> browse program ไปที่  chrome 
   ของผม path อยู่ที่นี้ครับ  "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"

 แล้ว add agrument เป็น  url  code php ที่เราทำ Line notfiy ไว้   ตัวอย่าง http://10.10.10.10/server.php



ผลลัพธ์ที่ได้



edit   2017-03-12

  เนื่องจากพบว่า บางครั้ง เมื่อ login เข้า windows มันก็ไม่ยอมทำงาน จึงขอแนะนำอีกวิธีครับ ที่ค่อนข้างแม่นยำ คือ ลง Python 2.7 ที่ เครื่อง windows แล้ว ใช้ code นี้ครับ

 //// code login.py ///

import requests,json
#import urllib.parse

LINE_ACCESS_TOKEN="xxxxxxxxxxxxxxxxxxx"
url = "https://notify-api.line.me/api/notify"


msg = {"message":"192.168.1.10 Login"} #message
LINE_HEADERS = {'Content-Type':'application/x-www-form-urlencoded',"Authorization":"Bearer "+LINE_ACCESS_TOKEN}
session = requests.Session()
resp =session.post(url, headers=LINE_HEADERS, data=msg)
print(resp.text)


///////////////////


เปิด Task Scheduler  กำหนด Triggers ให้เป็น At log on


กำหนด Action ให้เป็น run code python ในเราสร้าง โดย browse ไปที่ python
และให้ใส่ path ของ code python ที่ Add agrument

/////////////////////////////////////////

ความคิดเห็น

  1. รบกวนหน่อยครับ
    พอดีลองบน Ubuntu เเล้วเจอ error นี้ครับ
    {"status":401,"message":"Invalid access token"}-bash: ~/.bash_profile: No such file or directory

    โดยในไฟลล์ .profile

    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
    . ~/.bashrc
    fi

    # User specific environment and startup programs
    curl -X POST -H 'Authorization: Bearer [juzLp6wIBfuZXXXXXXXXXXXX]' -F 'message=INutCorp-WebServ have SSH login' https://notify-api.line.me/api/notify
    PATH=$PATH:$HOME/bin
    export PATH
    unset USERNAME
    "~/.bash_profile" 13L, 360C written

    ตอบลบ
    คำตอบ
    1. ลองดูนะครับ LINE-TOKEN น่าจะไม่ต้องใส่ [] ครับ

      ลบ
    2. ในส่วนของ Line-Token เหมือนที่คุณ Teerawat H. บอกน่ะครับ คือไม่ต้องมีเครื่องหมาย [ ]

      ลบ
    3. ลองและครับ error เหมือนเดิมเลยครับ
      # Get the aliases and functions
      if [ -f ~/.bashrc ]; then
      . ~/.bashrc
      fi

      # User specific environment and startup programs
      curl -X POST -H 'Authorization: Bearer rFSdk2Ux4XyulxHF4A7JDKcM4r3ZyRfinESeqPMbEWN' -F 'message=Server 128.19x.xxx have SSH login' https://notify-api.line.me/api/notify
      PATH=$PATH:$HOME/bin
      export PATH
      unset USERNAME
      "~/.bash_profile" 13L, 360C written


      error msg;
      Last login: Mon Feb 27 06:12:05 2017 from 202.183.xxx
      {"status":401,"message":"Invalid access token"}-bash: ~/.bash_profile: No such file or directory
      root@INutCorp:~#

      ลบ
    4. อ่ออได้และครับ เป็นที่ ""~/.bash_profile" 13L, 360C written"
      บน Ubuntu มันใม่มี .bash_profile แต่มันใช้ .profile แทนครับ

      ขอบคุณครับ_/\_

      ลบ
  2. สอบถามหน่อยครับตรง

    curl -X POST -H 'Authorization: Bearer [LINE-TOKEN ของเราครับ]' -F 'message=Server 10.152.7.111 have SSH login' https://notify-api.line.me/api/notify

    เลข 10.152.7.111 คือเลขไอพีของอะไรครับ

    ตอบลบ
    คำตอบ
    1. ผมคิดว่าส่วน message เป็นข้อความที่ต้องการให้แจ้งเตือนครับ สามารถใส่อะไรก็ได้ เจ้าของบทความน่าจะใส่ IP ของ Server เข้าไปจะได้ทราบว่า Login เข้าที่เครื่องอะไรครับ

      ลบ
    2. ใช่เลยครับ เหมือนที่ คุณ Teerwat H. ตอบเลยครับ จะเปลี่ยนเป็นข้อความอะไรก็ได้ หรือชื่อ server แทนก็ได้ครับ เช่น DNS

      ลบ
  3. รบกวนสอบถามเพิ่มเติมหน่อยครับ ถ้ามีหลาย Server สามารถทำได้มั้ยครับ และแจ้งรายละเอียดของ server ได้มากกว่านี้มั้ยครับ

    ตอบลบ
  4. สำหรับความเห็นผมน่ะครับ
    1. ก็คงส่ง parameter คือ ชื่อ ip ของเครื่องไปด้วย แล้วในส่งของ php ก็สร้างตัวแปรรับค่า ip มาแสดงในส่วนของ message
    2. ก็คงทำ php หลายๆ ไฟล์ สำหรับ server ตัวนั้นครับ
    ในส่วนของรายละเอียด server สามารถเพิ่มเติมได้ครับ หรือจะเขียน script ส่งค่าพวก cpu disk ram ไปด้วยก็ได้ครับ แต่ในส่วนนี้ผมยังไม่ได้ทำ

    ตอบลบ
  5. เกิด error {"status":401,"message":"Invalid access token"}-bash: ~/.bash_profile: No such file or directory เหมือนกัน ใช้ centos

    ตอบลบ
    คำตอบ
    1. คำว่า no such file or directory น่าจะบอกว่าไม่มี /root/.bash_profile ครับ หรืออาจจะเป็นชื่ออื่นครับ หรือ user อื่น ครับ ลองตรวจสอบดูน่ะครับ

      ลบ
    2. centos ลบ [] ตรง access token ครับ

      ลบ
  6. MYIP=`/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`
    #ดูด IP เครื่องครับ เอา eth0 มาอย่างเดียวถ้าเป็นไอพีตัวอื่นก็ลองแก้ดูครับ
    REMOTE_IP=`who am i` #ดูด ip remote มาครับ
    CUTIP=${REMOTE_IP%)*}
    CUTIP=${CUTIP##*(}// ตัดให้เหลือเฉพาะ ip ครับ

    curl -X POST -m 2 -F 'message=Server "'"$MYIP"'" have SSH login via IP "'"$CUTIP"'"' http://172.20.1.121/line_message.php > /dev/null 2>&1
    #ของผมไม่ให้ server ยิงออกให้ยิงออกตัวที่ต่อเน็ตไว้ครับ เอาใส่ไว้ใน .bash_profile ใช้ได้ดีครับ ลองทดสอบดูครับ
    # มีแก้ตรงไหนแปะให้ด้วยนะครับ

    ตอบลบ
    คำตอบ
    1. ขอบคุณสำหรับคำแนะนำดีดี ครับ :)

      ลบ
    2. ถ้าแบบนี้
      code บน linux อาจแก้ตรงบันทัด เป็น http://172.20.1.121/line_message.php?ip=$MYIP ประมาณนี้
      อาจต้องเขียน code php รับค่าไอพีด้วยก็ได้ครับ โดย code php ให้ เพิ่มตัวแปรรับไอพี ครับ ประมาณนี้


      ลบ
    3. $ip = $_REQUEST['ip'];
      ...
      ...
      curl_setopt( $chOne, CURLOPT_POSTFIELDS, "message=$ipถูกlogin&imageThumbnail=http://10.10.10.10/server_login.PNG&imageFullsize=http://10.10.10.10/server_login.PNG");
      ...

      ลบ
  7. ผมลอง ubuntu 16.04

    curl -X POST -H 'Authorization: Bearer xxxxxx' -F 'message=Server 172.16.0.xxx have SSH login' https://notify-api.line.me/api/notify
    PATH=$PATH:$HOME/bin
    export PATH
    unset USERNAME
    "~/.profile" 13L, 360C written


    ไม่ได้ครับ

    ตอบลบ
  8. มันขึ้น error ว่ายังงั้ยบ้างครับ

    ตอบลบ
    คำตอบ
    1. {"status":401,"message":"Missing authorization header"}.profile: command not fou nd

      ครับ

      ลบ
    2. Centos ก็เหมือนกันครับ

      ลบ
    3. จาก code นี้ ตรง line-token จะไม่มีเครื่องหมาย[] น่ะครับ พอดีผมใส่ไว้เฉยๆ เพื่ออธิบาย curl -X POST -H 'Authorization: Bearer [LINE-TOKEN ของเราครับ]' -F 'message=Server 10.152.7.111 have SSH login'

      ลบ
  9. ความคิดเห็นนี้ถูกผู้เขียนลบ

    ตอบลบ
  10. อยากถามว่าถ้าเป็น ในเคลือบริษัทนี้ต้องใช้ administrator ปะครับ

    ตอบลบ
  11. ไม่ระบุชื่อ4 มีนาคม 2560 เวลา 21:56

    ของผมยังไม่เข้าใจตรง add agrument เป็น url code php ที่เราทำ Line notfiy ไว้อ่ะครับ เป็น path ที่ไปเรียก file .php เหรอครับ

    ตอบลบ
  12. curl: (6) Couldn't resolve host 'notify-api.line.me'
    มันบอกว่าอย่างนี้น่ะครับ เหมือนมันติดต่อ host ไม่ได้ ทำไงดีครับ

    ตอบลบ
  13. ไม่ระบุชื่อ4 ตุลาคม 2560 เวลา 18:41

    ขึ้นแบบนี้ครับ curl: (35) error:0D0C50A1:asn1 encoding routines:ASN1_item_verify:unknown message digest algorithm

    ตอบลบ
  14. ความคิดเห็นนี้ถูกผู้เขียนลบ

    ตอบลบ
  15. ขอวิธีเตือนการเข้า Server โดยผ่าน sftp ด้วยครับ

    ตอบลบ
    คำตอบ
    1. curl -X POST -H 'Authorization: Bearer XXXXX' -F 'message=Test Email' https://notify-api.line.me/api/notify

      ส่ง message ไม่ได้เลยค่ะ

      ลบ
  16. ทำแบบแจ้งรหัสการเข้าแบบ otp ได้ไหมครับ ประมาณว่าให้ระบบส่งรหัสไปที่ไลน์ แล้วกรอกรหัสตามในไลน์ ถึงจะเข้าระบบได้

    ตอบลบ

แสดงความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การทำ cloud iot ด้วย thingsboard ไว้ใช้เองครับ

การประยุกต์ใช้ line notify ในการแจ้งปัญหาการใช้งาน สำหรับ php