-tt option allocates tty, which prevents the child process from exiting when .communicate() closed by p.stdin ( EOF ignored). It works:
import pipes from subprocess import Popen, PIPE cmd = ["ssh", self.host, "cat > " + pipes.quote(out_path)]
You can use paramiko - a clean Python ssh library to write data to a remote file via ssh:
#!/usr/bin/env python import os import posixpath import sys from contextlib import closing from paramiko import SSHConfig, SSHClient hostname, out_path, in_string = sys.argv[1:] # get from command-line # load parameters to setup ssh connection config = SSHConfig() with open(os.path.expanduser('~/.ssh/config')) as config_file: config.parse(config_file) d = config.lookup(hostname) # connect with closing(SSHClient()) as ssh: ssh.load_system_host_keys() ssh.connect(d['hostname'], username=d.get('user')) with closing(ssh.open_sftp()) as sftp: makedirs_exists_ok(sftp, posixpath.dirname(out_path)) with sftp.open(out_path, 'wb') as remote_file: remote_file.write(in_string)
where makedirs_exists_ok() is the mimics os.makedirs() function:
from functools import partial from stat import S_ISDIR def isdir(ftp, path): try: return S_ISDIR(ftp.stat(path).st_mode) except EnvironmentError: return None def makedirs_exists_ok(ftp, path): def exists_ok(mkdir, name): """Don't raise an error if name is already a directory.""" try: mkdir(name) except EnvironmentError: if not isdir(ftp, name): raise
source share