程式扎記: [ Python 範例代碼 ] Auto-login script for vpnc

標籤

2014年10月3日 星期五

[ Python 範例代碼 ] Auto-login script for vpnc

Preface 
在使用下面 python script 前, 確認你有安裝 vpnc (VPN connector) 與 Python 的 pexpect (A Python module for controlling interactive programs in a pseudo-terminal) 套件. 

Install vpnc on CentOS 
1. 根據平台下載適當的 vpnc 的 rpm 檔, 如果是 CentOS 64bits, 這邊是使用 vpnc-0.5.3-1.el5.rf.x86_64.rpm 
2. 進行安裝, 如果是 CentOS 則使用 yum 命令: 
# yum localinstall vpnc-0.5.3-1.el5.rf.x86_64.rpm

Install pexpect 套件 
1. 直接下載套件並使用 setup.py 進行安裝. 
2. 透過 pip 命令安裝: 
# pip install pexpect

Auto-login VPNC Script 
下面的 Python 代碼會自動幫你透過 vpnc 登入 virtual private network. 整個 script 進行三件事: 
1. 判斷 vpnc 是否已經執行中, 如果是則結束 script; 否則進行 vpn login
2. 根據提供的變數進行 vpn login
3. 將 Login 過程寫到 loginVPN.log

- login.py 
  1. #!/usr/bin/python  
  2. import subprocess, os, sys, time  
  3. from subprocess import Popen  
  4. from subprocess import PIPE  
  5. import pexpect  
  6.   
  7. VPNC_PATH="/sbin/vpnc"  
  8. VPNC_HOST="xxx.xxx.xxx.xxx"  
  9. IPSec_ID="xxx"  
  10. IPSec_secret="xxx"  
  11. AUTH_UN="username"  
  12. AUTH_PW="password"  
  13.   
  14. proc = Popen(["ps""aux"], stdout=PIPE)  
  15. proc2 = Popen(["grep""vpnc"], stdin=proc.stdout, stdout=PIPE)  
  16. proc.stdout.close()  
  17. proc3 = Popen(["grep""-v""grep"], stdin=proc2.stdout, stdout=PIPE)  
  18. proc2.stdout.close()  
  19. output = proc3.communicate()[0].strip().split()  
  20. if len(output) > 0:  
  21.     print "\t[Info] VPNC is already running with PID={0}!\n".format(output[5])  
  22.     exit(0)  
  23.   
  24. 1) Start VPNC login  
  25. fout = open('loginVPN.log','w')  
  26. child = pexpect.spawn("{0}".format(VPNC_PATH))  
  27. child.logfile = fout  
  28. child.expect("Enter IPSec gateway address:")  
  29. child.sendline(VPNC_HOST)  
  30. child.expect("Enter IPSec ID for")  
  31. child.sendline(IPSec_ID)  
  32. child.expect("Enter IPSec secret for")  
  33. child.sendline(IPSec_secret)  
  34. child.expect("Enter username for")  
  35. child.sendline(AUTH_UN)  
  36. child.expect("Enter password for")  
  37. child.sendline(AUTH_PW)  
  38. index = child.expect(["VPNC started in background""Password for VPN", pexpect.EOF, pexpect.TIMEOUT])  
  39. if index == 0:  
  40.     print("Login VPN successfully!")  
  41. elif index == 1:  
  42.     print("Wrong seting!")  
  43. elif index == 2:  
  44.     print("Unknown error!")  
  45. else:  
  46.     print("Timeout!")  
  47.   
  48. fout.close()  
Execution output: 
# ./loginISSLab.py # 進行 VPN 登入
Login VPN successfully! # 如果設定有誤, 會出現 "Wrong seting!"
# ps aux | grep vpn | grep -v grep
root 5473 0.0 0.0 10848 600 ? Ss 10:19 0:00 /sbin/vpnc # Already login VPN
# ./loginISSLab.py
[Info] VPNC is already running with PID=600!

Supplement 
Python 套件管理程式簡介 
Pexpect module API 
[ Python 範例代碼 ] 利用 ps 與 grep 找出 processes 並將之 kill

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!