pamamiko的学习笔记

pamamiko的学习笔记

Paramiko包含两个核心组件,一个为SSHClient类,另一个为SFTPClient类,
一,paramiko的连接有两种方式,一种是通过paramiko.SSHClient()函数,另外一种是通过paramiko.Transport()函数

【SSHClient类】

该类封装了传输,通道,及SFTPClient的校验,建立方法,通常用于执行远程命令,

client=paramiko.SSHClient()
client.load_system_host_keys()
client.connect('172.25.254.1')
stdin,stdout,stderr=client.exec_command('ls -l')                                                       

如果设置链接的远程主机没有本地主机密钥,需要添加一下

ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

【SFTPClient类】

1)from_transport方法:
创建一个已连通的SFTP客户端通道,
例子说明:

t=paramiko.Transport("172.25.254.1")
t.connect(username="root",password="redhat")
sftp=paramiko.SFTPClient.from_transport(t)

put:上传本地文件:
get:下载远程文件到本地
mkdir :在服务端创建目录
remove:删除服务端目录
使用密码的方式登录

[root@desktop0 420]# cat c.py 
#!/usr/bin/env python
#coding=utf8
import paramiko
hostname='172.25.254.1'
port=22
username='root'
password='redhat'
#创建SSH连接日志(只保留前一次的详细日志,以前的日志会被覆盖)
paramiko.util.log_to_file('paramiko.log')
s=paramiko.SSHClient()
s.load_system_host_keys()#读取know_host
#s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 如果没有在know_host文件里自动加进去
s.connect(hostname,port,username,password)
stdin,stdout,stderr=s.exec_command('df -h')#执行命令
print stdout.read()
s.close()

运行结果:

[root@desktop0 420]# python c.py 
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root  6.7G  2.0G  4.4G  32% /
tmpfs                         246M     0  246M   0% /dev/shm
/dev/vda1                     485M   34M  426M   8% /boot

使用证书的方式登录:
做一个key认证,把公钥拷贝给远程主机。

#!/usr/bin/env python
import paramiko
hostname='172.25.254.1'
port=22
username='root'
key_file='/root/.ssh/id_rsa'
key=paramiko.RSAKey.from_private_key_file(key_file)
s=paramiko.SSHClient()
s.load_system_host_keys()
s.connect(hostname,port,username,pkey=key)
stdin,stdout,stderr=s.exec_command('df -h')
print stdout.read()
print stderr.read()
s.close()

实现单个文件的上传下载

[root@desktop0 420]# cat 1.py 
#!/usr/bin/env python
import paramiko
scp=paramiko.Transport(('172.25.254.1',22))
scp.connect(username='root',password='redhat') 
sftp=paramiko.SFTPClient.from_transport(scp) #创建一个sftp客户端对象,通过ssh transport操作远程文件;
sftp.get('/mnt/406/kk.sh','/mnt/file')
sftp.put('/mnt/mysql.py','/mnt/mimi')
scp.close()

一个目录下多个文件上传下载示例:

[root@desktop0 420]# cat 2.py 
#!/usr/bin/env python
#coding=utf8
import paramiko
import datetime
import os
hostname='172.25.254.1'
username='root'
password='redhat'
port=22

当本地没有mimi目录时会报错

local_dir='/mnt/mimi/' 
remote_dir='/mnt/406/'
t=paramiko.Transport((hostname,port))
t.connect(username=username,password=password)
sftp=paramiko.SFTPClient.from_transport(t)
files=sftp.listdir(remote_dir)
for f in files:
    print '################################'
    print 'beginning to download file from %s %s'%(hostname,datetime.datetime.now())
    print 'downloading file',os.path.join(remote_dir)
    sftp.get(os.path.join(remote_dir,f),os.path.join(local_dir,f))
    print ''
    print '#####################################'
t.close()

注意:当下载或上传单个远程文件的时候要指定文件下载到本地的文件名,不能指定目录。否则会报错

原文地址:https://www.cnblogs.com/hanfei-1005/p/5703679.html