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 创建一个通用代码。

4

2 回答 2

1

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

如果您直接使用 Paramiko 库会更清楚,因为在那里您会清楚地看到ParamikoSSHClient.exec_command方法(由 pysftp 内部使用.execute)根本不使用ParamikoSFTPClient

实际上,甚至.execute方法的文档都说:

在远程机器上执行给定的命令。该命令的执行与远程无关pwd


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

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

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

于 2018-02-17T11:49:40.160 回答
-1

如果你输入 sftp.execute('ls') 你会得到你的用户名目录的内容。

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

import os os.chdir('/home/alex_test')
os.system('source myscript.tcsh')

现在运行:

sftp.execute('python example.py')

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

于 2018-12-21T20:57:08.433 回答