Home > Mobile >  Python copy file to remote
Python copy file to remote

Time:10-30

I am using this code

tar zcf - somefolder/ | ssh user@server "cd /path/to/remote && tar zxf -"

to copy files between 2 system

i want to do it in python

i did

import subprocess
p=subprocess.Popen('tar zcf - somefolder/ | ssh user@server "cd /path/to/remote && tar zxf -')

i also tried

p=subprocess.Popen(["tar","-zcf somefolder | ssh [email protected] /path/to/remote && tar -zxf"])

but both not working i also tried with run instead of popen but still not working

but

 stream = os.popen("cmd")

this is working fine but problem is i am not getting status

in first methods i can use

 os.waitpid(p.pid, 0)

to get live status of process

what i want is transfer files between remote and local without using external libraries and with live status

how can i achive this?

CodePudding user response:

I would keep it simple and use the os module, which is also faster than subprocess:

result = os.popen("command").read()

CodePudding user response:

Update: I overlooked "no external module" sorry. But maybe it's useful for others searching.

There is a module for that :)

from paramiko import SSHClient
from scp import SCPClient

ssh = SSHClient()
ssh.load_system_host_keys()
ssh.connect('example.com')

# SCPCLient takes a paramiko transport as an argument
scp = SCPClient(ssh.get_transport())

scp.put('test.txt', 'test2.txt')
scp.get('test2.txt')

# Uploading the 'test' directory with its content in the
# '/home/user/dump' remote directory
scp.put('test', recursive=True, remote_path='/home/user/dump')

scp.close()

Or with usage of with:

from paramiko import SSHClient
from scp import SCPClient

with SSHClient() as ssh:
    ssh.load_system_host_keys()
    ssh.connect('example.com')

    with SCPClient(ssh.get_transport()) as scp:
        scp.put('test.txt', 'test2.txt')
        scp.get('test2.txt')

See: https://pypi.org/project/scp/

CodePudding user response:

From my experience, using subprocess.run() to run an external Ubuntu program/process I've had to use each command parameter or such as a different list entry, like so:

subprocess.run(['pip3', 'install', 'someModule'])

So maybe try putting every single space-separated argument as it's own list element.

  • Related