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

如何使用python通过网络自动发送文件?,python,shell,terminal,centos,Python,Shell,Terminal,Centos,以下是我需要做的: 我需要通过网络复制文件。要复制的文件位于同一台计算机中,我需要将其发送到远程计算机。它应该是自动化的,并且应该使用python制作。我非常熟悉python的os.popen和subprocess.popen。我可以用它来复制文件,但是,问题是一旦我运行了one-liner命令(如下图所示) scpxxx@localhost:file1.txt yyy@]192.168.104.XXX:file2.txt 它肯定会要求像这样的东西 是否确实要连接(是/否) 密码: 如果我没弄错

以下是我需要做的:

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

scpxxx@localhost:file1.txt yyy@]192.168.104.XXX:file2.txt

它肯定会要求像这样的东西

是否确实要连接(是/否)

密码:

如果我没弄错的话,一旦我发送了这个命令(假设我是用python编写的)

conn.modules.os.popen(“scpxxx@localhost:file1.txt yyy@]192.168.104.XXX:file2.txt“)

然后是这个命令

conn.modules.os.popen(“是”)

如果我在终端中手动输入它,将其与输出进行比较,输出(我很确定它会给我错误)将是不同的

您知道如何用python编写此代码吗?或者你能告诉我一些可以解决我问题的方法(命令等)

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

似乎涵盖了您试图执行的操作

使用
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)

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

无法建立主机“xxxx”的真实性。
RSA密钥指纹是xxxx。您确定要继续连接吗
(是/否)?
输入yes后,公钥将保存在~/.ssh/known_hosts中,下次您将不会收到此类提示/警报

若要避免批处理脚本中出现此提示/警报,可以使用“禁用严格主机检查”

scp-Bqpo StrichostKeyChecking=否

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


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

通过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在本地运行,也可以远程运行到多主机。您可以在运行时传递许多选项

如果要在没有密码提示的情况下自动执行此操作,可以按照文档中的说明指定ssh密钥的路径

fab使用Python的OptPass库,这意味着它尊重典型的 Linux或GNU风格的长短选项,以及自由混合 选项和参数。例如,fab task1-H主机名task2-i path/to/keyfile与更简单的fab-H一样有效 主机名-i路径/to/keyfile task1 task2


不是使用键盘交互式身份验证,而是使用密码进行身份验证。这是用于windows还是linux计算机?当您说“网络共享”时,它是计算机的ip吗?因为我尝试了这个shutil.copyfile('/home/USER/Desktop/thisisthefile.txt','/192.168.104.XXX/home/USER/Desktop/thisisthefile.txt'),所以它没有给我这样的文件或目录错误