如何使用 samba 共享将文件从 Windows 传输到 Linux 服务器?

如何使用 samba 共享将文件从 Windows 传输到 Linux 服务器?

我在工作中面临一场噩梦。负责下面我要描述的事情的一位同事把这个责任交给了我,现在已经离开了组织。我没有做这些事情的经验。请原谅我知识不足和问题太长——我不确定要包含/省略哪些信息。

背景

我们从第三方获取一些数据,这些数据被发送到 postgres 服务器,然后被带入 Linux 服务器,在那里一些 shell 脚本会进行一些转换。然后,数据集被组合起来,之后被发送到我们使用的数据分析工具。这个过程使用 cron 自动完成。

但是,每年我们都需要手动更新 Linux 服务器上的一些元数据 csv 文件 [这些文件使用 shell 脚本与第三方数据相结合]。

文件夹结构:

以下是 Linux 服务器文件夹结构 [使用 PuTTY 访问]:

  • 另一个项目
  • 另一个项目
  • 我的项目
  • 另一个项目

〜/我的项目>

  • shell脚本
  • 采购文件
  • 元文件
  • 合并文件

〜/元文件>

  • 2019.csv
  • 2020.csv
  • 2021.csv

我需要做什么

我需要做的是添加一个名为2022.csv到 meta_files 文件夹。我的本地系统上有这个文件。在我同事的移交文件中,他只是说“使用 samba 共享将文件复制到 linux”。我找到了 samba 共享位置,并在 Windows 资源管理器上进行了设置。它的地址如下所示:\\smb.comp.com\prod。这里有各种类型的文件夹。

我怀疑我必须把2022.csv文件放在 samba 共享中的某个位置,然后使用 PuTTY 在 Linux 服务器上运行命令。但是,我不知道将其放在哪里以及运行什么命令。

我再次为这么长的问题和过多的描述道歉。如果您能帮助我将 2022.csv 文件放到 Linux 上,我将不胜感激。如果需要任何其他信息,请告诉我。非常感谢。

答案1

如果你已经使用 SSH 访问 Linux 服务器,请反过来操作——通过 SFTP 直接连接到 Linux 服务器上传文件。通常,所有接受 SSH 的服务器也接受 SFTP 连接。

  • PuTTY 附带pscppsftp命令(可以使用您现有的 SSH 密钥和所有内容)。

    C:\> pscp 2022.csv user@yourserver:~/my_project/meta_files/2022.csv
    
  • 最新的 Windows 版本内置了 OpenSSH,带有scpsftp命令。它们的用法与 pscp/psftp 类似。

  • WinSCP 是一款优秀的图形化 SFTP 客户端,同时还具有批处理 CLI 模式(winscp.com)和用于自动化的 .NET 程序集。

  • 对于手动 GUI 使用,我认为 Bitvise 也有 SFTP。FileZilla 也可以。

但如果 Linux 服务器必须从 SMB 共享中拉取文件 - 将其放在您想要的任何位置,然后使用 Linux SMB 客户端访问它。有几种,例如:

  • 来自 Samba 的命令smbclient。适合一次性作业,但自动化起来很麻烦:

    $ smbclient //smb.comp.com/prod -U someuser
    smbclient> get 2022.csv
    
  • 内核级smb3cifs挂载。自动化的好选择,但首次设置时需要在 Linux 系统上具有 root 权限。

    $ sudo mount -t smb3 //smb.comp.com/prod /mnt/thesmbserver [options...]
    $ cp -av /mnt/thesmbserver/2022.csv ~/my_project/meta_files/
    $ sudo umount /mnt/thesmbserver
    

    (如果 SMB 共享不支持 SMB3,请使用较旧的cifs类型。)

  • 使用“python-smbprotocol”模块的自定义 Python 脚本。适合自动化:

    import os
    import shutil
    import smbclient
    import time
    
    thisyear = time.strftime("%Y")
    remote = r"\\smb.comp.com\prod\%s.csv" % thisyear
    local = os.path.expanduser("~/my_project/meta_files/%s.csv" % thisyear)
    
    with smbclient.open_file(remote, "rb") as remote_fh:
        with open(local, "wb") as local_fh:
            shutil.copyfileobj(remote_fh, local_fh)
    

(我们有几个使用 python-smbprotocol 复制文件的 Linux cronjobsWindows 服务器,然后使用 python-pypsrp 在这些 Windows 系统上远程运行命令。)

相关内容