欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

深入理解Paramiko库的背后奥秘

最编程 2024-02-10 09:59:15
...

初始化一些参数:

host = "120.24.239.214"
port = 22
timeout = 30
user = "root"
password = "******"
      Paramiko远程执行linux命令:
# -*- coding:utf-8 -*-
import paramiko

defsftp_exec_command(command):
    try:
        ssh_client = paramiko.SSHClient()
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh_client.connect(host, 22, user, password)
        std_in, std_out, std_err = ssh_client.exec_command(command)
        for line in std_out:
            print line.strip("\n")
        ssh_client.close()
    except Exception, e:
        print e

if __name__ == '__main__':
    sftp_exec_command("ls -l")

 

 

        Paramiko上传文件:
# -*- coding:utf-8 -*-
import paramiko

defsftp_upload_file(server_path, local_path):
    try:
        t = paramiko.Transport((host, 22))
        t.connect(username=user, password=password)
        sftp = paramiko.SFTPClient.from_transport(t)
        sftp.put(local_path, server_path)
        t.close()
    except Exception, e:
        print e

if __name__ == '__main__':
    sftp_upload_file("/root/bug.txt", "D:/bug.txt")

 

 

Paramiko下载文件:

# -*- coding:utf-8 -*-
import paramiko

defsftp_down_file(server_path, local_path):
    try:
        t = paramiko.Transport((host, 22))
        t.connect(username=user, password=password)
        sftp = paramiko.SFTPClient.from_transport(t)
        sftp.get(server_path, local_path)
        t.close()
    except Exception, e:
        print e

if __name__ == '__main__':
    sftp_down_file("/root/test.txt", "D:/text.txt")

 

 

Python还有个默认的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件

ftp相关命令操作:

ftp.cwd(pathname)   #设置FTP当前操作的路径
ftp.dir()   #显示目录下文件信息
ftp.nlst()  #获取目录下的文件
ftp.mkd(pathname)   #新建远程目录
ftp.pwd()    #返回当前所在位置
ftp.rmd(dirname)    #删除远程目录
ftp.delete(filename)    #删除远程文件
ftp.rename(fromname, toname)    #将fromname修改名称为toname。
ftp.storbinaly("STOR filename.txt",file_handel,bufsize)     #上传目标文件
ftp.retrbinary("RETR filename.txt",file_handel,bufsize)     #下载FTP文件

 

 

一些小例子:

# -*- coding:utf-8 -*-
from ftplib import FTP, all_errors
import paramiko
import sys, os
import getpass

defftp_main():
    try:
        f = FTP("ftp.ibiblio.org")
        print f.getwelcome()
        f.login()
        print f.pwd()
        f.quit()
    except Exception, e:
        print all_errors, e


defftp_down_file():
    try:
        f = FTP("ftp.kernel.org")
        f.login()
        f.cwd("/pub/linux/kernel/v1.0")
        fd = open("patch8.gz", "wb")
        # 以ASCII模式下载文件
        # f.retrlines("RETE patch8.gz", writeline)
        # 以二进制模式下载文件
        f.retrbinary("RETE patch8.gz", fd.write)
        fd.close()
        f.quit()
    except Exception, e:
        print all_errors, e


defftp_up_file():
    try:
        host2, username, local_path, server_path = sys.argv[1:]
        password2 = getpass.getpass("Enter passworf for %s on %s:" % (username, host2))
        f = FTP(host2)
        f.login(user=username, passwd=password2)
        f.cwd(server_path)
        fd = open(local_path, "rb")
        f.storbinary("STOR %s" % os.path.basename(local_path), fd)
        fd.close()
        f.quit()
    except Exception, e:
        print all_errors, e

 

 

总结:

Parmmiko很好的完成sftp文件传输操作,可以用在SVN管理代码项目中进行持续集成开发或者测试

原文链接:http://blog.****.net/Temanm/article/details/50607741

 

这里还有一篇讲得更详细的,这在这里一并发过来,有助于加深理解。

 

paramiko模块提供了ssh及sft进行远程登录服务器执行命令和上传下载文件的功能。这是一个第三方的软件包,使用之前需要安装。

1 基于用户名和密码的 sshclient 方式登录

# 建立一个sshclient对象
ssh = paramiko.SSHClient()
# 允许将信任的主机自动加入到host_allow 列表,此方法必须放在connect方法的前面
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 调用connect方法连接服务器
ssh.connect(hostname='192.168.2.129', port=22, username='super', password='super')
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df -hl')
# 结果放到stdout中,如果有错误将放到stderr中
print(stdout.read().decode())
# 关闭连接
ssh.close()

 

 

2 基于用户名和密码的 transport 方式登录 
方法1是传统的连接服务器、执行命令、关闭的一个操作,有时候需要登录上服务器执行多个操作,比如执行命令、上传/下载文件,方法1则无法实现,可以通过如下方式来操作

# 实例化一个transport对象
trans = paramiko.Transport(('192.168.2.129', 22))
# 建立连接
trans.connect(username='super', password='super')

# 将sshclient的对象的transport指定为以上的trans
ssh = paramiko.SSHClient()
ssh._transport = trans
# 执行命令,和传统方法一样
stdin, stdout, stderr = ssh.exec_command('df -hl')
print(stdout.read().decode())

# 关闭连接
trans.close()

 

 

3 基于公钥密钥的 SSHClient 方式登录

# 指定本地的RSA私钥文件,如果建立密钥对时设置的有密码,password为设定的密码,如无不用指定password参数
pkey = paramiko.RSAKey.from_private_key_file('/home/super/.ssh/id_rsa', password='12345')
# 建立连接
ssh = paramiko.SSHClient()
ssh.connect(hostname='192.168.2.129',
            port=22,
            username='super',
            pkey=pkey)
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df -hl')
# 结果放到stdout中,如果有错误将放到stderr中
print(stdout.read().decode())
# 关闭连接
ssh.close()

 

4 基于密钥的 Transport 方式登录

# 指定本地的RSA私钥文件,如果建立密钥对时设置的有密码,password为设定的密码,如无不用指定password参数
pkey = paramiko.RSAKey.from_private_key_file('/home/super/.ssh/id_rsa', password='12345')
# 建立连接
trans = paramiko.Transport(('192.168.2.129', 22))
trans.connect(username='super', pkey=pkey)

# 将sshclient的对象的transport指定为以上的trans
ssh = paramiko.SSHClient()
ssh._transport = trans

# 执行命令,和传统方法一样
stdin, stdout, stderr = ssh.exec_command('df -hl')
print(stdout.read().decode())

# 关闭连接
trans.close()