【问题标题】:Batch SFTP commands with Python and Paramiko使用 Python 和 Paramiko 批处理 SFTP 命令
【发布时间】:2020-10-02 02:25:43
【问题描述】:

我正在将一些批处理作业从 Window 移植到 Linux。这些是 Windows 上的 .bat 脚本,我正在用 Python 重写它们以在 Linux 上运行

在 Windows 上,我们目前使用 putty 来 SFTP 文件并运行如下命令:

psftp user@host -i privatekey.ppk -batch -b script.txt

这会批量执行 script.txt 中的 putty SFTP 命令。示例如下:

SCRIPT.TXT example

 cd mydir
 lcd outbox
 get myremotefile.txt mylocalfile.txt
 get myotherremotefile.txt myotherlocalfile.txt
 bye

我正在尝试找到一种方法来在我的 python 脚本中使用相同的批处理脚本 (script.txt) 以最大限度地减少整体更改量。我一直在研究paramiko,但到目前为止我还没有找到通过脚本文件批量执行 sftp 命令的方法。

另一种方法是生成一个子进程来使用 -b 选项执行 sftp 命令,但如果可能的话,更喜欢 Python 原生解决方案。

你怎么看?有没有其他方法可以解决这个问题?

【问题讨论】:

    标签: python ssh sftp paramiko


    【解决方案1】:

    脚本中的命令是psftp 命令。不是“SFTP 命令”(没有 SFTP 命令)。一般来说,没有其他应用程序或库能够理解它们。除了 OpenSSH sftp,因为 PuTTY psftp 在某种程度上兼容。

    如果您想使用原生 Python SFTP 库,例如 Paramiko 或 pysftp,则需要使用其 API。这意味着重写你的代码。这并不难。

    【讨论】:

    • 不是真的,那些是 SFTP 命令。没有什么不能与 sftp -b 一起使用。我刚刚测试过它并且它已经工作了。你说什么具体的命令不起作用?
    • 好的,PuTTY psftp 与 OpenSSH sftp 在某种程度上兼容。但是,仍然没有“SFTP 命令”。只有各个 SFTP 客户端的命令。
    • 是的,但考虑到 psftp 已被实现为与 OpenSSH sftp 兼容(或接近),我相信我可以通过生成对 OpenSSH sftp 命令的子进程调用来获得我想要的结果,就像这样:rc = subprocess.call(f'sftp -b {pathToScript} {args.userAndHost}')
    • 当然,但是您要求提供原生 Python 解决方案。
    • 如果我能以某种方式保留脚本文件并避免更改我的所有脚本,最好使用本机 python 解决方案。如果不可能,生成子进程是可以接受的。感谢您的帮助。