如何使用python自动通过网络发送文件?

时间:2012-09-27 03:14:19

标签: python shell terminal centos

这是我需要做的事情:

我需要通过网络复制文件。要复制的文件位于一台机器上,我需要将其发送到远程机器。它应该是自动化的,它应该使用python。我非常熟悉python的os.popen和subprocess.Popen。我可以用它来复制文件,但问题是我运行了一行命令(如下图所示)

  

scp xxx @ localhost:file1.txt yyy @] 192.168.104.XXX:file2.txt

肯定会要求像

这样的东西
  

您确定要连接(是/否)?

     

密码:

如果我没弄错的话,一旦我发出这个命令(假设我在python中编码)

  

conn.modules.os.popen(" scp xxx @ localhost:file1.txt yyy @] 192.168.104.XXX:file2.txt")

后面跟着这个命令

  

conn.modules.os.popen("是&#34)

如果我在终端中手动输入输出,那么输出(我非常肯定它会给我错误)将它与输出进行比较会有所不同。

你知道如何在python中编码吗?或者你能告诉我一些可以解决我问题的事情(命令等)

注意:我使用RPyC连接到其他远程计算机,所有计算机都在CentOS上运行

3 个答案:

答案 0 :(得分:1)

通过Python执行此操作的正确方法实际上是使用fabric,如上面的评论中所述。

创建名为fabfile.py

的文件
#!/usr/bin/python

from fabric.api import run, env, sudo, put

env.user = 'user'
env.hosts = ['xxxxx.org',]

def copy():
    put('wong_8066.zip', '/home1/user/wong_8066.zip')

然后在本地计算机上运行fab copy,它将提示输入密码。

yeukhon@yeukhon-P5E-VM-DO:~$ fab copy
[xxxxxx.org] Executing task 'copy'
[xxxxxx.org] Login password: 
[xxxxxx.org] put: wong_8066.zip -> /home1/user/wong_8066.zip

Done.

您可以使用面料做更多事情。 Fabric用于部署。 您可以使用fabric在本地运行,或远程运行mutliple主机。你在跑步时可以传递很多选项。

如果要在没有password prompt的情况下自动执行此操作,可以按照文档中的说明指定ssh-key的路径。

  

fab使用Python的optparse库,这意味着它尊重典型   Linux或GNU风格的短期和长期选项,以及自由混合   选项和参数。例如。 fab task1 -H hostname task2 -i   path / to / keyfile和更直接的fab -H一样有效   hostname -i path / to / keyfile task1 task2。

答案 1 :(得分:0)

This question似乎涵盖了您要做的事情。

使用shutil.copyfile()使用操作系统级别复制实用程序

如果您不想点击链接,请点击此处:

import shutil
source_path = r"\\mynetworkshare"
dest_path = r"C:\TEMP"
file_name = "\\myfile.txt"

shutil.copyfile(source_path + file_name, dest_path + file_name)

答案 2 :(得分:0)

根据我的经验,第一次使用sftp会提示用户接受主机公钥,例如

The authenticity of host 'xxxx' can't be established. RSA key fingerprint is xxxx. Are you sure you want to continue connecting (yes/no)? 一旦输入yes,公钥将保存在〜/ .ssh / known_hosts中,下次你将不会得到这样的提示/警告。

要避免批处理脚本中的此提示/警报,您可以使用turn strict host check off use

  

scp -Bqpo StrictHostKeyChecking = no

但你很容易受到中间人攻击。

您还可以选择手动连接目标服务器并在部署批处理脚本之前保存主机公钥。