使用Python通过SSH从服务器读取文件

50 投票
6 回答
157348 浏览
提问于 2025-04-15 15:13

我正在尝试通过Python使用SSH从服务器读取一个文件。我使用Paramiko来连接。连接上服务器后,我可以运行像cat filename这样的命令,并从服务器获取数据,但我想读取的一些文件大小大约在1GB或更大。

我该如何用Python逐行读取服务器上的文件呢?

补充信息:我通常的做法是运行cat filename命令,把结果存储在一个变量里,然后进行处理。但是因为这里的文件比较大,我想找一种方法逐行读取服务器上的文件。

编辑:我可以读取一大堆数据并把它分成行,但问题是接收到的数据有时并不包含完整的行。例如,如果缓冲区有300行,最后一行可能只是一半,下一半会在下次调用服务器时获取。我想要完整的行。

编辑2:我可以用什么命令来打印文件中某个范围的行呢?比如打印前100行,然后再打印接下来的100行,依此类推?这样缓冲区就总是能包含完整的行。

6 个回答

8
#!/usr/bin/env python
import paramiko
import select
client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect('yourhost.com')
transport = client.get_transport()
channel = transport.open_session()
channel.exec_command("cat /path/to/your/file")
while True:
  rl, wl, xl = select.select([channel],[],[],0.0)
  if len(rl) > 0:
      # Must be stdout
      print channel.recv(1024)

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得简单易懂。

18

这是对@Matt Good的回答的一个扩展,使用了fabric这个工具:

from fabric.connection import Connection

with Connection(host, user) as c, c.sftp() as sftp,   \
         sftp.open('remote_filename') as file:
    for line in file:
        process(line)

旧版Fabric 1的回答:

from contextlib     import closing
from fabric.network import connect

with closing(connect(user, host, port)) as ssh, \
     closing(ssh.open_sftp()) as sftp, \
     closing(sftp.open('remote_filename')) as file:
    for line in file:
        process(line)
91

Paramiko的SFTPClient让你可以以一种Python风格的方式,从远程文件中获取一个像文件一样的对象来读取数据。

假设你已经打开了一个SSHClient

sftp_client = ssh_client.open_sftp()
remote_file = sftp_client.open('remote_filename')
try:
    for line in remote_file:
        # process line
finally:
    remote_file.close()

撰写回答