1. 程式人生 > >簡化除法判斷 分析apache訪問日誌 掃描存活主機 利用多執行緒實現ssh併發訪問

簡化除法判斷 分析apache訪問日誌 掃描存活主機 利用多執行緒實現ssh併發訪問


1 案例1:簡化除法判斷

1.1 問題

編寫mydiv.py指令碼,主要要求如下:

  • 提示使用者輸入一個數字作為除數
  • 如果使用者按下Ctrl+C或Ctrl+D則退出程式
  • 如果使用者輸入非數字字元,提示使用者應該輸入數字
  • 如果使用者輸入0,提示使用者0不能作為除數

1.2 方案

使用if語句判斷除數是否合適,需要編寫多條語句。有了異常處理,可以本著先做,錯了再說的邏輯。直接把除法操作放在try語句中執行,根據產生的異常做相應的處理。

另外,Ctrl+C或Ctrl+D只能通過異常捕獲。

異常捕獲的語法如下:

  1. try:
  2. A
  3. except:
  4. B
  5. else:
  6. C
  7. finally:
  8. D

把可能發生異常的語句放在A裡面執行,如果出現異常則執行B語句,沒有異常則執行C語句。不管是否出現異常都會執行D語句。

捕獲異常時,可以使用多個except語句,每個except語句捕獲一個異常,每個異常給定不同的處理方法。也可以把多個異常放在同一個except語句後面,但是務必注意,多個異常寫在相同的一行,一定要注括號括起來,放在元組中。

1.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:編寫指令碼

  1. #!/usr/bin/env python
  2. import sys
  3. while True:
  4. try
    :
  5. result = 100/ int(raw_input('enter a number: '))
  6. except (ValueError, ZeroDivisionError), e: #將異常原因儲存在變數e中
  7. print "invalid input:", e
  8. continue
  9. except (EOFError, KeyboardInterrupt):
  10. sys.exit(1)
  11. break
  12. print result

步驟二:測試指令碼執行

  1. [[email protected] bin]# ./
    mydiv.py
  2. enter a number: 0
  3. invalid input: integer division or modulo by zero
  4. enter a number: abc
  5. invalid input: invalid literal for int() with base 10: 'abc'
  6. enter a number: 3
  7. 33

2 案例2:分析apache訪問日誌

2.1 問題

編寫用於分析apache日誌的指令碼,主要要求如下:

  • 統計每個客戶端訪問apache伺服器的次數
  • 將統計資訊通過字典的方式顯示出來
  • 分別統計客戶端是Firefox和MSIE的訪問次數
  • 分別使用函數語言程式設計和麵向物件程式設計的方式實現

2.2 方案

涉及到文字處理時,正則表示式將是一個非常強大的工具。匹配客戶端的IP地址,可以使用正則表示式的元字元,匹配字串可以直接使用字元的表面含義。

入門級程式設計師的寫法,使用順序的結構,直接編寫。這種方法雖然可以得出結果,但是程式碼難以重用。參考步驟一。

進階的寫法可以採用函數語言程式設計,方便日後再次使用。參考步驟二。

最後,還可以使用OOP的程式設計方法,先定義一個統計類,該類將正則表示式作為它的資料屬性。再定義一個方法,從指定的檔案中搜索正則表示式出現的次數,並將其存入到一個字典中。參考步驟三。

2.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:簡單實現

  1. [[email protected] bin]# vim countweb.py
  2. #!/usr/bin/env python
  3. import re
  4. logfile = '/var/log/httpd/access_log'
  5. cDict = {}
  6. patt_ip = '^\d+\.\d+\.\d+\.\d+' #定義匹配IP地址的正則表示式
  7. with open(logfile) as f:
  8. for eachLine in f:
  9. m = re.search(patt_ip, eachLine)
  10. if m is not None:
  11. ipaddr = m.group()
  12. #如果IP地址已在字典中,將其值加1,否則初始值設定為1
  13. cDict[ipaddr] = cDict.get(ipaddr, 0) + 1
  14. print cDict

步驟二:使用函數語言程式設計實現

  1. [[email protected] bin]# vim countweb2.py
  2. !/usr/bin/env python
  3. import re
  4. def countPatt(patt, fname): #定義可以在指定檔案中搜索指定字串的函式
  5. cDict = {}
  6. with open(fname) as f:
  7. for eachLine in f:
  8. m = re.search(patt, eachLine)
  9. if m is not None:
  10. k = m.group()
  11. cDict[k] = cDict.get(k, 0) + 1
  12. return cDict
  13. def test():
  14. logfile = '/var/log/httpd/access_log'
  15. patt_ip = '^\d+\.\d+\.\d+\.\d+'
  16. print countPatt(patt_ip, logfile)
  17. patt_br = 'Firefox|MSIE'
  18. print countPatt(patt_br, logfile)
  19. if __name__ == '__main__':
  20. test()

3 案例3:掃描存活主機

3.1 問題

編寫掃描存活主機的指令碼,主要要求如下:

  • 呼叫系統的ping命令進行掃描
  • 掃描教室環境下所有存活的主機
  • 採用多執行緒的方式編寫
  • 方案

os模組的system()函式可以呼叫系統命令,其返回值是系統命令退出碼,也就是如果系統命令成功執行,返回0,如果沒有成功執行,返回非零值。

本例掃描主機,可以呼叫系統的ping命令,通過退出碼來判斷是否ping通了該主機。如果順序執行,每個ping操作需要消耗數秒鐘,全部的254個地址需要10分鐘以上。而採用多執行緒,可以實現對這254個地址同時執行ping操作,併發的結果就是將執行時間縮短到了10秒鐘左右。

3.2 步驟

實現此案例需要按照如下步驟進行。

步驟一:編寫指令碼

  1. [[email protected] bin]# vim mtping.py
  2. #!/usr/bin/env python
  3. import subprocess
  4. import threading
  5. import sys
  6. def ping(ip):
  7. result = subprocess.call("ping -c2 %s &> /dev/null" % ip, shell=True)
  8. if result:
  9. print "%s:down" % ip
  10. else:
  11. print "%s:up" % ip
  12. if __name__ == '__main__':
  13. if len(sys.argv) != 2:
  14. print "Usage: %s subnet" % sys.argv[0]
  15. sys.exit(1)
  16. net_list = sys.argv[1].split('.')
  17. net = '.'.join(net_list[:-1])
  18. ips = ("%s.%s" % (net, i) for i in range(1, 255))
  19. for ip in ips:
  20. t = threading.Thread(target=ping, args=(ip,))
  21. t.start()

步驟二:測試指令碼執行

  1. [[email protected] bin]# python mtping.py 172.40.51.0

指令碼接受命令列引數,只要給定網段就可以實現對該網段中所有ip地址的ping操作。

4 案例4:利用多執行緒實現ssh併發訪問

4.1 問題

編寫ssh客戶端指令碼,主要要求如下:

  • 在檔案中取出所有遠端主機IP地址
  • 在shell命令列中接受遠端伺服器IP地址檔案、遠端伺服器密碼以及在遠端主機上執行的命令
  • 通過多執行緒實現在所有的遠端伺服器上併發執行命令
  • 方案

python的paramiko模組可以實現ssh客戶端的功能,使用起來也比較簡單。但是當伺服器非常多的時候,每臺伺服器上執行完全相同的簡單操作,也會花費大量的時間。

通過ssh加上多執行緒,可以實現併發訪問。為了將程式寫的靈活性更強,把要執行的命令以位置引數的方式來提供。

4.2 步驟

實現此案例需要按照如下步驟進行。

步驟一:編寫指令碼

  1. [[email protected] bin]# vim remote_comm.py
  2. #!/usr/bin/env python
  3. import paramiko
  4. import os
  5. import sys
  6. import threading
  7. def remote_comm(host, password, comm):
  8. ssh = paramiko.SSHClient()
  9. ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  10. ssh.connect(host, username='root', password=password)
  11. stdin, stdout, stderr = ssh.exec_command(comm)
  12. out = stdout.read()
  13. err = stderr.read()
  14. if out:
  15. print "[%s:out]: %s" % (host, out),
  16. if err:
  17. print "%s:Error: %s", (host, err),
  18. ssh.close()
  19. if __name__ == '__main__':
  20. if len(sys.argv) != 4:
  21. print "Usage: %s ipfile password 'comm'" % sys.argv[0]
  22. sys.exit(1)
  23. ipfile = sys.argv[1]
  24. if not os.path.isfile(ipfile):
  25. print "No such file: %s" % ipfile
  26. sys.exit(2)
  27. password = sys.argv[2]
  28. comm = sys.argv[3]
  29. with open(ipfile) as fobj:
  30. for line in fobj:
  31. ip = line.strip()
  32. t = threading.Thread(target=remote_comm, args=(ip, password, comm))
  33. t.start()

步驟二:測試指令碼執行

  1. [[email protected] bin]# python remote_comm.py ipaddr.txt tedu.cn 'useradd bob'

指令碼接受命令列引數,其中ipaddr.txt是存放所有遠端主機ip地址的檔案,檔案中每個ip地址佔一行。tedu.cn是遠端主機的密碼(所有遠端主機密碼需要是一致的)。最後的命令需要寫在引號中。

該示例執行成功後,會在所有遠端主機上建立一個名為bob的使用者。

相關推薦

簡化除法判斷 分析apache訪問日誌 掃描存活主機 利用執行實現ssh併發訪問

1 案例1:簡化除法判斷 1.1 問題 編寫mydiv.py指令碼,主要要求如下: 提示使用者輸入一個數字作為除數如果使用者按下Ctrl+C或Ctrl+D則退出程式如果使用者輸入非數字字元,提示使用者應該輸入數字如果使用者輸入0,提示使用者0不能作為除數1.2 方案

[C#學習筆記之執行2]執行同步與併發訪問共享資源工具—Lock、Monitor、Mutex、Semaphore

“執行緒同步”的含義         當一個程序啟動了多個執行緒時,如果需要控制這些執行緒的推進順序(比如A執行緒必須等待B和C執行緒執行完畢之後才能繼續執行),則稱這些執行緒需要進行“執行緒同步(thread synchronization)”。         執行緒

MySQL 原始碼分析 Innodb緩衝池刷髒的執行實現

簡介 為了提高效能,大多數的資料庫在操作資料時都不會直接讀寫磁碟,而是中間經過緩衝池,將要寫入磁碟的資料先寫入到緩衝池裡,然後在某個時刻後臺執行緒把修改的資料刷寫到磁碟上。MySQL的InnoDB引擎也使用緩衝池來快取從磁碟讀取或修改的資料頁,如果當前資料庫需要操作的資料集比緩衝池中的空閒頁面大

java執行的共享變數訪問控制例項

最近打算去一家電商公司,對於高併發的資料訪問控制有著嚴格的要求,近期打算把多執行緒的知識在好好補一下。 執行緒排程有五個狀態; 開始,可執行,執行,阻塞,死亡。 啟動執行緒有兩種方法。繼承Thread類或則實現Runnable介面,其實Thread類也實現

一個類有兩個方法,其中一個是同步的,另一個是非同步的; 現在又兩個執行A和B,請問:當執行A訪問此類的同步方法時,執行B是否能訪問此類的非同步方法?

一個類有兩個方法,其中一個是同步的,另一個是非同步的;現在又兩個執行緒A和B,請問:當執行緒A訪問此類的同步方法時,執行緒B是否能訪問此類的非同步方法? 答案:可以 驗證 package com.my.test2; public class ClassA { public syn

ThreadLocal:執行共享資源安全訪問新思路

ThreadLocal是解決執行緒安全問題一個很好的思路,ThreadLocal類中有一個Map,用於儲存每一個執行緒的變數副本,Map中元素的鍵為執行緒物件,而值對應執行緒的變數副本,由於Key值不可重複,每一個“執行緒物件”對應執行緒的“變數副本”,從而保證了執行緒安全

執行程式設計之資料訪問互斥——原理性

  在多執行緒存在的環境中,除了堆疊中的臨時資料之外,所有的資料都是共享的。如果我們需要執行緒之間正確地執行,那麼務必需要保證公共資料的執行和計算是正確的。簡單一點說,就是保證資料在執行的時候必須是互斥的。否則,如果兩個或者多個執行緒在同一時刻對資料進行了操作,那麼後果是不可想象的。   保證多執行緒之間

python 執行 實現掃描

# -*- coding: utf-8 -*- #!/usr/bin/python2 from socket import * import threading lock = threading.Lock() openNum = 0 def portScanner(

apache環境下禁止某資料夾內執行PHP指令碼、禁止訪問檔案或目錄執行許可權的設定方法

首先我們來看兩段對上傳目錄設定無許可權的列子,配置如下: <Directory"要去掉PHP執行許可權的目錄路徑,如/upload"> ErrorDocument 404 /404/404.html ErrorDocument 403 /404/403.htm

shell腳本案例(五)利用nmap批量掃描存活主機

shell腳本 linux shell 掃面 nmap arppinging 利用nmap批量掃描存活主機 知識儲備:grep,nmap 一、安裝nmap 1.安裝編譯環境 [root@arppinging nmap-7.01]# yum install gcc g++ gcc-c++

Python 掃描存活主機

ber test 客戶端訪問 get code true UC args 服務器 案例1:簡化除法判斷 案例2:分析apache訪問日誌 案例3:掃描存活主機 案例4:利用多線程實現ssh並發訪問 1 案例1:簡化除法判斷1.1 問題 編寫mydiv.py腳本,主要要求如下

Android執行分析之一:使用Thread非同步下載影象

Android多執行緒分析之一:使用Thread非同步下載影象 羅朝輝 (http://blog.csdn.net/kesalin) CC 許可,轉載請註明出處 打算整理一下對 Android Framework 中多執行緒相關知識的理解,主要集中在 Fra

pymysql執行訪問資料庫報錯:Packet sequence number wrong - got 7 expected 2

原文:https://www.cnblogs.com/heiao10duan/p/9373237.html 參考:https://www.jianshu.com/p/60c8e0e440ea 原因: 使用了多執行緒,多執行緒共享了同一個資料庫連線,但每個execute前沒有加上互斥鎖

Java 執行分段下載原理分析實現

多執行緒下載介紹   多執行緒下載技術是很常見的一種下載方案,這種方式充分利用了多執行緒的優勢,在同一時間段內通過多個執行緒發起下載請求,將需要下載的資料分割成多個部分,每一個執行緒只負責下載其中一個部分,然後將下載後的資料組裝成完整的資料檔案,這樣便大大加快了下載效率。常見的下載器,迅

執行記憶體問題分析之mprotect方法【轉】

轉自:https://blog.csdn.net/agwtpcbox/article/details/53230664 http://www.yebangyu.org/blog/2016/02/01/detectmemoryghostinmultithread/ 多執行緒中的記憶體問題,一直被認為是噩夢般

[.net 執行]ConcurrentBag原始碼分析

ConcurrentBag根據操作執行緒,對不同執行緒分配不同的佇列進行資料操作。這樣,每個佇列只有一個執行緒在操作,不會發生併發問題。其內部實現運用了net4.0新加入的ThreadLocal執行緒本地儲存功能。各個佇列間通過連結串列維護。 其內部結構如下:   1、獲取執行緒本地佇列:

執行非同步操作日誌

上次寫的一篇部落格,多執行緒非同步操作日誌不完整,現在寫一個完整的 功能是:使用者訪問一個controller,將訪問的記錄儲存到佇列中去,在開啟定時器,消費掉記錄儲存到檔案中(可改為儲存到資料庫) 我的idea目錄: controller中的程式碼: package com.

c# 執行使用佇列順序寫日誌的類 (需要再優化)

using System; using System.Collections.Generic; using System.Threading; public class LogManager { /// <summary> /// 建構函式 /// </su

Java定時任務Timer排程器【二】 執行原始碼分析(圖文版)

  上一節通過一個小例子分析了Timer執行過程,牽涉的執行執行緒雖然只有兩個,但實際場景會比上面複雜一些。 首先通過一張簡單類圖(只列出簡單的依賴關係)看一下Timer暴露的介面。   為了演示Timer所暴露的介面,下面舉一個極端的例子(每一個介面方法面

執行-day-11AbstractQueuedSynchronizer深入分析

AbstractQueuedSynchronizer深入分析         AQS理解起來不難,繁複的概念卻讓人望而生怯,這裡將花幾天時間對AQS進行一個詳細剖析。 什麼是AQS?         AQ