VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)
VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)

Nah, jumat pagi ini iseng iseng nge-blog lagi. Kali ini tentang salah satu project yang pernah saya buat, yaitu menjalankan perintah atau command di server dengan cara mengirimkan SMS.

Ide nya sih sederhana, kadang kita tidak selalu dapat melakukan remote server misalnya lewat SSH, VNC atau remote desktop. Pada saat anda benar benar tidak terhubung ke server lewat jaringan lokal LAN atau lewat VPN, maka Short Message Service (SMS) bisa digunakan untuk keperluan yang sangat mendesak.

Btw, yang saya maksud ini bukan mengirimkan sms ke anak buah dan memberikan perintah agar dia melakukan command line nya di server ya… kalau itu mah semua orang juga bisa … he he he

Pada experimen saya, saya menggunakan sebuah GSM modem yang tentu saja support AT Command. Saya pakai Fastrack Supreme. Tapi GSM Modem apa saja bisa kok…

Kemudian saya menggunakan software SMSTools3.

Setelah anda install SMSTools3 (cara install nya tidak relevan saya posting di sini, mungkin saya post di postingan terpisah.

Pastikan bahwa SMSTools3 bisa mendeteksi modem yang anda buat.

Berikut ini saya share konfigurasi dari SMS Server saya :

SMSServer:~ # more /etc/smsd.conf
# Global configuration

devices = modem1

loglevel = 7

logfile = /var/log/sms/smstools.log

outgoing = /var/spool/sms/outgoing
checked = /var/spool/sms/checked
failed = /var/spool/sms/failed
incoming = /var/spool/sms/incoming
sent = /var/spool/sms/sent

delaytime = 6
errorsleeptime = 12
blocktime = 180

autosplit = 3
internal_combine = yes
receive_before_send = yes

phonecalls = /var/spool/sms/phonecalls
blacklist = /var/spool/sms/smsblacklist

checkhandler = /usr/local/bin/yuancheckHandler
#eventhandler = /usr/local/bin/smstoemail

[queues]
modem1queue = /var/spool/sms/modem1queue
yuanmodemqueue = /var/spool/sms/yuanmodemqueue

[providers]
modem1queue = 0,1,2,3,4,5,6,7,8,9,s
yuanmodemqueue = 0,1,2,3,4,5,6,7,8,9,s

# Modem configuration
# iTegno 3000 USB
[modem1]
device = /dev/ttyUSB0
incoming = yes
baudrate = 115200
phonecalls = yes
queues = modem1queue
eventhandler = /usr/local/bin/modem1

# wavecom fasttrack supreme
#[yuanmodem]
#init = AT+CNMI=2,1,0,0,0
#device = /dev/ttyS0
#incoming = yes
#baudrate = 115200
#phonecalls = yes
#queues = yuanmodemqueue
#eventhandler = /usr/local/bin/yuanAutoReply
#eventhandler = /usr/local/bin/yuanModem

Dari konfigurasi tersebut di atas, yang aktif adalah satu buah modem untuk menghandle SMS yaitu modem1.

eventhandler di SMSTools3

SMSTools3 memiliki fasilitas eventhandler, dan kita membuat sebuah script di /usr/local/bin/modem1

Dan berikut ini adalah isi script di /usr/local/bin/modem1

SMSServer:~ # more /usr/local/bin/modem1
#!/usr/bin/sh
case $1 in
"RECEIVED")
/usr/local/bin/modem1KeywordChecker $1 $2 $3
;;
"CALL")
/usr/local/bin/modem1IncomingCallHandler $1 $2 $3
;;
esac

Dari script tersebut ada dua buah event yang dihandle, yaitu RECEIVED jika ada SMS yang masuk dan CALL, jika ada Call yang masuk.

Nah untuk tiap event tersebut, akan memanggil script yang berbeda. Untuk event SMS yang masuk atau diterima, maka akan menjalankan sebuah script lagi yaitu  /usr/local/bin/modem1KeywordChecker $1 $2 $3

Anda bisa lihat bahwa script bash modem1KeywordChecker ini menerima parameter $1 $2 dan $3, dimana masing masing adalah :

# $1 = RECEIVED
# $2 = FILE INCOMING SMS
# $3 = NOMOR HP

Nah untuk lengkapnya, saya akan berikan source code script yang menghandle setiap SMS yang masuk ini :

#!/usr/bin/ksh

# $1 = RECEIVED
# $2 = FILE INCOMING SMS
# $3 = NOMOR HP

smsBody=`formail -I "" <$2`
string=`formail -I "" <$2`

#string=rekap,02,01,5000,4879
unset a
IFS=,
set -A KW $string

keyword=${KW[0]}

keywordd=`echo $keyword  | tr '[A-Z]' '[a-z]' | sed -e '/^$/d' `

case $keywordd in
info)
/usr/local/bin/smskeyword/handleSMSInfo $1 $2 $3
#echo "ada" ${KW[0]}
;;
secretCommand)
/usr/bin/php /usr/local/bin/smskeyword/runCommand.php $1 $2 $3 $smsBody
#echo ${KW[1]}
#/usr/bin/sh $(KW[1])
;;
*)
/usr/local/bin/smskeyword/modem1Default $1 $2 $3
#echo "Tdk ada keyword "
#echo ${KW[0]}"tdk ada keyword" $keywordd
#echo $string $smsBody
;;
esac

#b=UPPERcase
#a=`echo $b  | tr '[A-Z]' '[a-z]'`
#echo $a

Pada script tersebut di atas saya menggunakan bahasa KSH untuk menghandle isi dari sms berdasarkan keyword.

Anda bisa melihat saya memecah dulu isi SMS menggunakan koma (tentu anda boleh menggunakan separator lain).  Dan mengecek keywordnya.

Jika keyword nya info, maka akan dijalankan  /usr/local/bin/smskeyword/handleSMSInfo

Jika keywordnya secretCommand maka ini akan dijalankan perintah command line kita yang merupakan bahasan dari posting kali ini.

Dan anda juga bisa melihat ada default nya jika tidak ada keyword yang cocok, maka akan dijalankan /usr/local/bin/smskeyword/modem1Default

Script Menghandle SMS Command

Berikut ini adalah source code dari script yang menjalankan sms command atau jika ada keyword secretCommand:

Oh ya seperti yang anda lihat bahwa script runCommand.php ini menerima 4 parameter dan parameter terakhir adalah smsBody nya sendiri. Karena jujur saja saya agak kesulitan dalam melakukan parsing sms body di PHP, lebih mudah di ksh.

<?php
#/usr/bin/php

$input2 = arguments($argv);

//print_r($input2);
//print_r($input2);
/*
input2= array (
 [input] => array
        (
            [0] => file
            [1] => $1
            [2] => $2
            [3] => $3
        )

)
*/
$var1 = $input2['input'][0];
$var2 = $input2['input'][1];
$var3 = $input2['input'][2];
$var4 =  $input2['input'][3];
$var5 = $input2['input'][4];

$rawData = @file_get_contents($var3);

$fileDataIncoming = fopen($var3, "r");
//Output a line of the file until the end is reached
$sender = str_replace("From: ","",fgets($fileDataIncoming));
fclose($fileDataIncoming);

// Additional headers
$to = "yuan.yudistira@beritasatuxxx.xx";
$headers  = 'To: IT <yuan.yudistira@beritasatuxxx.xxx>' . "\r\n";
$headers .= 'From: SMS Server<no-reply@beritasatuxxx.xxx>' . "\r\n";

$subject = "command server dari $sender";
$message = "Ada SMS command yang dikirim via sms ke 0816851xxx, 

Pengirim : $sender
Berikut ini adalah raw data :
=========================================
".$rawData."

command yang dijalankan $var5
=========================================
Thanks

SMS Server 0816851xxx
";

//echo $message;
// Mail it
mail($to, $subject, $message, $headers);

$realCommand = ereg_replace("secretCommand,"," ",$var4);
//exec("/etc/init.d/lighttpd stop");
exec("$var5");

$folderpath = "/var/spool/sms/outgoing/";
$smsBody = "Terima Kasih. Perintah Anda sudah kami laksanakan";
$to = $sender;
sendSMS($to,$folderpath,$smsBody);

function sendSMS($to,$folderpath,$smsBody) {
  //generate filename
  srand(make_seed());
  $randval = rand();
  $filename = "testing2010".$randval;
  $realFileNameWithPath = $folderpath.$filename;

   //Write new file
  $Handle = fopen($realFileNameWithPath, 'w'); 

  $finalsmsBody = "To: ".$to."
Provider: modem1queue
Queue: modem1queue
Modem: modem1

".$smsBody."
";

  fwrite($Handle, $finalsmsBody);
  fclose($Handle);

return 1;
}

function make_seed()
{
  list($usec, $sec) = explode(' ', microtime());
  return (float) $sec + ((float) $usec * 100000);
}
function arguments($argv) {
    $_ARG = array();
    $_ARG2 = "";
    foreach ($argv as $arg) {
        if (preg_match('#^-{1,2}([a-zA-Z0-9]*)=?(.*)$#', $arg, $matches)) {
            $key = $matches[1];
            switch ($matches[2]) {
                case '':
                case 'true':
                $arg = true;
                break;
                case 'false':
                $arg = false;
                break;
                default:
                $arg = $matches[2];
            }

            /* make unix like -afd == -a -f -d */
            if(preg_match("/^-([a-zA-Z0-9]+)/", $matches[0], $match)) {
                $string = $match[1];
                for($i=0; strlen($string) > $i; $i++) {
                    $_ARG[$string[$i]] = true;

                }
            } else {
                $_ARG[$key] = $arg;
            }
        } else {
            $_ARG['input'][] = $arg;
            $_ARG2 .=$arg;
        }
    }
    return $_ARG;
}

function sendSMS($to,$folderpath,$smsBody) {
  //generate filename
  srand(make_seed());
  $randval = rand();
  $filename = "testing2010".$randval;
  $realFileNameWithPath = $folderpath.$filename;

   //Write new file
  $Handle = fopen($realFileNameWithPath, 'w'); 

  $finalsmsBody = "To: ".$to."
Provider: modem1queue
Queue: modem1queue
Modem: modem1

".$smsBody."
";

  fwrite($Handle, $finalsmsBody);
  fclose($Handle);

return 1;
}

function make_seed()
{
  list($usec, $sec) = explode(' ', microtime());
  return (float) $sec + ((float) $usec * 100000);
}
function arguments($argv) {
    $_ARG = array();
    $_ARG2 = "";
    foreach ($argv as $arg) {
        if (preg_match('#^-{1,2}([a-zA-Z0-9]*)=?(.*)$#', $arg, $matches)) {
            $key = $matches[1];
            switch ($matches[2]) {
                case '':
                case 'true':
                $arg = true;
                break;
                case 'false':
                $arg = false;
                break;
                default:
                $arg = $matches[2];
            }

            /* make unix like -afd == -a -f -d */
            if(preg_match("/^-([a-zA-Z0-9]+)/", $matches[0], $match)) {
                $string = $match[1];
                for($i=0; strlen($string) > $i; $i++) {
                    $_ARG[$string[$i]] = true;

                }
            } else {
                $_ARG[$key] = $arg;
            }
        } else {
            $_ARG['input'][] = $arg;
            $_ARG2 .=$arg;
        }
    }
    return $_ARG;
}

Seperti yang bisa Anda lihat, pertama tama saya mendapatkan dulu variable yang saya butuhkan. Dan setelah itu saya mempersiapkan sebuah email notifikasi bahwa ada sebuah secretCommand yang dikirim ke sms server saya.

Sementara perintah nya sendiri dijalankan dengan perintah exec di PHP melalui kode sbb :

$realCommand = ereg_replace("secretCommand,"," ",$var4);

exec("$var5");

Contoh SMS

secretCommand,/etc/init.d/lighthttpd stop

Maka akan dijalankan menghentikan service lighthttpd.

Anda bisa juga mengirimkan sms dengan perintah

secretCommand,shutdown -r now

Nah SMS di atas akan me-restart server :).

Jadi anda harus berhati hati, karena jika ada orang jahat yang mengetahui senjata rahasia Anda ini, bisa saja dia mengirimkan perintah mematikan, dan ketika smsserver tersebut benar benar mati, maka tentu anda harus datang ke ruang server dan menekan tombol ON nya secara manual.

SMS Command untuk server yang lain gimana?

Pada prinsipnya sih sama, yang perlu anda persiapkan adalah bagaimana dari SMS server tersebut mengirimkan perintah di server target yang lainnya.

Jadi dengan anda punya akses ke perintah exec di PHP, anda bisa melakukan apapun. Misalnya mengirimkan perintah ke server lain lewat protokol http.  Batasan ada di imajinasi anda.

Salam hormat,

Yuan Yudistira

(Aduh, hari ini adalah hari terakhir kerja di tahun 2011, karena saya mau cuti dan liburan sampai tanggal 9 Januari 2012…. he he he, jadi curhat nih.)

 

 


Related Video

Loading the player …

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.22_1171]
Rating: 0 (from 0 votes)

Pengunjung Datang Ke Blog Ini Mencari Info Tentang :

Tagged with:
 

One Response to Remote Control Server Lewat SMS

  1. Bagas Purwohandoyo says:

    Wah keren nih gan (y) mantab. btw boleh di buatin ga videonya sama ente gan ?? hehe ane masih kurang ngerti nih soalnya :) :D

    VA:F [1.9.22_1171]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.22_1171]
    Rating: 0 (from 0 votes)

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>