在Tar​​ SSH Pipe shell调用后恢复Python?

时间:2016-03-07 14:33:26

标签: python ssh pipe tar

我正在将自定义地图(如谷歌地图)从我的家庭服务器转移到云服务器。我可以传输它们的最快方法似乎是tar ssh管道方法。

tar czpf - ./tiles | ssh -i myprivate.key user@ssh.example.com "tar xzpf - -C /www/tiles/"

这在命令行上运行得很好,但现在我想要我的python脚本创建tile以自动推送它们。我试过了:

os.system('tar czpf - ./tiles | ssh -i myprivate.key user@ssh.example.com "tar xzpf - -C /www/tiles/"')

以及subrprocess.Popen变体,它们都将我的所有地图图块复制到远程服务器,但是系统shell没有关闭并将控制权返回给python脚本,因此脚本挂起并且没有完成。

我猜是管道或tar重定向到STDOUT会发生一些事情,它不会让os.system完成。我想也许负责解压缩的远程tar正在等待更多的STDIN通过管道,但没有其他的东西会来吗?我真的不太了解这一点并感谢你的帮助。

我是否可以做一些不同的事情来完成脚本的其余部分,同时仍然能够实现tar ssh管道传输方法的好处?

谢谢!

1 个答案:

答案 0 :(得分:0)

不赞成使用os.system()来支持子进程模块。

我在Python 2.7解释器中运行它。它成功并立即恢复了控制权:

import subprocess
try:
    if subprocess.call(["/bin/bash", "tar_ssh.sh"]) == 0:
        print "success!"
    else:
        print "failed! :("
except Exception as e:
    print(str(e))

它调用 tar_ssh.sh ,它只包含您的命令(假定公钥身份验证,而不是密码验证):

tar czpf - ./source_folder/ | ssh username@ip_or_hostname "tar xzpf - -C /destination_folder/"