python利用脚本轻松实现ssh免密登陆配置

 更新时间:2023年12月12日 17:01:20   作者:碧蓝幻想  
这篇文章主要为大家详细介绍了python如何利用脚本轻松实现ssh免密登陆配置,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

1.安装python和pip包

yum install -y epel-release
yum install -y python python-pip

2.pip安装依赖库

pip install pexpect     # 此库用相当于linux中的expect命令

3.完整脚本

# coding=UTF-8
import sys,os,pexpect,subprocess
 
host_controller="192.168.174.150"                            # 控制节点IP地址
host_addresses=["192.168.174.151","192.168.174.152"]           # 客户端们的IP地址
host_domains=["client1","client2"]                          # 客户端们的域名
host_username="root"                                         # ssh连接的用户,控制端的用户为root
host_passwd="110119"                                         # ssh连接的用户密码
 
 
# 本地创建ssh公钥
if os.path.exists("/root/.ssh/id_rsa.pub") == True:
	print("\033[32m"+"ssh公钥已创建"+"\033[0m")                # 输出绿色字体
else:
	print("\033[32m"+"ssh公钥未创建,开始创建"+"\033[0m")
	child = pexpect.spawn('ssh-keygen -t rsa -b 1024')
	child.expect('Enter file in which to save the key')
	child.sendline('')
	child.expect('Enter passphrase')
	child.sendline('')
	child.expect('Enter same passphrase again')
	child.sendline('')
 
	child.expect(pexpect.EOF)               # 用于等待子进程的结束
	print(child.before.decode())            # 等待命令执行完毕并打印输出信息
	print("\033[32m" + "ssh公钥已创建" + "\033[0m")
	print("\n")
 
 
# 向被控主机添加公钥的方法
def add_ssh_public_key_client(address,username,password):
	print("\033[32m"+"{}正在被添加公钥".format(address)+"\033[0m")
	# BatchMode=yes:表示使SSH在连接过程中不会提示输入密码,而直接尝试免密连接,-o ConnectTimeout=5:表示限制连接超时时间为5秒
	public_key_flag=os.system("ssh {}@{} -o BatchMode=yes -o ConnectTimeout=5 'exit'".format(username,address))
	if public_key_flag== 0:
		print("\033[32m" + "{}已经可以ssh连接".format(address) + "\033[0m")
		return
	child = pexpect.spawn('ssh-copy-id -i /root/.ssh/id_rsa.pub {}@{}'.format(username,address))
	try:
		child.expect('Are you sure you want to continue connecting')
	except pexpect.TIMEOUT:       # 如果try块中的咨询超时5秒没有出现就会出现异常pexpect.TIMEOUT
		print("\033[32m"+"{}已经不是首次ssh连接了".format(address)+"\033[0m")
	else:                         # 是否回答咨询yes
		child.sendline('yes')
	finally:
		child.expect('password')
		child.sendline(password)
	child.expect(pexpect.EOF)               # 用于等待子进程的结束
	print(child.before.decode())            # 等待命令执行完毕并打印输出信息
# 测试ssh连接的方法
def test_ssh_connection(all_flag,address,username):
	print("\033[32m" + "{}测试是否可以ssh连接".format(address) + "\033[0m")
	flag=os.system('ssh {}@{} -o ConnectTimeout=5 "exit"'.format(username,address))
	if flag==0:
		print("\033[32m" + "Success: {}可以ssh免密连接".format(address) + "\033[0m")
	else:
		print("\033[1;31m" + "Failed: {}ssh免密连接失败".format(address) + "\033[0m")     # 输出红色字体
		all_flag=1
	return all_flag
 
# 本地的密钥开始加入被控制主机
for i in range(0, len(host_addresses)):
	add_ssh_public_key_client(host_addresses[i],host_username,host_passwd)
	print("\n")
# 测试ssh连接
for i in range(0, len(host_addresses)):
	final_flag=test_ssh_connection(0,host_addresses[i],host_username)
if final_flag ==1:
	sys.exit("ssh测试失败,请检查!")
else:
	print("\033[32m" + "Success: 全部可以ssh免密连接" + "\033[0m")
print("\n")

4.执行结果

[root@server ~]# python ansible_auto.py
ssh公钥未创建,开始创建

Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:RvdYf1KOFDyKBuEB6DbFQdfNP9aBPs1/0vIFnutEj5E root@server
The key's randomart image is:
+---[RSA 1024]----+
|     ++o+o o .o  |
|    . oo... o.oo |
|   . .  o...oo+oo|
|    +  . .o+.==B.|
|   . .  S.. .oE=+|
|       .     .=*=|
|              o=+|
|             .. .|
|             ..  |
+----[SHA256]-----+
 
ssh公钥已创建
 
 
192.168.174.151正在被添加公钥

 
Number of key(s) added: 1
 
Now try logging into the machine, with:   "ssh 'root@192.168.174.151'"
and check to make sure that only the key(s) you wanted were added.
 
 
 
 
192.168.174.152正在被添加公钥

 
Number of key(s) added: 1
 
Now try logging into the machine, with:   "ssh 'root@192.168.174.152'"
and check to make sure that only the key(s) you wanted were added.
 
 
 
 
Success: 192.168.174.151可以ssh免密连接
Success: 全部可以ssh免密连接
 
 
Success: 192.168.174.152可以ssh免密连接
Success: 全部可以ssh免密连接

到此这篇关于python利用脚本轻松实现ssh免密登陆配置的文章就介绍到这了,更多相关python ssh免密登陆配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Unicode和Python的中文处理

    Unicode和Python的中文处理

    在Python语言中,Uincode字符串处理一直是一个容易让人迷惑的问题。许多Python爱好者经常因为搞不清Unicode、UTF-8还有其它许许多多的编码之间的区别而大伤脑筋。本文将介绍Unicode和Python的中文处理的相关知识。下面跟着小编一起来看下吧
    2017-03-03
  • Python实现向列表或数组添加元素

    Python实现向列表或数组添加元素

    Python中的列表是一种动态数组,可以存储不同数据类型的元素,并提供多种方法进行元素的添加和删除,列表是Python中非常灵活和强大的数据结构,可以通过索引访问、修改和操作列表中的元素,列表的创建十分简单,只需使用方括号括起元素,并用逗号分隔
    2024-09-09
  • 通过python爬虫赚钱的方法

    通过python爬虫赚钱的方法

    在本篇文章里小编给大家分享了关于通过python爬虫赚钱的方法,有兴趣的朋友们学习下。
    2019-01-01
  • 用Python写一个自动木马程序

    用Python写一个自动木马程序

    这篇文章主要介绍了用Python写一个自动木马程序的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • 浅谈Python实现贪心算法与活动安排问题

    浅谈Python实现贪心算法与活动安排问题

    本篇文章主要介绍了浅谈Python实现贪心算法与活动安排问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Python PIL图片如何按比例裁剪

    Python PIL图片如何按比例裁剪

    这篇文章主要介绍了Python PIL图片如何按比例裁剪,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • python爬取网站数据保存使用的方法

    python爬取网站数据保存使用的方法

    这篇文章主要介绍了使用Python从网上爬取特定属性数据保存的方法,其中解决了编码问题和如何使用正则匹配数据的方法,详情看下文
    2013-11-11
  • 移除Selenium中window.navigator.webdriver值

    移除Selenium中window.navigator.webdriver值

    这篇文章主要为大家介绍了如何正确的移除Selenium中window.navigator.webdriver的值方法步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 跟老齐学Python之模块的加载

    跟老齐学Python之模块的加载

    这篇文章主要介绍了跟老齐学Python之模块的加载,需要的朋友可以参考下
    2014-10-10
  • Python自动扫雷实现方法

    Python自动扫雷实现方法

    这篇文章主要介绍了Python自动扫雷实现方法,提供了Python实现自动扫雷的代码思路并备有注释说明,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07

最新评论