python连接linux堡垒机_python开发【二十一篇】第三方库— linux服务器连接方式(公私钥)、堡垒机实例以及数据库操作...

linux服务器连接方式:

1.通过用户名和密码 ;

2.通过公钥和私钥。

公钥和私钥是linux特有的特点,在每个用户名下均可以生成一组特有的公私钥。那么如何获得公私钥呢?

1、使用命令:ssh-keygen ,一路直接回车就行

2、生成后会在用户的家目录下生成一个.ssh(隐藏文件)。文件中有id_rsa(私钥) 和id_rsa.pub(公钥)两个文件。

3、为了实现A访问B,那么就将A服务器的id_rsa.pub(公钥)拷贝到B服务器(拷贝地址是:B服务器当前用户的.ssh目录下的authorized_keys)(拷贝前记得将id_rsa.pub的内容转成一行。内容必须是一行)

4、在A服务器上,执行命令:ssh -p22 root@192.168.3.186 回车 并yes就登录成功了

(-p:后面是端口号,具体端口号可以通过:netstat -anp | grep tcp 来查询          root:B服务器接收A服务器公钥时的用户名。    192.168.3.186:B服务器的地址)

注意:1.公钥拷贝到authorized_keys前,必须保证其中的内容只有一行

2.id_rsa.pub只是一个公钥生成文件。想要通信,必须将公钥保存在authorized_keys中。(见:SSHClient—基于公钥密钥连接:)

堡垒机前戏

开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作

SSHClient

用于连接远程服务器并执行基本命令

基于用户名密码连接:

importparamiko#创建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()

用户名加密码方式

在连接过程中,使用的是明文密码,容易造成不安全隐患,能不能拥有一种更为安全的模式去连接呢,答案当然是有,那就是使用公私秘钥。如下:

基于公钥密钥连接:

公私秘钥都是linux的东西,那要是为了实现windows和linux的通信怎么办?办法很简单,

首先我们在前面讲过两台服务器(A,B)要进行无密码连接,只需要将A的公钥拷贝到B服务器上,然后A就可以访问B服务器,若B服务器想访问A服务器,只需要将B的公钥拷贝到A服务器上。这就说明,被访问的目标服务器拥有公钥,不管是谁只要拥有对应的私钥就能访问目标服务器。

所以想使用windows访问linux就很简单了,方法两种:

一,使用A服务器生成公私钥,把A的公钥拷贝到B服务器,然后将A的私钥拷贝到windows下保存。这样就能访问B服务器了

二、将B服务器的私钥拷贝到windows上保存,然后直接将B服务器的公钥保存到它的authorized_keys中。

importparamiko

private_key= paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') #保存私钥的地址 #注意这个私钥要与下面的目标服务器所持有的公钥(authorized_keys)相对应才行。

#创建SSH对象

ssh =paramiko.SSHClient()#允许连接不在know_hosts文件中的主机

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#连接服务器

ssh.connect(hostname='192.168.3.185', port=22, username='wupeiqi', pkey=private_key)#执行命令

stdin, stdout, stderr = ssh.exec_command('df')#获取命令结果

result =stdout.read()print(result.decode())#关闭连接

ssh.close()

基于公私秘钥连接

也可以将私钥保存为一个字符串,进行连接

importparamikofrom io importStringIO

key_str= """-----BEGIN RSA PRIVATE KEY-----

MIIEoQIBAAKCAQEAy7aWUTAO8KXRETrzFgOjvRpvIUa3lhCo71p2jgTnMUe7XtkO

tqVoFo8qDAmRi5FrfTviJZzXXsHsBksr0FAqt6bSOzrZKEuEUjt2DfboLqh8BWl2

9UWDE+rseLIGLLCm9XuOmt4nPYQScEa7EuVvlUygSfAIhkW86XWguHotBQSapc9J

R2l+C2zbW+V72etlibH03/6RtrygxGolsa4tM7nUkua+ZTMT5HVEDOSEiN7XAY6+

ggEy0M4ziP4dFb1DCdA3PvFVWr5EJzqSNgz4mOwdqiI+QZoE/M1C5L6YzZQ7w7ZP

jTjDwQ4d1FUddVNpMC5uvA1cLU9uhinQ+vlkfwIBIwKCAQBullGZyaG11luNAr55

qjRQtpQZYOdRdsIbiOFFyCW7qpjqWJL1b7wpgOrwl3rlXZIfaaamtDpmo8lFPsAD

XrgajcKVLpMkgMQso++hLkOHCwF/R+F91UcoEdDTzlsfkxjOZ6Uvf+lqiYZaNQZ3

+OTNZBx/6LQrojNaKemIt1pEjIBAoAzH4V3C9Tgwqk7AK52oqmyWUHiYXZUI2le+

//Wp5Fm/gmEWrVFTuNAhfpL1rF6JKa2us5WhynEZyHtCYtxrOWzxgTmSz2TuS9QM

Q0KCWQBkklBQpGehI2/RANOPlqernmbb6d/r6pTicTEEMIRYPyq6CN+lVilSKZeh

U8CbAoGBAPB7U6gsLbCrvSwBttmAYwrOdKQjVy7Mo+pEBLnu/RGqgqvzAKoTff84

zYWS98B+U1nzFJjnQSmyYEZERNEaTtov1lRwaVwYVDiFMPMUM5cNPF7Z3YgHLqi0

O80WJdXjcnlip2VcLUBcQgYAyFDGNlW4KwK1KSZ78TGKezLn+VJXAoGBANjb24mQ

FerCqJivsYqLvr8LRr6aSQuAlL7pWfKLRWR4rXXTVDkM/IxUzI/rYes4g9xipqJL

dTjZckVYmNS3CSOoqwyl3UvVqKKMwU5pk2BKuvP8DsP2tcXO5GR2AwdNao2DO/bR

1fRhX1ZoUH/dSnCEnIkb/EjfHdXrEShwjjYZAoGBAOmcX+UyOwNlAOjruPCLWOXt

INn2cfLyrdxCEzhHPvs37KcJURo+0ishPK2ktii1OwbsIqMpykXDOPPNSio20EGq

0DTE+KKbSoAMW2/Ke0JHXzeRz+M6LVNtQWgkJMEmF26aWXhoK/Vg764PY4Gqmy6y

5/QAcR4SAD7BCfbv+YMvAoGAdbkuCNkweCCHaNRnsZxRmujdQuYKZVRuATzZDqNg

LzoyR0bV8xWtq0P6BPwfNoxk1rk14xMFHtxxO5Z+2d+0gRJre+UDGont1JWNglaR

1S/h1OfqwibXtIZBeF1SGegyh1XeuTAVD6KS1yKvW1rfRGU/CJop3mp96SfWHURq

dSMCgYBes1aVqaZTC5B5k2kfu35QwnkOofWTo7+Zs2vNdV++2z+Ed15zJoLQAKPM

rQemVSYp0P8hBOg5JOSpRjCRsLa6TjYH2mP7Zo5rPBoVrUAcfFpY28YH1mBiAy2R

87RqU5Tjhh3LRzbuBUZVN+Qxq+8NY9l9qzVS7Cn4KsbJZLvsNQ==

-----END RSA PRIVATE KEY-----"""private_key= paramiko.RSAKey(file_obj=StringIO(key_str))

transport= paramiko.Transport(('192.168.3.186', 22))

transport.connect(username='root', pkey=private_key)

ssh=paramiko.SSHClient()

ssh._transport=transport

stdin, stdout, stderr= ssh.exec_command('df')

result=stdout.read()

transport.close()print(result)

基于字符串格式的私钥连接

SFTPClient

用于连接远程服务器并执行上传下载

基于用户名密码上传下载

importparamiko

transport= paramiko.Transport(('192.168.3.185', 22))

transport.connect(username='root', password='51testing')

sftp=paramiko.SFTPClient.from_transport(transport)#将id_isa.txt 上传至服务器 /tmp/id_rsa.txt

sftp.put('id_rsa.txt', '/tmp/id_rsa.txt')#将/root/.ssh/id_rsa.pub 下载到本地 id_rsa.pub.txt

sftp.get('/root/.ssh/id_rsa.pub', 'id_rsa.pub.txt')

transport.close()

用户密码的上传下载

基于公钥密钥上传下载

importparamiko

private_key= paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') #同sshclient一样。这是私钥文件

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()

View Code

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值