1. 程式人生 > 實用技巧 >paramiko模組(遠端傳送指令)

paramiko模組(遠端傳送指令)

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裡面的主機連線是會提示讓輸入yes
ssh.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()