需求背景
最近采購了一批攝像頭,對攝像頭進行了拍照設定,每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)