Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python - Transfer a file between two remote servers, excecuting a python script

I am trying to copy a file between two servers from a localServer, say from server-A to server-B. I am using paramiko package in python.

So there are three servers namely, localServer, server-A and server-B. Please see the below code, this is self explanatory and please let me know where I am going wrong.

Algorithm I am using:

  1. I am trying to run paramiko_test.py file from localServer.
  2. paramiko_test.py executes copy.py file in server-A.
  3. copy.py copies file source.txt file in server-A to server-B using SFTP.

When I run copy.py from server-A, it is working correct. But when I run paramiko_test.py from localServer (which indirectly executes copy.py in server-A), it is not working!

From logs, I got to know that there is a successful connection from server-A to server-B, but after that the SFTP part is not working!

Question: Can we invoke a SFTP client within a SFTP client? Is there any better way to copy files between two servers?

Please help me where I am going wrong.

server-A, file:copy.py:

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('<server-B-IP>', username='serverB', password='passwd')

print "connected successfully!"

sftp = ssh.open_sftp()
print sftp
sftp.put('source.txt','/home/serverB/destination.txt' )
sftp.close()
print "copied successfully!"

ssh1.close()
exit()

localServer, paramiko_test.py:

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('<server-A-IP>', username='serverA', password='passwd')

print "connected successfully!"

stdin, stdout, stderr = ssh.exec_command("python /home/username/copy.py")

print stdout.readlines()

print "copied successfully!"

ssh.close()
exit()

The output of stderr.readlines() is:

Traceback (most recent call last):
 File "/home/sitaram/sumanth/test_progs/copy.py", line 12, in <module>
 sftp1.put('./sumanth_temp.txt','/home/ncloudadmin/sumanth.txt' ) 
 File "/usr/lib/pymodules/python2.6/paramiko/sftp_client.py", line 558, in put
 file_size = os.stat(localpath).st_size
OSError: [Errno 2] No such file or directory: './sumanth_temp.txt'
like image 349
Sumanth Lingappa Avatar asked Jan 31 '13 12:01

Sumanth Lingappa


People also ask

Can I transfer files between two remote servers?

The scpscpSecure copy protocol (SCP) is a means of securely transferring computer files between a local host and a remote host or between two remote hosts. It is based on the Secure Shell (SSH) protocol. "SCP" commonly refers to both the Secure Copy Protocol and the program itself.https://en.wikipedia.org › wiki › Secure_copy_protocolSecure copy protocol - Wikipedia tool relies on SSH (Secure Shell) to transfer files, so all you need is the username and password for the source and target systems. Another advantage is that with SCP you can move files between two remote servers, from your local machine in addition to transferring data between local and remote machines.


1 Answers

Question is year old, so probably not relevant anymore, but maybe it will be useful to others. The problem is in your copy.py.

sftp.put('source.txt','/home/serverB/destination.txt' )

where is source.txt located? Either provide full path, or if the file is always located in in the same dir as copy.py you could modify your paramiko_test.py

ssh.exec_command("cd /home/username/; python /home/username/copy.py")
like image 124
Tadzys Avatar answered Oct 08 '22 05:10

Tadzys