python2.0 s12 day8 _ 堡垒机前戏paramiko模块

Posted zhming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python2.0 s12 day8 _ 堡垒机前戏paramiko模块相关的知识,希望对你有一定的参考价值。

堡垒机前戏
开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作
paramiko模块是做主机管理的,他模拟了一个ssh.
有两种形式连接形式,
一种通过用户名密码: ssh -p 22 [email protected]
一种是通过密钥的方式: ssh -p 22 -i ~/.ssh/dongjing-shanghai.pem [email protected]_pro01
再连接的的语法上,有两种:
一种是直接将连接的主机地址和端口直接传入
一种是先把主机地址,端口,用户名,密码封装到paramiko.Transport()实例中

SSHClient
通过用户名密码连接的实例代码如下:
直接调用ssh.connect() 方法
 1                     #!/usr/bin/env python3.5
 2                     #__author__:‘ted.zhou‘
 3                     ‘‘‘
 4                     使用paramiko模块,实现SSHClient连接远程服务器
 5                     先使用用户名,密码方式
 6                     ‘‘‘
 7                     import paramiko
 8 
 9                     ssh = paramiko.SSHClient()      # 创建SSH对象
10 
11                     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 这句很关键, 允许连接不在know_hosts文件中的主机
12                     ssh.connect(hostname=127.0.0.1,port=7272,username=root,password=123) # 连接服务器
13                     stdin,stdout,stderr = ssh.exec_command(df)  # 执行命令
14                     result = stdout.read()  # 获取命令结果
15                     ssh.close()  # 关闭连接
16 
17                     print(result.decode()) # 打印结果

通过paramiko.Transport()封装:
 1                     #!/usr/bin/env python3.5
 2                     #__author__:‘ted.zhou‘
 3                     ‘‘‘
 4                     paramiko模块SSHClient通过用户名密码连接远程服务器,
 5                     使用语法Transport()封装
 6                     ‘‘‘
 7 
 8                     import paramiko
 9 
10                     transport = paramiko.Transport((127.0.0.1,7272))  # 传入主机的IP或者hostname 和 端口组合的元组,记住一定是元组
11                     transport.connect(username=root,password=123)
12 
13                     ssh  = paramiko.SSHClient()
14                     ssh._transport = transport
15 
16                     stdin,stdout,stderr = ssh.exec_command(df)
17                     result = stdout.read()
18 
19                     print(result.decode())
20                     transport.close()

 



通过sshkey方式连接的实例:
        python2.x写法和python3.x不同
        python2.x 代码如下:
                直接调用ssh.connect() 方法
                    #!/usr/bin/env python3.5
                    #__author__:‘ted.zhou‘
                    ‘‘‘
                    使用paramiko.SSHClient()的sshkey方式连接远程服务器

                    ‘‘‘
                    import paramiko

                    # 加载密钥文件
                    private_key = paramiko.RSAKey.from_private_key_file(/Users/tedzhou/.ssh/id_rsa)
                    # print(type(private_key))
                    ssh = paramiko.SSHClient()      # 创建SSH对象
                    #
                    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # 允许连接不在know_hosts文件中的主机

                    # 开始连接服务器,这里注意再python2.x中是这么写,3.x中报错,应该写成 key_file = ‘/Users/tedzhou/.ssh/id_rsa‘
                    ssh.connect(hostname=127.0.0.1,port=7272,username=root,key=private_key)

                    # 获取远程主机执行命令的结果
                    stdin,stdout,stderr = ssh.exec_command(ifconfig)
                    result = stdout.read()
                    print(result.decode())
                    ssh.close()
                python3.x的写法如下:
 1                     #!/usr/bin/env python3.5
 2                     #__author__:‘ted.zhou‘
 3                     ‘‘‘
 4                     使用paramiko.SSHClient()的sshkey方式连接远程服务器
 5 
 6                     ‘‘‘
 7                     import paramiko
 8 
 9                     # python3.x中就不需要再加载私钥文件了.
10                     # private_key = paramiko.RSAKey.from_private_key_file(‘/Users/tedzhou/.ssh/id_rsa‘)
11                     ssh = paramiko.SSHClient()      # 创建SSH对象
12                     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # 允许连接不在know_hosts文件中的主机
13                     # 开始连接服务器
14                     ssh.connect(hostname=kiri_pro01, port=22, username=root, key_filename=/Users/tedzhou/.ssh/dongjing-shanghai.pem)
15                     # 获取远程主机执行命令的结果
16                     stdin,stdout,stderr = ssh.exec_command(ifconfig)
17                     result = stdout.read()
18                     print(result.decode())
19                     ssh.close()
                通过paramiko.Transport()封装:
注释:使用Transport方式连接远程服务器,python2.x和python3.x就一样了,具体代码如下:
 1 #!/usr/bin/env python3.5
 2 
 3                     import paramiko
 4                     private_key = paramiko.RSAKey.from_private_key_file(/Users/tedzhou/.ssh/dongjing-shanghai.pem)
 5                     # ‘/Users/tedzhou/.ssh/dongjing-shanghai.pem‘
 6                     #封装transport
 7                     transport = paramiko.Transport((127.0.0.1,22))  #这里一定是元组
 8                     transport.connect(username=root,pkey=private_key)
 9 
10                     # 创建SSH连接
11                     ssh = paramiko.SSHClient()
12                     ssh._transport = transport
13 
14                     # 获取执行命令的结果
15                     stdin,stdout,stderr = ssh.exec_command(df)
16 
17                     result = stdout.read()
18 
19                     print(result.decode())
20 
21                     transport.close()

通过上面例子中,发现使用paramiko.Transport()方法封装后,再调用SSHClinet()方法更好些,因为python2.x和python3.x语法一样
而且下面使用paramiko.SFTPClient()进行文件的上传和下载,使用的语法也是paramiko.Transport()方法
SFTPClient
用于连接远程服务器并执行上传下载
基于用户名密码上传下载
 1                 import paramiko
 2 
 3                 transport = paramiko.Transport((hostname,22))
 4                 transport.connect(username=wupeiqi,password=123)
 5 
 6                 sftp = paramiko.SFTPClient.from_transport(transport)
 7                 # 将location.py 上传至服务器 /tmp/test.py
 8                 sftp.put(/tmp/location.py, /tmp/test.py)
 9                 # 将remove_path 下载到本地 local_path
10                 sftp.get(remove_path, local_path)
11 
12                 transport.close()

基于公钥密钥上传下载
 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                 sftp = paramiko.SFTPClient.from_transport(transport)
 9                 # 将location.py 上传至服务器 /tmp/test.py
10                 sftp.put(/tmp/location.py, /tmp/test.py)
11                 # 将remove_path 下载到本地 local_path
12                 sftp.get(remove_path, local_path)
13 
14                 transport.close()

 



以上是关于python2.0 s12 day8 _ 堡垒机前戏paramiko模块的主要内容,如果未能解决你的问题,请参考以下文章

python-----堡垒机前戏paramiko模块

python2.0_s12_day9之day8遗留知识(queue队列&生产者消费者模型)

Python之路:堡垒机实例以及数据库操作

Python之路第八篇:堡垒机实例以及数据库操作

Python之路第八篇:堡垒机实例以及数据库操作

Python之路第八篇:堡垒机实例以及数据库操作