我使用 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
方法(由pysftp内部使用.execute
)根本不使用ParamikoSFTPClient
类。
.execute
方法的文档也这么说:
在远程计算机上执行给定的命令。 命令的执行与远程无关
。pwd
而且SFTP协议本身没有工作目录的概念。
pysftp(或者实际上是底层的 Paramiko 库)仅在本地进行模拟。您传递给 pysftp/Paramiko 库 SFTP 方法的所有相对路径在发送到 SFTP 服务器之前都会转换为绝对路径。对于 pysftp 来说,这意味着几乎所有方法(与远程路径一起使用),但
.execute
是一个明显的例外。这种转换之所以可能,只是因为 SFTP 协议强制使用 *nix 样式路径(即使实际的远程服务器系统使用不同的语法)。所以 pysftp/Paramiko 知道如何将相对路径转换为绝对路径。
相反,传递给
.execute
方法的命令完全使用服务器的专有语法在服务器上执行。当地图书馆不可能理解这一点并以某种方式神奇地转换它。
如果您输入 sftp.execute('ls'),您将获得用户名目录的内容。
在该目录中创建一个名为 example.py 的文件并写入以下内容:
导入操作系统
os.chdir('/home/alex_test')
os.system('源 myscript.tcsh')
现在运行:
sftp.execute('python example.py')
不是最好的解决方案,但它有效。