paramiko模組(遠端傳送指令)
阿新 • • 發佈:2020-08-20
1 paramiko模組安裝
paramiko是一個用於做遠端控制的模組,使用該模組可以對遠端伺服器進行命令或檔案操作,基於linux中的ssh服務
paramiko屬於第三方模組,需要安裝匯入
# pip3 install paramiko
2 使用paramiko
#設定ssh連線的遠端主機地址和埠 t=paramiko.Transport((ip,port)) #設定登入名和密碼 t.connect(username=username,password=password) #連線成功後開啟一個channel chan=t.open_session() #設定會話超時時間 chan.settimeout(session_timeout)#開啟遠端的terminal chan.get_pty() #啟用terminal chan.invoke_shell() 然後就可以通過chan.send('command')和chan.recv(recv_buffer)來遠端執行命令以及本地獲取反饋。
paramiko有兩個模組SSHClient()和SFTPClient()
利用SSHClient()
#coding:utf-8 import paramiko #建立SSH物件 ssh = paramiko.SSHClient() # 允許連線不在know_hosts檔案中的主機,如果不在know_hosts裡面的主機連線是會提示讓輸入yesssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 連線伺服器 ssh.connect(hostname='192.168.2.103', port=22, username='root', password='123456') # 執行命令 stdin, stdout, stderr = ssh.exec_command('ls') # 獲取命令結果 result = stdout.read() print (str(result,encoding='utf-8')) # 關閉連線 ssh.close()
SSHClient()裡面有一個transport變數,這個是用於獲取連線的,因此我們也可以單獨的獲取到transport變數,然後執行連線操作
#coding:utf-8 import paramiko transport = paramiko.Transport(('192.168.2.103', 22)) transport.connect(username='root', password='123456') ssh = paramiko.SSHClient() ssh._transport = transport stdin, stdout, stderr = ssh.exec_command('df') print (str(stdout.read(),encoding='utf-8')) transport.close()
用transport實現上傳下載以及命令的執行:
#coding:utf-8 import paramiko import uuid class SSHConnection(object): def __init__(self, host='192.168.2.103', port=22, username='root',pwd='123456'): self.host = host self.port = port self.username = username self.pwd = pwd self.__k = None def connect(self): transport = paramiko.Transport((self.host,self.port)) transport.connect(username=self.username,password=self.pwd) self.__transport = transport def close(self): self.__transport.close() def upload(self,local_path,target_path): # 連線,上傳 # file_name = self.create_file() sftp = paramiko.SFTPClient.from_transport(self.__transport) # 將location.py 上傳至伺服器 /tmp/test.py sftp.put(local_path, target_path) def download(self,remote_path,local_path): sftp = paramiko.SFTPClient.from_transport(self.__transport) sftp.get(remote_path,local_path) def cmd(self, command): ssh = paramiko.SSHClient() ssh._transport = self.__transport # 執行命令 stdin, stdout, stderr = ssh.exec_command(command) # 獲取命令結果 result = stdout.read() print (str(result,encoding='utf-8')) return result ssh = SSHConnection() ssh.connect() ssh.cmd("ls") ssh.upload('s1.py','/tmp/ks77.py') ssh.download('/tmp/test.py','kkkk',) ssh.cmd("df") ssh.close()View Code
3 與linux連線
下面是兩種使用paramiko連線到linux伺服器的程式碼
方式一:
# ssh = paramiko.SSHClient() # ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # ssh.connect("某IP地址",22,"使用者名稱", "密碼") # eg: # ssh.connect(hostname='192.168.37.100', port=22, username='root', password='123456')
方式二:
# t = paramiko.Transport(("主機",埠)) # t.connect(username = "使用者名稱", password = "密碼")
SFTPClient()也是使用transport來實現的,因此如果有需求需要執行命令和上傳檔案糅合在一起的話,那麼就需要使用transport的方式來實現。
如果連線遠端主機需要提供金鑰,上面第二行程式碼可改成:
t.connect(username = "使用者名稱", password = "口令", hostkey="金鑰")
3.1 windows對linux執行任意命令,並將結果輸出
如果linux伺服器開放了22埠,在windows端,我們可以使用paramiko遠端連線到該伺服器,並執行任意命令,然後通過 print或其它方式得到該結果,
程式碼如下
#coding:Utf8 import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect("某IP地址",22,"使用者名稱", "口令") stdin, stdout, stderr = ssh.exec_command("你的命令") print stdout.readlines() ssh.close()
其中的”你的命令”可以任意linux支援的命令
3.2 從widnows端下載linux伺服器上的檔案
import paramiko t = paramiko.Transport(("192.168.37.100", 22)) t.connect(username="root", password="123456") sftp = paramiko.SFTPClient.from_transport(t) remotepath = "/root/test_ip.sh" # 遠端linux的檔案位置 localpath = "./test_ip.sh" # 要存在本地的位置 sftp.get(remotepath, localpath) t.close()
3.3 從widnows端上傳檔案到linux伺服器
import paramiko t = paramiko.Transport(("192.168.37.100", 22)) t.connect(username="root", password="123456") sftp = paramiko.SFTPClient.from_transport(t) remotepath = "/root/test_ip.sh" # 遠端linux的檔案位置 localpath = "./test_ip.sh" # 本地的位置 sftp.put(localpath, remotepath) t.close()