为什么pysftp库中的chdir对pysftp库中的执行没有影响?

时间:2018-02-17 10:35:27

标签: python ssh sftp paramiko pysftp

我使用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创建通用代码。

2 个答案:

答案 0 :(得分:1)

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

如果您直接使用Paramiko库会更清楚,因为您会清楚地看到Paramiko SSHClient.exec_command method(由pysftp .execute内部使用)根本不使用Paramiko SFTPClient class

实际上甚至.execute method的文档都说:

  

在远程计算机上执行给定命令。 执行该命令时不考虑远程pwd

此外,SFTP协议本身没有工作目录的概念。

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

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

答案 1 :(得分:-1)

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

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

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

现在运行:

sftp.execute('python example.py')

不是最好的解决方案,但它可以工作。