我使用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 书馆无法理解它并以某种方式神奇地将其转换。