在 Python 中使用 SCP 协议

Manav Narula 2023年1月30日
  1. 在 Python 中使用 SCP 模块使用 SCP 协议
  2. 在 Python 中使用 subprocess.run() 函数使用 SCP 协议
在 Python 中使用 SCP 协议

SCP,安全复制协议,安全地将文件从远程服务器移动到主机,反之亦然。该协议基于 SSH 协议。

SCP 协议使用此安全 shell (SSH) 通过网络安全地传输文件,并从所有端点进行适当的身份验证。

本教程将演示如何在 Python 中使用 SCP 协议共享和接收文件。

在 Python 中使用 SCP 模块使用 SCP 协议

Python 中的 SCP 模块可以使用 SCP1 协议传输文件。SCP1 协议使用 SSH1 进行单个文件传输。

SCP 模块使用 Paramiko 库通过 SSH 安全地连接远程主机和服务器。

让我们看一个在 Python 中使用 SCP 上传和检索文件的示例。

from paramiko import SSHClient
from scp import SCPClient

ssh_ob = SSHClient()
ssh_ob.load_system_host_keys()
ssh_ob.connect("sample.com")
scp = SCPClient(ssh_ob.get_transport())

scp.put("sampletxt1.txt", "sampletxt2.txt")
scp.get("sampletxt2.txt")
scp.put("sample", recursive=True, remote_path="/home/sample_user")

scp.close()

我们现在将分析上述代码中发生的事情。

我们使用 paramiko.SSHClient 类来创建到 SSH 服务器的安全连接。scp.SCPClient 通过使用 SSH 连接的传输返回一个对象,该连接使用 get_transport() 函数返回。

我们使用 scp.put() 函数将文件上传到服务器,并使用 scp.get() 函数检索文件。传输文件后,我们使用 close() 函数关闭连接。

我们还可以使用 putfo() 函数通过 SCP 模块上传类似文件的对象。

例子:

import io
from paramiko import SSHClient
from scp import SCPClient

ssh = SSHClient()
ssh.load_system_host_keys()
ssh.connect("sample.com")
scp = SCPClient(ssh.get_transport())

f = io.BytesIO()
f.write(b"content")
f.seek(0)
scp.putfo(f, "/sample_dir/sampletxt.txt")

scp.close()
fl.close()

在上面的示例中,我们使用 io.BytesIO() 构造函数来创建内存中的文件对象。我们以字节为单位写入了一些数据,并使用 scp.putfo() 函数将其上传到文本文件。

在 Python 中使用 subprocess.run() 函数使用 SCP 协议

subprocess 模块可以从 Python 程序远程运行 bash 命令。我们可以使用 subprocess.run() 函数来运行给定的命令。

我们可以使用 SCP bash 命令通过 SSH 传输文件。这可以使用前面讨论的 subprocess.run() 函数来执行。

例子:

import subprocess

subprocess.run(["scp", "sample.txt", "user@server:/path/sample.txt"])

在上面的示例中,我们使用 SCP 命令传输了一个文本文件。我们需要在源上生成 SSH 密钥并预先将其安装在目标上,以使用你的密钥对 SCP 进行身份验证。

subprocess.run() 函数是在 Python 3.5 中引入的。我们还可以使用其他函数来运行 SCP bash 命令,例如 subprocess.Popen()os.system() 等。

总之,我们可以通过使用 SCP 模块或从不同的功能运行 bash 命令 SCP 来将 SCP 协议与 Python 一起使用。拥有用于传输文件的身份验证所需的密钥至关重要。

作者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn