我使用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创建通用代码。
答案 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')
不是最好的解决方案,但它可以工作。