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

最佳答案

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

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

实际上,即使是 .execute method的文档也说:



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

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

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

09-25 19:25