簡化除法判斷 分析apache訪問日誌 掃描存活主機 利用多執行緒實現ssh併發訪問
1 案例1:簡化除法判斷
1.1 問題
編寫mydiv.py指令碼,主要要求如下:
- 提示使用者輸入一個數字作為除數
- 如果使用者按下Ctrl+C或Ctrl+D則退出程式
- 如果使用者輸入非數字字元,提示使用者應該輸入數字
- 如果使用者輸入0,提示使用者0不能作為除數
1.2 方案
使用if語句判斷除數是否合適,需要編寫多條語句。有了異常處理,可以本著先做,錯了再說的邏輯。直接把除法操作放在try語句中執行,根據產生的異常做相應的處理。
另外,Ctrl+C或Ctrl+D只能通過異常捕獲。
異常捕獲的語法如下:
- try:
- A
- except:
- B
- else:
- C
- finally:
- D
把可能發生異常的語句放在A裡面執行,如果出現異常則執行B語句,沒有異常則執行C語句。不管是否出現異常都會執行D語句。
捕獲異常時,可以使用多個except語句,每個except語句捕獲一個異常,每個異常給定不同的處理方法。也可以把多個異常放在同一個except語句後面,但是務必注意,多個異常寫在相同的一行,一定要注括號括起來,放在元組中。
1.3 步驟
實現此案例需要按照如下步驟進行。
步驟一:編寫指令碼
- #!/usr/bin/env python
- import sys
- while True:
- try
- result = 100/ int(raw_input('enter a number: '))
- except (ValueError, ZeroDivisionError), e: #將異常原因儲存在變數e中
- print "invalid input:", e
- continue
- except (EOFError, KeyboardInterrupt):
- sys.exit(1)
- break
- print result
步驟二:測試指令碼執行
- [[email protected] bin]# ./
- enter a number: 0
- invalid input: integer division or modulo by zero
- enter a number: abc
- invalid input: invalid literal for int() with base 10: 'abc'
- enter a number: 3
- 33
2 案例2:分析apache訪問日誌
2.1 問題
編寫用於分析apache日誌的指令碼,主要要求如下:
- 統計每個客戶端訪問apache伺服器的次數
- 將統計資訊通過字典的方式顯示出來
- 分別統計客戶端是Firefox和MSIE的訪問次數
- 分別使用函數語言程式設計和麵向物件程式設計的方式實現
2.2 方案
涉及到文字處理時,正則表示式將是一個非常強大的工具。匹配客戶端的IP地址,可以使用正則表示式的元字元,匹配字串可以直接使用字元的表面含義。
入門級程式設計師的寫法,使用順序的結構,直接編寫。這種方法雖然可以得出結果,但是程式碼難以重用。參考步驟一。
進階的寫法可以採用函數語言程式設計,方便日後再次使用。參考步驟二。
最後,還可以使用OOP的程式設計方法,先定義一個統計類,該類將正則表示式作為它的資料屬性。再定義一個方法,從指定的檔案中搜索正則表示式出現的次數,並將其存入到一個字典中。參考步驟三。
2.3 步驟
實現此案例需要按照如下步驟進行。
步驟一:簡單實現
- [[email protected] bin]# vim countweb.py
- #!/usr/bin/env python
- import re
- logfile = '/var/log/httpd/access_log'
- cDict = {}
- patt_ip = '^\d+\.\d+\.\d+\.\d+' #定義匹配IP地址的正則表示式
- with open(logfile) as f:
- for eachLine in f:
- m = re.search(patt_ip, eachLine)
- if m is not None:
- ipaddr = m.group()
- #如果IP地址已在字典中,將其值加1,否則初始值設定為1
- cDict[ipaddr] = cDict.get(ipaddr, 0) + 1
- print cDict
步驟二:使用函數語言程式設計實現
- [[email protected] bin]# vim countweb2.py
- !/usr/bin/env python
- import re
- def countPatt(patt, fname): #定義可以在指定檔案中搜索指定字串的函式
- cDict = {}
- with open(fname) as f:
- for eachLine in f:
- m = re.search(patt, eachLine)
- if m is not None:
- k = m.group()
- cDict[k] = cDict.get(k, 0) + 1
- return cDict
- def test():
- logfile = '/var/log/httpd/access_log'
- patt_ip = '^\d+\.\d+\.\d+\.\d+'
- print countPatt(patt_ip, logfile)
- patt_br = 'Firefox|MSIE'
- print countPatt(patt_br, logfile)
- if __name__ == '__main__':
- test()
3 案例3:掃描存活主機
3.1 問題
編寫掃描存活主機的指令碼,主要要求如下:
- 呼叫系統的ping命令進行掃描
- 掃描教室環境下所有存活的主機
- 採用多執行緒的方式編寫
- 方案
os模組的system()函式可以呼叫系統命令,其返回值是系統命令退出碼,也就是如果系統命令成功執行,返回0,如果沒有成功執行,返回非零值。
本例掃描主機,可以呼叫系統的ping命令,通過退出碼來判斷是否ping通了該主機。如果順序執行,每個ping操作需要消耗數秒鐘,全部的254個地址需要10分鐘以上。而採用多執行緒,可以實現對這254個地址同時執行ping操作,併發的結果就是將執行時間縮短到了10秒鐘左右。
3.2 步驟
實現此案例需要按照如下步驟進行。
步驟一:編寫指令碼
- [[email protected] bin]# vim mtping.py
- #!/usr/bin/env python
- import subprocess
- import threading
- import sys
- def ping(ip):
- result = subprocess.call("ping -c2 %s &> /dev/null" % ip, shell=True)
- if result:
- print "%s:down" % ip
- else:
- print "%s:up" % ip
- if __name__ == '__main__':
- if len(sys.argv) != 2:
- print "Usage: %s subnet" % sys.argv[0]
- sys.exit(1)
- net_list = sys.argv[1].split('.')
- net = '.'.join(net_list[:-1])
- ips = ("%s.%s" % (net, i) for i in range(1, 255))
- for ip in ips:
- t = threading.Thread(target=ping, args=(ip,))
- t.start()
步驟二:測試指令碼執行
- [[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 步驟
實現此案例需要按照如下步驟進行。
步驟一:編寫指令碼
- [[email protected] bin]# vim remote_comm.py
- #!/usr/bin/env python
- import paramiko
- import os
- import sys
- import threading
- def remote_comm(host, password, comm):
- ssh = paramiko.SSHClient()
- ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- ssh.connect(host, username='root', password=password)
- stdin, stdout, stderr = ssh.exec_command(comm)
- out = stdout.read()
- err = stderr.read()
- if out:
- print "[%s:out]: %s" % (host, out),
- if err:
- print "%s:Error: %s", (host, err),
- ssh.close()
- if __name__ == '__main__':
- if len(sys.argv) != 4:
- print "Usage: %s ipfile password 'comm'" % sys.argv[0]
- sys.exit(1)
- ipfile = sys.argv[1]
- if not os.path.isfile(ipfile):
- print "No such file: %s" % ipfile
- sys.exit(2)
- password = sys.argv[2]
- comm = sys.argv[3]
- with open(ipfile) as fobj:
- for line in fobj:
- ip = line.strip()
- t = threading.Thread(target=remote_comm, args=(ip, password, comm))
- t.start()
步驟二:測試指令碼執行
- [[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