Python中的paramiko模块

鳄鱼君

发表文章数:642

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » Python中的paramiko模块

Python自己实现了一个ssh客户端,你可以用这个客户端远程连接Linux机器,主要用来做批量管理的。这篇文章主要通过Windows来连接xshell,Xshell可以在Windows界面下用来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的。一般用来控制我们的服务器的,由于我的服务器安装了宝塔Linux面板,所以我们可以这样连接一些来试试。

paramiko的安装

这个安装过程也是比较曲折的,因为你在Windows上安装,不试个十几次是安装不上的,用pycharm的话,就不要在settings里面安装了,百分百装不上的,我们在pycharm的终端(Teaminal)使用pip安装,直接使用pip install –default-timeout=1000 paramiko,直接狠点,你不设置超时时间的话退出安装,重新安装还会超时。可能你会报错Could not find a version that satisfies the requirement bcrypt>=3.1.3 (from paramiko) (from versions: )No matching distribution found for bcrypt>=3.1.3 (from paramiko),那么你就需要更新一下你的pip,输入pip install --upgarde pip,之后再使用paramiko的安装命令,这里会直接装上bcrypt, pynacl, paramiko三个模块。

paramiko基本使用

通过用户名密码连接

SSH_client:

import paramiko
ssh=paramiko.SSHClient() #创建SSH对象
ssh.connect(hostname='ip地址',port=端口,username='用户名',password='密码')#连接

stdin,stdout,stderr=ssh.exec_command('ls') #执行命令
result=stdout.read() #或取命令结果
print(result)
ssh.close() #关闭连接

如果你使用上面的代码连接服务器,那么看似没有问题,试试就会报错paramiko.ssh_exception.SSHException: Server ... not found in known_hosts
,其中known_host是一个文件,就是我们在连接的时候会使用RSA签名的认证,这个文件你可以在.ssh/known_hosts下找到,文件里面记录这ip地址,加密算法,这个也是我们下面要说的通过另一种方法连接服务器,别的你就不用知道了,直接使用下面的代码

import paramiko
ssh=paramiko.SSHClient() #创建SSH对象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy) #允许连接不在know_hosts文件的主机
ssh.connect(hostname='144.202.107.59',port=22,username='root',password='d5H_kgtdhswF(K*,')#连接

stdin,stdout,stderr=ssh.exec_command('df') #执行命令,返回三个结果,自己可以都打印一下
res,error=stdout.read(),stderr().read()
result=res if res else error
print(result.decode())
ssh.close() #关闭连接

返回的result默认是字节类型,你可以decode一下,返回数据的快慢跟你的电脑配置和网速有关,我的反正慢的一批🤗,不要执行top命令,会卡主的,可以执行top -bn 1

同样我们也可以把文件上传到服务器或者从服务器下载文件:

import paramiko

transport=paramiko.Transport(('ip地址',22)) #生成实例
transport.connect(username='用户名',password='密码') #建立连接
sftp=paramiko.SFTPClient.from_transport(transport) #把连接当做参数插进去,
#sftp.put('local_file','linux_new')#将本地文件上传☞服务器

sftp.get('Linux_file','local_new')#将服务器上的文件下载到本地

transport.close()

通过公密钥连接

第一种方法是用用户名和密码连接,有点不安全,我们可以使用密钥连接远程机器,密钥本身使用RSA(非对称密钥验证),一个公钥,一个私钥。我们假设有两台机器1和2,我在1上准备连接2机器,我不想输入密码连接,那么我们就需要配置一个公钥和私钥,公钥放到你需要连接的机器2上,1机器自己留下私钥。公钥和私钥是成对出现的,我们需要先生成一堆公私钥:ssh-keygen敲两次回车即可,生成的公私钥默认保存在.ssh/id_rsa下,我们可以把公钥给你想连接的人。

Python中的paramiko模块

这又是一个大坑等着你跳,搞了很久很久,这里就详细说一下吧,不然你也会跟我一样,浪费很多时间。假设我在xshell上有两台服务器0.0.0.1(ip地址简称1)0.0.0.2(ip地址简称2),这里我只是举个列,就是你需要两台不同服务器,我们来尝试通过公密钥的方式连接,假设我准备在1服务器上连接2服务器,那么首先在两个窗口连接两个服务器,我们首先在1机器上生成一对公私钥:ssh-keygen,上面说过了,又啰嗦了一遍🧝‍♀️

1机器连接2机器,我们需要把在1机器上生成的公钥(一行)复制一下放到2机器上,我们就放到root用户中的.ssh/authorized_keys里面,并把权限设置为600,默认在2机器上没有.ssh目录的,你先创建.ssh目录,然后再编辑authorized_keys公钥,名字固定不要乱起名字,一般这样就ok了,我在网上搜过这个问题Permission denied (publickey,gssapi-keyex,gssapi-with-mic).我刚开始连接的时候也报这个错误,有的说需要修改sshd_config文件,把把”#PasswordAuthentication yes” 改成”PasswordAuthentication no” ,我这里没有修改也可以连接成功,这里就自己尝试了,我不在放图片解释了。

SSH_SFTPClient.py

上面说的是两台服务器之间的连接,我们再来说说使用Python连接,我们还接着上面的说,我们已经把公钥放在的机器2中,那么我在Python就可以使用私钥来连接机器2,这里的私钥,你可以从机器1中复制下来保存为id_rsa,或者在机器2上,使用sz命令下载到桌面,然后放到你程序的目录下面即可

import paramiko
ssh=paramiko.SSHClient() #创建ssh对象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#不在known_hosts文件链接
private_key=paramiko.RSAKey.from_private_key_file('id_rsa')
#连接服务器
ssh.connect(hostname='机器2的ip地址',port=22,username='root',pkey=private_key)
stdin,stdout,stderr=ssh.exec_command('ifconfig;df')#加分号执行多个命令也可以
cmd,err=stdout.read(),stderr.read()
result=cmd if cmd else err
print(result.decode())
ssh.close()

应该都成功了吧,那么我们已经可以连接机器2,当然也可以下载(上传)机器2上的文件:

import paramiko
private_key=paramiko.RSAKey.from_private_key_file('id_rsa')
transport=paramiko.Transport(('45.76.242.37',22))
#连接服务器
transport.connect(username='root',pkey=private_key)
sftp=paramiko.SFTPClient.from_transport(transport)
#将本地文件上传☞服务器
#sftp.put('本地文件名','上传服务器目录')
#将服务器上的文件下载到本地
sftp.get('/root/文件名','new.py')
transport.close()

好了,基本上就这些了😘

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Python中的paramiko模块》 发布于2020-01-05

分享到:
赞(1) 赏杯咖啡

评论 抢沙发

1 + 6 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册