你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

如何远程执行Linux脚本和命令?

[复制链接]
gaosmile 发布时间:2020-4-14 10:55
如果现在需要在 Linux 服务器上执行一系列命令(比如搭建 LNMP 环境)我应该会第一时间想到想办法写个 Shell 脚本,然后扔上去执行以下看看结果。
然而一贯懒惰的我并不想这么去执行 Shell 和一些重复命令。所以俺寻思可以有个方法本地直接在服务器端执行脚本,寻思生异端,这时候有某大技霸告诉我有个叫 paramiko 的 Python 库,从此开启我新世界的大门。
微信图片_20200414105426.png
对于 paramiko 安装直接 pip 或者 PyCharm 这里就不多说了,如果看到这里你觉得自己不怎么了解python语法的也不必担心,你完全可以用 paramiko 单纯的执行 Shell 命令查看结果和上传下载文件,省去重复的工作。
paramiko 实现了 SSHv2 协议(底层使用 cryptography ),包含两个核心组件:SSHClient 和 SFTPClient 。SSHClient 是对 SSH 会话的封装,用于执行远程命令,SFTPClient 是对 SFTP 客户端的封装,用以实现远程文件操作。
这里先举两个列子你应该就明白怎么用了,终于开始正片了。
微信图片_20200414105430.png
SSHClient 的列子:
  1. # -*- coding: utf-8 -*-
  2. import paramiko
  3. client = paramiko.SSHClient()# 实例化SSHClient
  4. client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接

  5. client.connect(hostname='192.168.23.134', port=22, username='ftoz', password='123456')# 连接SSH服务端,以用户名和密码进行认证

  6. # 打开一个Channel并执行命令
  7. stdin, stdout, stderr = client.exec_command('ls')  # stdout 为正确输出,stderr为错误输出,同时是有1个变量有值

  8. # 打印执行结果
  9. print(stdout.read().decode('utf-8'))

  10. # 关闭SSHClient
  11. client.close()
复制代码

输出:
微信图片_20200414105433.png
image
这里说明一下:
  1. client = paramiko.SSHClient(),
  2. client.set_missing_host_key_policy(paramiko.AutoAddPolicy())你可以理解为固定姿势。
  3. client.connect(hostname='192.168.1.105', port=22, username='ftoz',password='123456')这里就是你的linux变量依次为地址、端口(总共65535个端口,不过ssh默认是22端口)、登录名、密码。
  4. stdin, stdout, stderr = client.exec_command('df -h ') 这里就是核心你需要做的shell命令,这三个变量不用按照这种姿势,你可以随意,不过按照顺序你知道里面装的什么数据就行(重点在输出和错误)。

  5. connect():这个是实现远程服务器连接和认证的,参数有:
  6. hostname 连接的目标主机
  7. port=SSH_PORT 指定端口
  8. username=None 验证的用户名
  9. password=None 验证的用户密码
  10. pkey=None 私钥方式用于身份验证
  11. key_filename=None 一个文件名或文件列表,指定私钥文件
  12. timeout=None 可选的tcp连接超时时间
  13. allow_agent=True, 是否允许连接到ssh代理,默认为True 允许
  14. look_for_keys=True 是否在~/.ssh中搜索私钥文件,默认为True 允许
  15. compress=False, 是否打开压缩。

  16. set_missing_host_key_policy():这个是设置远程服务器没有在know_hosts文件中记录时的应对策略。(可以理解为避免报错),参数有:
  17. AutoAddPolicy 自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认
  18. WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接
  19. RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项
  20. exec_command():这是写你需要执行的命令的
复制代码

接下来你就可以拿出输出做一些该干嘛(ke)干嘛(pa)的事情了,这里先举这个简单的列子。
SFTPClient 常用方法:
  1. <font style="background-color:rgb(255, 255, 255)"><font color="black" face="Tahoma">t = paramiko.Transport(('192.168.23.134', 22))# 获取Transport实例
  2. t.connect(username='ftoz', password='123456')# 连接SSH服务端,使用password
  3. sftp = paramiko.SFTPClient.from_transport(t)
  4. sftp.put("F:\S12312.txt","/home/ftoz/zxc12312.txt")#执行上传动作
  5. sftp.get("/home/ftoz/zxc12312.txt", "F:\S12312.txt")#执行下载动作
  6. t.close()</font></font>
复制代码
SFTPCLient 作为一个 sftp 的客户端对象,根据 ssh 传输协议的 sftp 会话,实现远程文件操作,如上传、下载、权限、状态
  1. from_transport(cls,t) 创建一个已连通的SFTP客户端通道
  2. put(localpath, remotepath, callback=None, confirm=True) 将本地文件上传到服务器 参数confirm:是否调用stat()方法检查文件状态,返回ls -l的结果
  3. get(remotepath, localpath, callback=None) 从服务器下载文件到本地
  4. mkdir() 在服务器上创建目录
  5. remove() 在服务器上删除目录
  6. rename() 在服务器上重命名目录
  7. stat() 查看服务器文件状态
  8. listdir() 列出服务器目录下的文件
复制代码


最后养成随关闭的好习惯 client.close()。

收藏 评论0 发布时间:2020-4-14 10:55

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版