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

堡垒机前戏
开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作
paramiko模块是做主机管理的,他模拟了一个ssh.
有两种形式连接形式,
一种通过用户名密码: ssh -p 22 root@hostname
一种是通过密钥的方式: ssh -p 22 -i ~/.ssh/dongjing-shanghai.pem root@kiri_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))  # 实例化一个Transport()实例,传入主机的IP或者hostname 和 端口组合的元组,记住一定是元组。
11                     transport.connect(username='root',password='123')   # 调用connect方法,设置transport的连接方式用户名和密码,
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()

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值