
我在工作中面臨一場惡夢。一位負責我將在下面描述的內容的同事將這項職責交給了我,但現在已經離開了公司。我沒有做這些事情的經驗。請原諒我缺乏知識和長問題 - 我不確定要包含/省略哪些資訊。
背景
我們從第三方獲取一些數據,這些數據被發送到 postgres 伺服器,然後帶入 Linux 伺服器,其中一些 shell 腳本進行一些轉換。然後將資料集組合起來,然後將其發送到我們使用的資料分析工具。該過程使用 cron 自動化。
然而,每年,我們都需要手動更新Linux伺服器上的一些元資料csv檔案[這些檔案使用shell腳本與第3方資料結合]。
資料夾結構:
下面是 Linux 伺服器資料夾結構的樣子 [使用 PuTTY 存取]:
- 另一個項目
- 另一個項目
- 我的項目
- 另一個項目
〜/我的專案>
- shell_scripts
- 採購文件
- 元檔案
- 組合文件
〜/元文件>
- 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)
(我們有幾個 Linux cronjobs 使用 python-smbprotocol 複製文件到Windows 伺服器,然後使用 python-pypsrp 在這些 Windows 系統上遠端執行命令。