一、Paramiko模塊 1.Paramiko安裝 Python的目錄下有個Scripts目錄,cd到這個目錄用這裡面的pip命令(如果添加的環境變數可以在cmd直接輸入命令):pip install paramiko。如果pip版本低會有提示,python -m pip install --upg ...
一、Paramiko模塊
1.Paramiko安裝
Python的目錄下有個Scripts目錄,cd到這個目錄用這裡面的pip命令(如果添加的環境變數可以在cmd直接輸入命令):pip install paramiko。如果pip版本低會有提示,python -m pip install --upgrade pip 升級pip,再次輸入pip install paramiko。
2.SSHClient
用於連接遠程伺服器並執行基本命令
#基於用戶名密碼連接:
import paramiko # 創建SSH對象 ssh = paramiko.SSHClient() # 允許連接不在know_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 連接伺服器 ssh.connect(hostname='192.168.1.122', port=22, username='root', password='123456') # 執行命令 stdin, stdout, stderr = ssh.exec_command('ls') # 獲取命令結果 res,err = stdout.read(),stderr.read() result = res if res else err print(result.decode()) # 關閉連接 ssh.close()
SSHClient 封裝 Transport
1 import paramiko 2 3 transport = paramiko.Transport(('192.168.1.122', 22)) 4 transport.connect(username='root', password='123456') 5 6 ssh = paramiko.SSHClient() 7 ssh._transport = transport 8 9 stdin, stdout, stderr = ssh.exec_command('df') 10 print stdout.read() 11 12 transport.close()
基於公鑰密鑰連接:
import paramiko private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') # 創建SSH對象 ssh = paramiko.SSHClient() # 允許連接不在know_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 連接伺服器 ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', key=private_key) # 執行命令 stdin, stdout, stderr = ssh.exec_command('df') # 獲取命令結果 result = stdout.read() # 關閉連接 ssh.close()
1 import paramiko 2 3 private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') 4 5 transport = paramiko.Transport(('hostname', 22)) 6 transport.connect(username='wupeiqi', pkey=private_key) 7 8 ssh = paramiko.SSHClient() 9 ssh._transport = transport 10 11 stdin, stdout, stderr = ssh.exec_command('df') 12 13 transport.close()SSHClient 封裝 Transport
3.SFTPClient
用於連接遠程伺服器並執行上傳下載
import paramiko transport = paramiko.Transport(('hostname',22)) transport.connect(username='wupeiqi',password='123') sftp = paramiko.SFTPClient.from_transport(transport) # 將location.py 上傳至伺服器 /tmp/test.py sftp.put('/tmp/location.py', '/tmp/test.py') # 將remove_path 下載到本地 local_path sftp.get('remove_path', 'local_path') transport.close()
1 import paramiko 2 3 private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') 4 5 transport = paramiko.Transport(('hostname', 22)) 6 transport.connect(username='wupeiqi', pkey=private_key ) 7 8 sftp = paramiko.SFTPClient.from_transport(transport) 9 # 將location.py 上傳至伺服器 /tmp/test.py 10 sftp.put('/tmp/location.py', '/tmp/test.py') 11 # 將remove_path 下載到本地 local_path 12 sftp.get('remove_path', 'local_path') 13 14 transport.close()基於公鑰密鑰上傳下載
二、進程與線程
1.進程與線程介紹和關係
線程:線程是操作系統能夠進行運算調度的最小單位嗎,是一串指令的集和。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以併發多個線程,每條線程並行執行不同的任務。
進程:進程是具有一定獨立功能的程式關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。
1)一個程式至少有一個進程,一個進程至少有一個線程
2)同一個進程下的線程共用記憶體空間,進程的記憶體是獨立的
3)同一個進程的線程之間可以直接交流,兩個進程想通信,必須通過一個中間代理來實現
4)創建新線程很簡單, 創建新進程需要對其父進程進行一次克隆
5)一個線程可以控制和操作同一進程里的其他線程,但是進程只能操作子進程
無論你啟多少個線程,你有多少個cpu, Python在執行的時候會淡定的在同一時刻只允許一個線程運行
2.Python threading模塊
#直接調用 import threading import time def sayhi(num): #定義每個線程要運行的函數 print("running on number:%s" %num) time.sleep(3) t1 = threading.Thread(target=sayhi,args=(1,)) #生成一個線程實例 t2 = threading.Thread(target=sayhi,args=(2,)) #生成另一個線程實例 t1.start() #啟動線程 t2.start() #啟動另一個線程
執行完會發現不是執行t1的print後 running on number:1 sleep 3秒再執行t2,而是t1和t2的print幾乎同時出結果後
running on number:1
running on number:2
等待3s結束,下麵繼承式寫了寫了開始和結束的輸出看著更明顯一些。
#繼承式調用 class MyThread(threading.Thread): def __init__(self,n,sleep_time): super(MyThread,self).__init__() self.n = n self.sleep_time = sleep_time def run(self): print("runnint task ",self.n ) time.sleep(self.sleep_time) print("task done,",self.n ) t1 = MyThread("t1",2) t2 = MyThread("t2",4) t1.start() t2.start() ''' runnint task t1 runnint task t2 main thread.... task done, t1 task done, t2 '''
3.Join & Daemon
threading的join,一旦調用會等到調用它的線程執行完畢再執行其他的線程,上代碼看結果
import threading import time def sayhi(num): #定義每個線程要運行的函數 print("running on number:%s" %num) time.sleep(3) print("%s睡完了" %num) t1 = threading.Thread(target=sayhi,args=(1,)) #生成一個線程實例 t2 = threading.Thread(target=sayhi,args=(2,)) #生成另一個線程實例 t1.start() #啟動線程 t1.join() #-----------------------------等t1執行完---------------------------------- t2.start() #啟動另一個線程 '''執行結果: running on number:1 1睡完了 running on number:2 2睡完了 '''
import threading import time def sayhi(num): #定義每個線程要運行的函數 print("running on number:%s" %num) time.sleep(3) print("%s睡完了" %num) t1 = threading.Thread(target=sayhi,args=(1,)) #生成一個線程實例 t2 = threading.Thread(target=sayhi,args=(2,)) #生成另一個線程實例 t2.setDaemon(True) t1.start() #啟動線程 t1.join() #等t1執行完 t2.start() #啟動另一個線程 ''' running on number:1 1睡完了 running on number:2 #主進程執行完殺死子進程 '''
4.線程鎖
一個進程下可以啟動多個線程,多個線程共用父進程的記憶體空間,也就意味著每個線程可以訪問同一份數據,每個線程在要修改公共數據時,為了避免自己在還沒改完的時候別人也來修改此數據,可以給這個數據加一把鎖, 這樣其它線程想修改此數據時就必須等待你修改完畢並把鎖釋放掉後才能再訪問此數據。
import time import threading def addNum(): global num #在每個線程中都獲取這個全局變數 print('--get num:',num ) time.sleep(1) lock.acquire() #修改數據前加鎖 num -=1 #對此公共變數進行-1操作 lock.release() #修改後釋放 num = 100 #設定一個共用變數 thread_list = [] lock = threading.Lock() #生成全局鎖 for i in range(100): t = threading.Thread(target=addNum) t.start() thread_list.append(t) for t in thread_list: #等待所有線程執行完畢 t.join() print('final num:', num )