天天看點

Mac|Windows系統本地照片自動上傳到伺服器

作者:蜜蜂攻城獅

需求背景

最近采購了一批攝像頭,對攝像頭進行了拍照設定,每2s一張圖檔,圖檔存儲到遠端裝置上的,但是需要對圖像進行訓練,要将圖檔傳到标記伺服器和訓練伺服器,是以寫了這個代碼。

Mac|Windows系統本地照片自動上傳到伺服器

應該還可以繼續完善,但是能解決目前的問題。

Mac|Windows系統本地照片自動上傳到伺服器

mac系統使用下面的代碼

import os
import time
import subprocess
"""
執行該腳本前,記得先和伺服器進行通信,并将本地的密鑰上傳到伺服器。具體操作ruxia
首先,打開終端或指令行界面。
使用SSH連接配接到你的伺服器。如果是第一次連接配接,SSH會詢問你是否信任該伺服器的主機密鑰,輸入"yes"确認并儲存主機密鑰。
ssh user@your_server_ip
ssh-keygen -t rsa
ssh-copy-id user@your_server_ip
替換"user"為你的伺服器使用者名,"your_server_ip"為伺服器的IP位址或主機名。
"""

def get_uploaded_files(server_address, server_folder):
    # 使用ssh指令擷取伺服器上已經上傳的檔案清單
    try:
        result = subprocess.run(['ssh', server_address, f'ls {server_folder}'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
        if result.returncode == 0:
            return result.stdout.splitlines()
    except Exception as e:
        pass
    return []

def upload_images(local_folder, server_folder, server_address):
    # 連接配接伺服器
    ssh_command = ['ssh', server_address]

    uploaded_files = set(get_uploaded_files(server_address, server_folder))

    while True:
        # 擷取本地檔案夾内所有檔案
        files = os.listdir(local_folder)

        for file in files:
            if file.lower().endswith(('.jpg', '.png', '.gif', '.jpeg', 'cr2')):  # 檢查是否是圖檔檔案
                local_path = os.path.join(local_folder, file)
                server_path = f"{server_address}:{server_folder}"

                # 檢查檔案是否已經上傳
                if file not in uploaded_files:
                    # 使用rsync指令上傳檔案
                    try:
                        subprocess.run(['rsync', '-avz', local_path, server_path])
                        print(f"Uploaded {file} to server.")
                        # 設定單個檔案的所有權和權限
                        subprocess.run(ssh_command + [f'chown root:root {os.path.join(server_folder, file)}'])
                        subprocess.run(ssh_command + [f'chmod 777 {os.path.join(server_folder, file)}'])
                        print(f"Set ownership and permissions for {file} on server.")
                        # 添加到已上傳檔案清單
                        uploaded_files.add(file)
                    except Exception as e:
                        print(f"Failed to upload {file}: {e}")

        time.sleep(3)  # 3秒後再次掃描本地檔案夾

if __name__ == "__main__":
    local_folder_path = "/Users/mifeng/Pictures"  # 替換為本地檔案夾的路徑
    server_folder_path = "/root/image"  # 替換為伺服器上存儲圖檔的目标路徑
    server_address = "[email protected]"  # 替換為伺服器的位址和登入使用者

    upload_images(local_folder_path, server_folder_path, server_address)
           
Mac|Windows系統本地照片自動上傳到伺服器

windows系統使用下面代碼

import os
import time
import paramiko
"""
執行該腳本前,記得先和伺服器進行通行,并将本地的密鑰上傳到伺服器。具體操作ruxia
首先,打開終端或指令行界面。
使用SSH連接配接到你的伺服器。如果是第一次連接配接,SSH會詢問你是否信任該伺服器的主機密鑰,輸入"yes"确認并儲存主機密鑰。
ssh user@your_server_ip
ssh-keygen -t rsa
ssh-copy-id user@your_server_ip
替換"user"為你的伺服器使用者名,"your_server_ip"為伺服器的IP位址或主機名。
"""


def get_uploaded_files(ssh, server_folder):
    # 使用ssh指令擷取伺服器上已經上傳的檔案清單
    try:
        stdin, stdout, stderr = ssh.exec_command(f'ls {server_folder}')
        return stdout.read().decode().splitlines()
    except Exception as e:
        pass
    return []

def upload_images(local_folder, server_folder, server_address, username, password):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    ssh.connect(server_address, username=username, password=password)
    sftp = ssh.open_sftp()

    uploaded_files = set(get_uploaded_files(ssh, server_folder))

    while True:
        # 擷取本地檔案夾内所有檔案
        files = os.listdir(local_folder)

        for file in files:
            if file.lower().endswith(('.jpg', '.png', '.gif', '.jpeg', 'cr2')):  # 檢查是否是圖檔檔案
                local_path = os.path.join(local_folder, file)

                # 檢查檔案是否已經上傳
                if file not in uploaded_files:
                    # 使用paramiko上傳檔案
                    try:
                        sftp.put(local_path, os.path.join(server_folder, file))
                        print(f"Uploaded {file} to server.")
                        # 設定單個檔案的所有權和權限
                        ssh.exec_command(f'chown root:root {os.path.join(server_folder, file)}')
                        ssh.exec_command(f'chmod 777 {os.path.join(server_folder, file)}')
                        print(f"Set ownership and permissions for {file} on server.")
                        # 添加到已上傳檔案清單
                        uploaded_files.add(file)
                    except Exception as e:
                        print(f"Failed to upload {file}: {e}")

        time.sleep(3)  # 3秒後再次掃描本地檔案夾

if __name__ == "__main__":
    local_folder_path = "/path/to/local/folder"  # 替換為本地檔案夾的路徑
    server_folder_path = "/root/image"  # 替換為伺服器上存儲圖檔的目标路徑
    server_address = "192.168.3.30"  # 替換為伺服器的IP位址
    username = "your_username"  # 替換為伺服器的登入使用者名
    password = "your_password"  # 替換為伺服器的登入密碼

    upload_images(local_folder_path, server_folder_path, server_address, username, password)
           

繼續閱讀