2017-08-10 41 views
0

我在我的代码,这样的功能:Python不认为文件存在时,它

def send_info(self, bfile, output_file_name, tag): 
    self.command = r"sshpass -p {3} scp -P 5622 {0} {1}@{2}:/home/blender/Documents/blade_queue/".format(str(current_render.blend), self.uname, self.host, self.password) 
    print self.command 
    self.response = subprocess.check_output(self.command) 

打印出:

sshpass -p PASSWORD scp -P PORT /mnt/c/Users/Joseph\ Farah/Documents/python/cross_computer_rendering_gui/src/test.blend [email protected] /home/blender/Documents/blade_queue/ 

当我复制和该命令粘贴到我的壳,它的工作绝对精美。但是,试图在Python中运行此结果的结果如下:

OSError: [Errno 2] No such file or directory

在该行上。

任何帮助,将不胜感激!提前致谢。

回答

1

想通了。我需要将shell=True添加到该命令。有谁知道这是否会导致任何安全漏洞?

被修改命令:

self.response = subprocess.check_output(self.command, shell=True) 
+2

从[文档](https://docs.python.org/3/library/subprocess.html):17.5.2。安全注意事项 与其他一些popen函数不同,此实现永远不会隐式调用系统shell。这意味着所有字符(包括shell元字符)都可以安全地传递给子进程。如果shell是通过shell = True显式调用的,则应用程序有责任确保所有空白和元字符都被恰当引用以避免shell注入漏洞。 – JoshuaRLi

+0

有关可能出错的示例:想象用户将其密码设置为'; rm -rf /;'... – jasonharper

+0

你想将参数作为一个'list'传递,它在参数边界处显式分割,所以你可以避免'shell = True'。如果命令是[“sshpass”,'-p',self.password,'scp','-P','5622',str(current_render.blend),'{} @ {}:/ home/blender /Documents/blade_queue/'.format(self.uname,self.host)]'所以所有的参数都是独立显式传递的,它会更快更安全。 – ShadowRanger

相关问题