我在工作中面临一场噩梦。负责下面我要描述的事情的一位同事把这个责任交给了我,现在已经离开了组织。我没有做这些事情的经验。请原谅我知识不足和问题太长——我不确定要包含/省略哪些信息。
背景
我们从第三方获取一些数据,这些数据被发送到 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 附带
pscp
和psftp
命令(可以使用您现有的 SSH 密钥和所有内容)。C:\> pscp 2022.csv user@yourserver:~/my_project/meta_files/2022.csv
最新的 Windows 版本内置了 OpenSSH,带有
scp
和sftp
命令。它们的用法与 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
内核级
smb3
和cifs
挂载。自动化的好选择,但首次设置时需要在 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 cronjobs到Windows 服务器,然后使用 python-pypsrp 在这些 Windows 系统上远程运行命令。)