天天看点

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)
           

继续阅读