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

2024-05-23 16:55:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

alex/u要在脚本中执行

^{pr2}$

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

另一方面,它确实有效

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

为什么? 我的目标是为unix和Windows创建一个通用代码。在


Tags: import脚本nonehostparamikousernamerootconnection
2条回答

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

如果您直接使用Paramiko库,就更清楚了,因为在那里您可以清楚地看到Paramiko^{} method(pysftp.execute)根本不使用Paramiko^{} class。在

实际上,即使是^{} method的文档也说:

Execute the given commands on a remote machine. The command is executed without regard to the remote pwd.


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

pysftp(或者实际上是底层Paramiko库)只在本地模拟这种情况。传递给pysftp/Paramiko library SFTP方法的所有相对路径在发送到SFTP服务器之前都会转换为绝对路径。对于pysftp来说,这意味着几乎所有的方法(可以使用远程路径),但有一个显著的例外是.execute。这种转换是可能的,因为SFTP协议要求使用*nix样式的路径(即使实际的远程服务器系统使用不同的语法)。所以pysftp/Paramiko知道如何将相对路径转换为绝对路径。在

相反,传递给.execute方法的命令将使用服务器的专有语法在服务器上完全执行。当地图书馆不可能理解这一点,并以某种方式神奇地将其转化。在

如果你输入sftp.执行('ls')您将获得用户名目录的内容。在

在该目录中创建一个名为示例.py并写下以下内容:

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

现在运行:

sftp.执行(Python示例.py')

不是最好的解决办法,但它是有效的。在

相关问题 更多 >