python模块paramiko与ssh安装配置教程,堡垒机实例

一、paramiko模块的安装,基于公钥密钥连接

一、paramiko模块的设置
python模块paramiko与ssh安装配置教程,堡垒机实例。paramiko模块信赖PyCrypto模块,而PyCrypto必要GCC库编写翻译,但是貌似发行版的源里带有该模块。这里以centos6为例,直接信赖以下命令可以直接实现安装:

Python之路:壁垒机实例,python壁垒

 代码如下

碉堡机前戏

支出沟壍机在此之前,先来读书Python的paramiko模块,该模块机会SSH用于连接远程服务器并执行有关操作

SSHClient

用来连接远程服务器并实行基本命令

根据顾客名密码连接:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import paramiko    # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', password='123')    # 执行命令 stdin, stdout, stderr = ssh.exec_command('df') # 获取命令结果 result = stdout.read()    # 关闭连接 ssh.close()

图片 1 1 import
paramiko 2 3 transport = paramiko.Transport((‘hostname’, 22)) 4
transport.connect(username=’wupeiqi’, password=’123′) 5 6 ssh =
paramiko.SSHClient() 7 ssh._transport = transport 8 9 stdin, stdout,
stderr = ssh.exec_command(‘df’) 10 print stdout.read() 11 12
transport.close() SSHClient 封装
Transport

基于公钥密钥连接:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import paramiko   private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')   # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', key=private_key)   # 执行命令 stdin, stdout, stderr = ssh.exec_command('df') # 获取命令结果 result = stdout.read()   # 关闭连接 ssh.close()

图片 2 1 import
paramiko 2 3 private_key =
paramiko.RSAKey.from_private_key_file(‘/home/auto/.ssh/id_rsa’) 4 5
transport = paramiko.Transport((‘hostname’, 22)) 6
transport.connect(username=’wupeiqi’, pkey=private_key) 7 8 ssh =
paramiko.SSHClient() 9 ssh._transport = transport 10 11 stdin, stdout,
stderr = ssh.exec_python模块paramiko与ssh安装配置教程,堡垒机实例。command(‘df’) 12 13 transport.close() SSHClient 封装 Transport

SFTPClient

用以连接远程服务器并奉行上传下载

基于客商名密码上传下载

1 2 3 4 5 6 7 8 9 10 11 12 import paramiko   transport = paramiko.Transport(('hostname',22)) transport.connect(username='wupeiqi',password='123')   sftp = paramiko.SFTPClient.from_transport(transport) # 将location.py 上传至服务器 /tmp/test.py sftp.put('/tmp/location.py', '/tmp/test.py') # 将remove_path 下载到本地 local_path sftp.get('remove_path', 'local_path')   transport.close()

依照公钥密钥上传下载

1 2 3 4 5 6 7 8 9 10 11 12 13 14 import paramiko   private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')   transport = paramiko.Transport(('hostname', 22)) transport.connect(username='wupeiqi', pkey=private_key )   sftp = paramiko.SFTPClient.from_transport(transport) # 将location.py 上传至服务器 /tmp/test.py sftp.put('/tmp/location.py', '/tmp/test.py') # 将remove_path 下载到本地 local_path sftp.get('remove_path', 'local_path')   transport.close()

图片 3 1
#!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import paramiko 4
import uuid 5 6 class Haproxy(object): 7 8 def __init__(self): 9
self.host = ‘172.16.103.191’ 10 self.port = 22 11 self.username =
‘wupeiqi’ 12 self.pwd = ‘123’ 13 self.__k = None 14 15 def
create_file(self): 16 file_name = str(uuid.uuid4()) 17 with
open(file_name,’w’) as f: 18 f.write(‘sb’) 19 return file_name 20 21
def run(self): 22 self.connect() 23 self.upload() 24 self.rename() 25
self.close() 26 27 def connect(self): 28 transport =
paramiko.Transport((self.host,self.port)) 29
transport.connect(username=self.username,password=self.pwd) 30
self.__transport = transport 31 32 def close(self): 33 34
self.__transport.close() 35 36 def upload(self): 37 # 连接,上传 38
file_name = self.create_python模块paramiko与ssh安装配置教程,堡垒机实例。file() 39 40 sftp =
paramiko.SFTPClient.from_python模块paramiko与ssh安装配置教程,堡垒机实例。transport(self.__transport) 41 #
将location.py 上传至服务器 /tmp/test.py 42 sftp.put(file_name,
‘/home/wupeiqi/tttttttttttt.py’) 43 44 def rename(self): 45 46 ssh =
paramiko.SSHClient() 47 ssh._transport = self.__transport 48 #
实践命令 49 stdin, stdout, stderr = ssh.exec_python模块paramiko与ssh安装配置教程,堡垒机实例。command(‘mv
/home/wupeiqi/tttttttttttt.py /home/wupeiqi/ooooooooo.py’) 50 #
获取命令结果 51 result = stdout.read() 52 53 54 ha = Haproxy() 55
ha.run() Demo

 

# yum install gcc python-crypto
python-paramiko python-devel  -y 

壁垒机的落实 

福如东海思路:

图片 4

碉堡机推行流程:

注:配置.brashrc完成ssh登陆后自动推行脚本,如:/usr/bin/python
/home/wupeiqi/menu.py

兑现进程

步骤一,完毕顾客登入

1 2 3 4 5 6 7 8 import getpass   user = raw_input('username:') pwd = getpass.getpass('password') if user == 'alex' and pwd == '123':     print '登陆成功' else:     print '登陆失败'

步骤二,依据顾客获得有关服务器列表

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 dic = {     'alex': [         '172.16.103.189',         'c10.puppet.com',         'c11.puppet.com',     ],     'eric': [         'c100.puppet.com',     ] }   host_list = dic['alex']   print 'please select:' for index, item in enumerate(host_list, 1):     print index, item   inp = raw_input('your select (No):') inp = int(inp) hostname = host_list[inp-1] port = 22

步骤三,依据客户名、私钥登入服务器

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 tran = paramiko.Transport((hostname, port,)) tran.start_client() default_path = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa') key = paramiko.RSAKey.from_private_key_file(default_path) tran.auth_publickey('wupeiqi', key)   # 打开一个通道 chan = tran.open_session() # 获取一个终端 chan.get_pty() # 激活器 chan.invoke_shell()   ######### # 利用sys.stdin,肆意妄为执行操作 # 用户在终端输入内容,并将内容发送至远程服务器 # 远程服务器执行命令,并将结果返回 # 用户终端显示内容 #########   chan.close() tran.close()

图片 5 1 while
True: 2 # 监视客户输入和服务器重临数据 3 # sys.stdin 管理客商输入 4 #
chan 是前边创制的大道,用于收纳服务器再次来到新闻 5 readable, writeable,
error = select.select([chan, sys.stdin, ],[],[],1) 6 if chan in
readable: 7 try: 8 x = chan.recv(1024) 9 if len(x) == 0: 10 print
‘\r\n*** EOF\python模块paramiko与ssh安装配置教程,堡垒机实例。r\n’, 11 break 12 sys.stdout.write(x) 13
sys.stdout.flush() 14 except socket.timeout: 15 pass 16 if sys.stdin in
readable: 17 inp = sys.stdin.readline() 18 chan.sendall(inp) 不可一世情势一
图片 6#
获取原tty属性 oldtty = termios.tcgetattr(sys.stdin) try: #
为tty设置新属性 # 私下认可当前tty设备品质: # 输入一行回车,实施 # CTLANDL+C
过程退出,遭受特殊字符,特殊处理。 # 那是为原来情势,不认得全部特殊符号
#
放置特殊字符应用在此时此刻终端,如此设置,将具备的顾客输入均发送到远程服务器
tty.setraw(sys.stdin.fileno()) chan.settimeout(0.0) while True: #python模块paramiko与ssh安装配置教程,堡垒机实例。 监视
用户输入 和 远程服务器重回数据(socket) # 阻塞,直到句柄可读 r, w, e =
select.select([chan, sys.stdin], [], [], 1) if chan in r: try: x =
chan.recv(1024) if len(x) == 0: print ‘\python模块paramiko与ssh安装配置教程,堡垒机实例。r\n*** EOF\r\n’, break
sys.stdout.write(x) sys.stdout.flush() except socket.timeout: pass if
sys.stdin in r: x = sys.stdin.read(1) if len(x) == 0: break chan.send(x)
finally: # 重新初始化终点属性 termios.tcsetattr(sys.stdin,
termios.TCSADRAIN, oldtty)
不可一世情势二
图片 7 1 def
windows_shell(chan): 2 import threading 3 4
sys.stdout.write(“Line-buffered terminal emulation. Press F6 or ^Z to
send EOF.\r\n\r\n”) 5 6 def writeall(sock): 7 while True: 8 data =
sock.recv(256) 9 if not data: 10 sys.stdout.write(‘\r\n*** EOF
***\r\n\r\n’) 11 sys.stdout.flush() 12 break 13
sys.stdout.write(data) 14 sys.stdout.flush() 15 16 writer =
threading.Thread(target=writeall, args=(chan,)) 17 writer.start() 18 19
try: 20 while True: 21 d = sys.stdin.read(1) 22 if not d: 23 break 24
chan.send(d) 25 except EOFError: 26 # user hit ^Z or F6 27 pass 不可一世方式三

注:密码验证 t.auth_password(username, pw)

详见:paramiko源码demo

   

沟壍机前戏
开采沟壍机从前,先来上学Python的paramiko模块,该模块机缘SSH用于连接远程服务器并推行相关…

windows版下能够设置windows版的GCC(MinGW),然后编辑安装pycrypto和paramiko
,下载安成后,直接运营python.exe setup.py build 和 python.exe setup.py
install 就足以了。

二、paramiko的连接
运用paramiko模块有三种连接情势,一种是透过paramiko.SSHClient()函数,另外一种是透过paramiko.Transport()函数。

方法一:

 代码如下

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(“某IP地址”,22,”用户名”, “口令”)

地点的第二行代码的功效是允许连接不在know_hosts文件中的主机。

方法二:

 代码如下

import paramiko
t = paramiko.Transport((“主机”,”端口”))
t.connect(username = “用户名”,
password = “口令”)

固然总是远程主机供给提供密钥,下面第二行代码可改成:

 代码如下

t.connect(username = “用户名”, password = “口令”, hostkey=”密钥”)

三、paramiko ssh连接
以下是二个简易的经过paramiko模块定义的ssh连接并实施命令的函数,如下:

 代码如下

#!/usr/bin/python
#-*- coding: utf-8 -*-
import paramiko
#paramiko.util.log_to_file(‘/tmp/sshout’)
def ssh2(ip,username,passwd,cmd):
    try:
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(ip,22,username,passwd,timeout=5)
        stdin,stdout,stderr = ssh.exec_command(cmd)
#           stdin.write(“Y”)   #简来说之交互,输入 ‘Y’
        print stdout.read()
#        for x in  stdout.readlines():
#          print x.strip(“\n”)
        print ‘%s\tOK\n’%(ip)
        ssh.close()
    except :
        print ‘%s\tError\n’%(ip)
ssh2(“192.168.0.102″,”root”,”361way”,”hostname;ifconfig”)
ssh2(“192.168.0.107″,”root”,”123456″,”ifconfig”)

在那之中第四行的日志部分,是记录ssh连接交互时的某个音信,能够充任是左近于debug的输出,日常情况下无需开启。

stdin.write部分是用来互动景况下,通过该命令可以施行交互。注意这里只怕会挑起歧义,这里的互相而不是ssh连接进程中冒出的让输入yes的互动,因为paramiko模块在连年进程中会自动管理好yes确认。这里的并行是指背后的cmd必要的举行的前后相继大概出现彼此的景况下,能够因而该参数进行相互。

stdout规范输出,在出口内容非常少时,能够透过直接使用read读抽出全体的出口;但在出口内容非常多时,建议通过按行读取进行管理。不过按行读取时,每行结尾会有换行符\n,这样输出的结果十分不美观。能够透过strip进行字符串的管理。

在函数调用进度中要求注意的是,IP、username、passwd都以属于字符串型的,所以须求加引号。前面实行的cmd,要是有几个指令必要操作时,需求经过分行进行剪切。

四、paramiko sftp示例
单个文件小传下载的身体力行:

 代码如下

import paramiko
#创设一个加密的管道
scp=paramiko.Transport((‘192.168.0.102’,22))
#确立连接
scp.connect(username=’root’,password=’361way’)
#成立几个sftp客户端对象,通过ssh transport操作远程文件
sftp=paramiko.SFTPClient.from_transport(scp)
#Copy a remote file (remotepath) from the SFTP server to the local
host
sftp.get(‘/root/testfile’,’/tmp/361way’)
#Copy a local file (localpath) to the SFTP server as remotepath
sftp.put(‘/root/crash-6.1.6.tar.gz’,’/tmp/crash-6.1.6.tar.gz’)
scp.close()

四个目录下四个文件上传下载的示范:

 代码如下

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import paramiko,datetime,os
hostname=’192.168.0.102′
username=’root’
password=’361way’
port=22
local_dir=’/tmp/getfile’
remote_dir=’/tmp/abc’
try:
    t=paramiko.Transport((hostname,port))
    t.connect(username=username,password=password)
    sftp=paramiko.SFTPClient.from_transport(t)
    #files=sftp.listdir(dir_path)
    files=sftp.listdir(remote_dir)
    for f in files:
        print ”
        print
‘#########################################’
        print ‘Beginning to download file  from %s  %s ‘ %
(hostname,datetime.datetime.now())
        print ‘Downloading file:’,os.path.join(remote_dir,f)
       
sftp.get(os.path.join(remote_dir,f),os.path.join(local_dir,f))#下载
       
#sftp.put(os.path.join(local_dir,f),os.path.join(remote_dir,f))#上传
        print ‘Download file success %s ‘ % datetime.datetime.now()
        print ”
        print
‘##########################################’
    t.close()
except Exception:
       print “connect error!” 

注:本处的目录下全体文件举办下载或上传的自己要作为表率遵从规则中,在蒙受目录下还会有嵌套的目录存在时,会将引得也视作文件进行拍卖,所以借使想要越来越圆满的话,能够经过引入stat模块下的S_ISDIHighlander方法开展处理

paramiko.transport对象也支撑以socket的点子开展连接,如下示例:

 代码如下

import paramiko
transport = paramiko.Transport((‘localhost’,22))
transport.connect(username=’root’, password = ‘password’)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.get(remotefile,localfile)
#假固然上传则用:
#sftp.put(localfile, remotefile)
transport.close()
#用socket连接
tcpsock =
socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcpsock.settimeout(5)
tcpsock.connect((ip,22),)
ssh = paramiko.Transport(tcpsock)
ssh.connect(username=user,password=password)
sftpConnect=paramiko.SFTPClient.from_transport(ssh)

五、利用paramiko实现ssh的交互式连接
以下是经过paramiko模块直接用ssh合同登入到长途服务器的操作代码,这里先定义叁个interactive模块,代码如下:

 代码如下

import socket
import sys
# windows does not have termios…
try:
    import termios
    import tty
    has_termios = True
except ImportError:
    has_termios = False
def interactive_shell(chan):
    if has_termios:
        posix_shell(chan)
    else:
        windows_shell(chan)
def posix_shell(chan):
    import select
    oldtty = termios.tcgetattr(sys.stdin)
    try:
        tty.setraw(sys.stdin.fileno())
        tty.setcbreak(sys.stdin.fileno())
        chan.settimeout(0.0)
        while True:
            r, w, e = select.select([chan, sys.stdin], [], [])
            if chan in r:
                try:
                    x = chan.recv(1024)
                    if len(x) == 0:
                        print ‘\r\n*** EOF\r\n’,
                        break
                    sys.stdout.write(x)
                    sys.stdout.flush()
                except socket.timeout:
                    pass
            if sys.stdin in r:
                x = sys.stdin.read(1)
                if len(x) == 0:
                    break
                chan.send(x)
    finally:
        termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
# thanks to Mike Looijmans for this code
def windows_shell(chan):
    import threading
    sys.stdout.write(“Line-buffered terminal emulation. Press F6 or ^Z
to send EOF.\r\n\r\n”)
    def writeall(sock):
        while True:
            data = sock.recv(256)
            if not data:
                sys.stdout.write(‘\r\n*** EOF
***\r\n\r\n’)
                sys.stdout.flush()
                break
            sys.stdout.write(data)
            sys.stdout.flush()
    writer = threading.Thread(target=writeall, args=(chan,))
    writer.start()
    try:
        while True:
            d = sys.stdin.read(1)
            if not d:
                break
            chan.send(d)
    except EOFError:
        # user hit ^Z or F6
        pass

代码内容能够从paramiko
在github项目上的demo里获取。再其他写一个ssh_inter.py的相互主程序,内容如下:

 代码如下

import paramiko
import interactive
#笔录日志
paramiko.util.log_to_file(‘/tmp/test’)
#建立ssh连接
ssh=paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(‘192.168.0.102′,port=22,username=’root’,password=’xxxxxx’,compress=True)
#创立交互式shell连接
channel=ssh.invoke_shell()
#树立交互式管道
interactive.interactive_shell(channel)
#闭馆连接
channel.close()
ssh.close()

举办坚守就好像我们平时一贯动用ssh登陆一样。

六、总结
paramiko模块是贰个相比较强硬的ssh连接模块,以上的以身作则只是列出了该模块的有的简练的利用方法,还足以接纳threading模块加块程序出现的快慢;也足以运用configparser模块管理配置文件,而小编辈将全体IP、顾客音信操作都归入配置文件;使用setproctitle模块为实践的主次加一个便于区分的title等。

长期以来,即使连fabric那样令人瞩指标软件应用的ssh都以用paramiko模块实行的包裹,但是你依然能够选拔不应用它,你也得以接纳pexpect模块完毕封装七个简短的ssh连接工具、大概接纳一样期相相当流行的salt-ssh模块。