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

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的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3165202.html

(0)
上一篇 2025年3月30日 18:26:56
下一篇 2025年2月18日 03:03:53

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论