为什么pysftp库中的chdir不影响pysftp库中的执行?

问题描述 投票:0回答:2

我使用 pysftp (它是 paramiko 的包装)。

import pysftp
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
sftp=pysftp.Connection(host='hostname',username="root",password="pass",cnopts=cnopts)

/home/alex_test 中的脚本,我想执行该脚本

sftp.chdir("/home/alex_test")
sftp.execute("source myscript.tcsh")

但是它不起作用,因为找不到脚本。

另一方面,它确实有效

sftp.execute("cd /home/alex_test;cat myscript.tcsh")

为什么? 我的目标是为 UNIX 和 Windows 创建通用代码。

python ssh sftp paramiko pysftp
2个回答
1
投票

.execute
方法实际上与SFTP无关。它在内部打开一个单独的“exec”SSH 通道。该通道与“SFTP”子系统通道完全隔离。

如果你直接使用Paramiko库会更清楚,因为在那里你会清楚地看到Paramiko

SSHClient.exec_command
方法(由pysftp内部使用
.execute
)根本不使用Paramiko
SFTPClient

实际上,就连

.execute
方法的文档也这么说:

在远程计算机上执行给定的命令。 命令的执行与远程无关

pwd


而且SFTP协议本身没有工作目录的概念。

pysftp(或者实际上是底层的 Paramiko 库)仅在本地进行模拟。您传递给 pysftp/Paramiko 库 SFTP 方法的所有相对路径在发送到 SFTP 服务器之前都会转换为绝对路径。对于 pysftp 来说,这意味着几乎所有方法(与远程路径一起使用),但

.execute
是一个明显的例外。这种转换之所以可能,只是因为 SFTP 协议强制使用 *nix 样式路径(即使实际的远程服务器系统使用不同的语法)。所以 pysftp/Paramiko 知道如何将相对路径转换为绝对路径。

相反,传递给

.execute
方法的命令完全使用服务器的专有语法在服务器上执行。当地图书馆不可能理解这一点并以某种方式神奇地转换它。


-1
投票

如果您输入 sftp.execute('ls'),您将获得用户名目录的内容。

在该目录中创建一个名为 example.py 的文件并写入以下内容:

导入操作系统 os.chdir('/home/alex_test')
os.system('源 myscript.tcsh')

现在运行:

sftp.execute('python example.py')

不是最好的解决方案,但它有效。

© www.soinside.com 2019 - 2024. All rights reserved.