目录
一、前言
最近需要通过多台主机共同完成一个任务,要求所涉及的主机都要运行一些代码。我本来是在一台主机上写完代码,然后将其他主机所涉及的代码文件通过远程传输复制到对应主机上。但我后来觉得这样太麻烦了,因为每次修改代码文件都需要把文件复制到对应的主机上。所以决定将这个文件同步过程也在代码中自动化,以使得我能够很方便地不断调试。
那么问题就来了,我所有的主机都是win10专业版操作系统,文件传输可以通过远程桌面连接或其他软件形式解决,但通过软件来操作传输一般是不可编程的,即无法在代码中完成这个行为。我希望找到像Linux中scp的命令一样的方法,那样就可以通过脚本来自动化这个过程。然而,在寻找这个的过程中,我找到了win10中传输文件更加好用的方法——共享文件夹。某台主机共享了自己的文件夹之后,其他在相同局域网中的主机就可以访问到被共享的文件夹,而且操作共享文件夹的方式与本地文件夹完全相同,那么就可以将文件传输问题变成文件在不同文件夹中的复制。用代码实现这个过程,问题就迎刃而解。
二、环境说明
操作系统:win10专业版。
语言:python
网络:(专用)局域网
三、在win10中共享文件夹
目前搜索“共享文件夹”得到的结果大多数是不能用的方法——在 Windows 10 中,通过网络共享文件和文件夹的某些功能已发生变化,包括删除了家庭组。现在可用的方法如下[1]:
1、右键单击或按下某个文件,选择“将访问权限授予”>“特定用户”。
2、弹出如下界面,点击下拉菜单,选择“Everyone”,点击共享按钮
3、看到如下结果,则表示共享成功
三、局域网中其他主机如何访问被共享的文件夹
一般来说,如果两台主机在同一个局域网内,那么只要双方都打开网络发现,主机之间就可以互相看到。打开网络发现的过程如下:
1、双击“此电脑”,点击“网络”,如果没有打开网络发现,则会出现如下提示
2、将提示信息关闭,单击上面的提示横幅,点击“启用网络发现和文件共享”
3、共享文件夹的主机(服务机)和客户机都做了上述操作后,客户机中的网络界面如下:
4、上图中计算机下的两个小电脑,左边代表客户机,右边代表服务机。双击进入服务机,进入需要输入账号和密码(与远程桌面连接相同)
5、输入正确的账号密码,就可以看到服务机共享的文件夹了
四、另一种访问共享文件夹的方式
启用网络发现的方式比较直观,但有时候可能不希望开启网络发现,此时也是能够访问到共享文件夹的(在同一个局域网内)。注意到,在服务机共享文件夹的最后一步有这个提示
因此,在文件夹中的路径输入\\DESKTOP-NORO7OI\Foxit PhantomPDF即可直接进入被共享的文件夹
五、将修改过的文件更新到远程主机上
python语言的shutil模块提供copy函数,用于复制文件,其定义为
shutil.copy(src, dst)
其中src和dst是文件的原始路径和复制的目标路径。如果目标路径已存在对应文件,这个函数将强制覆盖文件,所以可以达到更新文件的效果。我将本地路径传入src,目标路径为远程路径,如
import shutil
shutil.copy('.\\notes.txt', '\\\\DESKTOP-NORO7OI\\Foxit PhantomPDF\\notes.txt')
上述语句将本地当前路径下的notes.txt复制到了远程主机上,依然以notes.txt为名称
在多台主机的情况下,伪代码如下
import shutil
local_path = 'the path of a local file'
remote_path = '\\\\DESKTOP-NORO7OI\\the destination of copy function'
shutil.copy(local_path, remote_path)
local_path_2 = 'another path of a local file'
remote_path_2 = '\\\\another name of host\\the destination of copy function'
shutil.copy(local_path_2, remote_path_2)
...
上述过程可以无限添加,也可以写成循环,这些不在本文讨论范围内,毕竟主要需要这些,其他操作都是看自己的情况来定。这样就可以在某台主机上更新完文件之后,将远程主机需要的文件直接分发到远程主机上,当然前提是必须在同一个局域网内。
Reference:
[1] Microsoft支持文档 -- https://support.microsoft.com/zh-cn/windows/%E5%9C%A8-windows-10-%E4%B8%AD%E9%80%9A%E8%BF%87%E7%BD%91%E7%BB%9C%E5%85%B1%E4%BA%AB%E6%96%87%E4%BB%B6-b58704b2-f53a-4b82-7bc1-80f9994725bf