我使用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创建一个通用代码。
发布于 2018-02-17 19:49:40
.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方法的命令完全使用服务器的专有语法在服务器上执行。当地的图书馆不可能理解这一点,并以某种方式神奇地转换它。
发布于 2018-12-22 04:57:08
如果您键入sftp.execute('ls'),您将获得用户名目录的内容。
在该目录中创建一个名为example.py的文件,并编写以下代码:
导入os os.chdir('/home/alex_test')
Os.system(‘源myscript.tcsh')
现在运行:
sftp.execute('python example.py')
这不是最好的解决方案,但它是有效的。
https://stackoverflow.com/questions/48840397
复制相似问题