深入理解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()
上一篇: 初次探索Paramiko库的奥秘
推荐阅读
-
深入理解 GMP:使用GNU多精度库进行高精度计算-4. GMP的优势和应用
-
深入理解Gnet Go网络库的核心工作机制
-
深入理解并剖析高性能 Golang 网络库 evio 的源代码
-
深入理解适用于Cortex-M系列微控制器的CMSIS-NN神经网络推理库
-
深入理解WCF的背后:探索事务框架机制的运作原理(下集)
-
深入理解UDS CAN故障检测:什么是UDS(ISO 14229)诊断方法?——探索UDS诊断服务的奥秘
-
深入理解Spring:入门篇——探索Spring Web请求的奥秘
-
理解与实战:Java SSH库JSch - 用途解析、四大认证法、无密码登录设置、SSH公钥验证深入讲解、三种选择方案、SFTP文件传输详解、Maven集成及实用代码实例 - 专讲JSch在SFTP文件传输中的应用
-
深入理解Java泛型:详尽剖析通用方法的奥秘
-
理解基础数据库知识:IDEFO模型入门,详解实体、实体型和实体集差异,深入剖析各种函数依赖类型(全、部分、传递、平凡与非平凡),以及关键码(超码、主码、候选码)的基本概念及其区别