总结
豆包 AI 助手文章总结
首页 > 运维 > linux运维 > 正文

怎么通过Python实现linux远程登陆及sftp

王林
发布: 2023-05-11 17:55:19
转载
1997人浏览过
1. 使用shell命令
$ sshpass -p ${passwd} ssh -p ${port} -l ${user} -o StrictHostKeyChecking=no xx.xx.xx.xx "ls -l"
登录后复制

然后你会发现,你的输出有很多你并不需要,但是又不去不掉的一些信息。
对于shell 命令,可以直接使用管道,或者将标准输出重定向到文件的方法取得执行结果。

2. 使用 subprocess

通过Python可以想到使用 os.popen,os.system,commands,subprocess 等一些命令执行库来间接获取系统信息 。这些库获取的 output 不仅有标准输出,还包含标准错误信息。所以每次都要对 output 进行数据清理,然后整理格式化,才能得到我们想要的数据。

import subprocess 
ssh_cmd = "sshpass -p ${passwd} ssh -p 22 -l root -o StrictHostKeyChecking=no xx.xx.xx.xx  'ls -l'" 
status, output = subprocess.getstatusoutput(ssh_cmd) 
# 数据清理
登录后复制

总之,间接使用ssh命令的几个问题:

  • 需要额外安装 sshpass(如果不免密的话)

  • 干扰信息太多,数据清理、格式化相当麻烦

  • 代码实现不够优雅,可读性太差

  • ssh 连接不能复用,一次连接仅能执行一次命令

  • 代码无法全平台,仅能在 Linux 和 OSX 上使用

    立即学习Python免费学习笔记(深入)”;

3. 使用Paramiko
  • 安装

python3 -m pip install
登录后复制
  • 方法1:基于用户名和密码的 sshclient 方式登录
    该方法无法复用ssh连接。

import paramiko 
 
ssh = paramiko.SSHClient() 
# 允许连接不在know_hosts文件中的主机 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
 
# 建立连接 
ssh.connect("xx.xx.xx.xx", username="root", port=22, password="you_password") 
 
# 使用这个连接执行命令 
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("ls -l") 
 
# 获取输出 
print(ssh_stdout.read()) 
 
# 关闭连接 
ssh.close()
登录后复制
  • 方法2:基于用户名和密码的 transport 方式登录
    该方法可以复用连接。

import paramiko 
 
# 建立连接 
trans = paramiko.Transport(("xx.xx.xx.xx", 22)) 
trans.connect(username="root", password="you_passwd") 

ssh = paramiko.SSHClient() 
ssh._transport = trans 
 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("ls -l") 
print(ssh_stdout.read()) 
 
# 关闭连接 
trans.close()
登录后复制
  • 方法3:基于公钥的 SSHClient 方式登录
    该方法无法复用ssh连接。

import paramiko 
 
# 指定本地的RSA私钥文件 
# 如果建立密钥对时设置了密码,password为passphrase。如果没有passphrase则无需指定password参数。
pkey = paramiko.RSAKey.from_private_key_file('/home/you_username/.ssh/id_rsa', password='12345') 
 
# 建立连接 
ssh = paramiko.SSHClient() 
ssh.connect(hostname='xx.xx.xx.xx', 
            port=22, 
            username='you_username', 
            pkey=pkey) 
 
# 执行命令 
stdin, stdout, stderr = ssh.exec_command('ls -l') 
 
# 结果放到stdout中,如果有错误将放到stderr中 
print(stdout.read()) 
 
# 关闭连接 
ssh.close()
登录后复制
  • 方法4:基于公钥的 Transport 方式登录
    该方法可以复用连接。

import paramiko 
 
# 指定本地的RSA私钥文件 
# 如果建立密钥对时设置了密码,password为passphrase。如果没有passphrase则无需指定password参数。 
pkey = paramiko.RSAKey.from_private_key_file('/home/you_username/.ssh/id_rsa', password='12345') 
 
# 建立连接 
trans = paramiko.Transport(('xx.xx.xx.xx', 22)) 
trans.connect(username='you_username', pkey=pkey) 

ssh = paramiko.SSHClient() 
ssh._transport = trans 
 
# 执行命令,和传统方法一样 
stdin, stdout, stderr = ssh.exec_command('df -hl') 
print(stdout.read().decode()) 
 
# 关闭连接 
trans.close()
登录后复制
  • sftp 文件传输

import paramiko 
 
trans = paramiko.Transport(('xx.xx.xx.xx', 22)) 
 
# 建立连接 
trans.connect(username='you_username', password='you_passwd') 
 
# 实例化一个 sftp对象,指定连接的通道 
sftp = paramiko.SFTPClient.from_transport(trans) 
 
# 发送文件 
sftp.put(localpath='/tmp/11.txt', remotepath='/tmp/22.txt') 
 
# 下载文件 
sftp.get(remotepath='/tmp/22.txt', localpath='/tmp/33.txt') 
trans.close()
登录后复制

以上就是怎么通过Python实现linux远程登陆及sftp的详细内容,更多请关注php中文网其它相关文章!

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
相关标签:
来源:亿速云网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
豆包 AI 助手文章总结
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号