我们现在有服务器A和服务器B,现在有一个需求,在服务器A上远程登录服务器B。

首先我们要在服务器A和服务器B上分别执行

ssh-keygen -t  rsa

在~/.ssh文件夹下得到以下文件

 authorized_keys  # 存放其他服务器公钥的文件
 id_rsa   # 本服务器的私钥
 id_rsa.pub # 本服务器公钥
 known_hosts # 

我们要把服务器A上的公钥放到authorized_keys文件里,并把这两台机器上的该文件权限设为755,否则会出现没权限的报错。其原因是,不能让所有者之外的用户对authorized_keys文件有写权限,否则,sshd将不允许使用该文件,因为它可能会被其他用户篡改。

这样paramiko就可以执行了

import json

import paramiko
import os

host = '47.105.194.15'

port = 22
username = "root"

pkey = "/Users/gongsi/.ssh/id_rsa"  # 本服务器的私钥文件路径[此文件服务器上~/.ssh/id_rsa可下载到本地]

key = paramiko.RSAKey.from_private_key_file(pkey)

# 创建并连接远程主机
ssh = paramiko.SSHClient()

# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())  
# ssh.load_system_host_keys() #如通过known_hosts 方式进行认证可以用这个,如果known_hosts 文件未定义还需要定义 known_hosts

ssh.connect(host, port, username=username, pkey=key)
paramiko.util.log_to_file('syslogin.log')  # 将登录信息记录日志
#
# # 远程执行shell脚本,获取输入输出流
stdin, stdout, stderr = ssh.exec_command('cd ~;ls')
#
print(json.dumps(stdout.readlines()))
ssh.close()

这时候你用ssh登录发现还是需要输出密码,问题在于需要把服务器A上的私钥权限变成600。

然后你就可以这样登录了

ssh root@47.105.194.15

 

posted on 2020-08-05 16:01  程序员一学徒  阅读(865)  评论(0)    收藏  举报