需求背景
最近采购了一批摄像头,对摄像头进行了拍照设置,每2s一张图片,图片存储到远端设备上的,但是需要对图像进行训练,要将图片传到标记服务器和训练服务器,因此写了这个代码。
应该还可以继续完善,但是能解决目前的问题。
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)
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)