码迷,mamicode.com
首页 > 编程语言 > 详细

python工具编写之paramiko实现SSH远程连接

时间:2017-09-17 18:57:01      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:直接   timeout   miss   set   hosts   打印   int   上传   代码   

客户端实现有三种方式:

1:用账号密码登陆

1.1直接使用SSHClient对象的exec_command()在服务端执行命令:

代码实现:

import paramiko
import sys

def Usage():
    print "[Usage]./SSH_Client.py ip port command"


try:
    ip=sys.argv[1]
    port=int(sys.argv[2])
    command=sys.argv[3]
except:
    Usage()    


user="root"
passwd="root"
#实例化SSHClient
client=paramiko.SSHClient()
#自动添加策略,保存服务器的主机名和密钥信息
#用ssh连接远程主机时,第一次连接时会提示是否继续进行远程连接,选择yes 这句话会自动选择yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接SSH服务端,以用户名和密码进行认证
client.connect(ip,port,username=user,password=passwd)
#打开一个Channel 并执行命令
stdin,stdout,stderr=client.exec_command(command)
#打印执行结果 若有错误 stderr.read()就不为空
if stderr.read()=="":
    for i in stdout.readlines():
        print i
client.close()

1.2实例化SSHClient的对象再得到一个Transport对象,以Transport对象的exec_command()在服务端执行命令

import sys
import paramiko

def Usage():
    print "[Usage]./SSH_Client.py ip port command"


try:
    ip=sys.argv[1]
    port=int(sys.argv[2])
    command=sys.argv[3]
except:
    Usage()    

# reload(sys)
# sys.setdefaultencoding(‘utf-8‘)    
user="root"
passwd="root"
#实例化SSHClient
client=paramiko.SSHClient()
#自动添加策略,保存服务器的主机名和密钥信息
#用ssh连接远程主机时,第一次连接时会提示是否继续进行远程连接,选择yes 这句话会自动选择yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接SSH服务端,以用户名和密码进行认证
client.connect(ip,port,username=user,password=passwd)
#实例化Transport 建立session会话
ssh_session=client.get_transport().open_session()
if ssh_session.active:
    ssh_session.exec_command(command)
    print ssh_session.recv(4096)
client.close()              

2:用密钥进行登陆

import paramiko
import sys

def Usage():
    print "[Usage]./SSH_Client.py ip port command"


try:
    ip=sys.argv[1]
    port=int(sys.argv[2])
    command=sys.argv[3]
except:
    Usage()    

user="root"

#实例化SSHClient
client=paramiko.SSHClient()
#指定用来解密的私钥的路径,需要手动生成
pkey_file = ‘/home/.ssh/id_rsa‘   
#使用私钥解密
key = paramiko.RSAKey.from_private_key_file(pkey_file)    
#load_system_host_keys用于指定对方主机存放本机公钥的位置,默认不加参数的话是将这个位置设置为~/.ssh/known_hosts
client.load_system_host_keys()
#自动添加策略,保存服务器的主机名和密钥信息
#用ssh连接远程主机时,第一次连接时会提示是否继续进行远程连接,选择yes 这句话会自动选择yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接SSH服务端,以用户名和密码进行认证
client.connect(ip,port,username=user,key_filename=key,timeout=6)
#打开一个Channel 并执行命令
stdin,stdout,stderr=client.exec_comment(command)
#打印执行结果 若有错误 stderr.read()就不为空
if stderr.read()=="":
    print stdout.readlines()
client.close()

实现上传下载:

import paramiko
#获取Transport实例  参数为tuple
tran = paramiko.Transport(("192.168.72.130",22))
#连接SSH服务端
tran.connect(username ="root", password ="root")
#获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(tran)
#设置上传的本地/远程文件路径
#执行上传动作
sftp.put("C:/7.der","/tmp/7.der")
sftp.get(‘/root/test.py‘,‘F:/test.py‘)
tran.close()

实现过程中出现的问题:

import paramiko时出现UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe9 in position 0: ordinal not in range(128) 错误

解决办法:在python 安装路径下Lib\site.py 添加如下代码:

import sys

reload(sys)

sys.setdefaultencoding(‘gbk‘)

经过测试 设置编码为utf-8还是导入不成功 设置为gbk可以成功导入

登陆所要的密钥需要手动生成:可以参考

http://blog.sina.com.cn/s/blog_7ae2408501018xsj.html

http://blog.csdn.net/fdipzone/article/details/47327183

 

python工具编写之paramiko实现SSH远程连接

标签:直接   timeout   miss   set   hosts   打印   int   上传   代码   

原文地址:http://www.cnblogs.com/arongmh/p/7536437.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!