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

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

基于用户名密码连接:

服务器公钥怎么使用 服务器私钥在哪_linux

服务器公钥怎么使用 服务器私钥在哪_服务器_02

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

用户名加密码方式

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

基于公钥密钥连接:

公私秘钥都是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中。

服务器公钥怎么使用 服务器私钥在哪_linux

服务器公钥怎么使用 服务器私钥在哪_服务器_02

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

基于公私秘钥连接

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

服务器公钥怎么使用 服务器私钥在哪_linux

服务器公钥怎么使用 服务器私钥在哪_服务器_02

import paramiko
from io import StringIO

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

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

基于用户名密码上传下载

服务器公钥怎么使用 服务器私钥在哪_linux

服务器公钥怎么使用 服务器私钥在哪_服务器_02

import paramiko

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

用户密码的上传下载

基于公钥密钥上传下载

服务器公钥怎么使用 服务器私钥在哪_linux

服务器公钥怎么使用 服务器私钥在哪_服务器_02

import paramiko
 
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