ssh 영상 업로드

김민준·2025년 5월 13일

🚗 Jetson → WSL2 서버로 영상 자동 업로드 시스템 구축기 (Tailscale + SSH 키 기반)

📌 목표

Jetson에서 영상 녹화 후, 메인 서버(WSL2)로 자동 전송하여 학습/저장에 활용

  • Jetson: 영상 녹화 및 업로드 스크립트 실행
  • 메인 서버 (WSL2): 영상 수신 및 저장
  • Tailscale을 이용한 장치 간 VPN 구성
  • SSH 키 기반 인증 + scp 업로드 자동화

✅ 전체 아키텍처

[Jetson (ARM)] ── Tailscale VPN ──> [WSL2 Ubuntu (x86_64)]
     🎥 녹화                       📥 SSH로 파일 수신
     📤 scp 업로드

1️⃣ 환경 준비

✅ Jetson (Ubuntu 기반)

sudo apt update
sudo apt install python3-opencv openssh-client
  • Tailscale 설치:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscaled
sudo tailscale up

✅ WSL2 (Ubuntu 22.04)

sudo apt update
sudo apt install openssh-server
sudo service ssh start
  • Tailscale 설치 및 연결:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscaled
sudo tailscale up

🔸 Tailscale IP 확인:

tailscale ip -4

2️⃣ SSH 키 설정 (Jetson → WSL2 접속용)

✅ Jetson에서 SSH 키 생성

ssh-keygen -m PEM -t rsa -b 3072
  • 경로: /home/hi/.ssh/id_rsa

✅ 공개키를 메인PC(WSL2)에 등록

ssh-copy-id hi@<WSL2_TAILSCALE_IP>

또는 수동:

cat ~/.ssh/id_rsa.pub
# 복사해서 WSL2의 ~/.ssh/authorized_keys 에 붙여넣기
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

3️⃣ Python 자동 녹화 및 업로드 스크립트 (Jetson)

🔧 upload_video.py

#!/usr/bin/env python3
import cv2, time, subprocess
from datetime import datetime
from pathlib import Path

def record_video(duration_sec=10, width=640, height=480, fps=20, dev='/dev/video4'):
    cap = cv2.VideoCapture(dev)
    if not cap.isOpened():
        raise RuntimeError(f"Camera {dev} not accessible")

    cap.set(cv2.CAP_PROP_FRAME_WIDTH,  width)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)

    filename = datetime.now().strftime("vid_%Y%m%d_%H%M%S.mp4")
    out = cv2.VideoWriter(filename, cv2.VideoWriter_fourcc(*'mp4v'), fps, (width, height))

    start = time.time()
    while time.time() - start < duration_sec:
        ret, frame = cap.read()
        if ret: out.write(frame)

    cap.release(); out.release()
    return Path(filename)

def upload_to_server(file_path, user="hi", server_ip="100.79.185.26", remote_dir="/home/hi/container_train_videos"):
    try:
        cmd = ["scp", "-i", "/home/hi/.ssh/id_rsa", str(file_path), f"{user}@{server_ip}:{remote_dir}"]
        result = subprocess.run(cmd, check=True)
        print(f"✅ SCP upload success: {file_path.name}")
    except subprocess.CalledProcessError as e:
        print(f"❌ SCP upload failed with return code {e.returncode}")

if __name__ == "__main__":
    try:
        video_path = record_video()
        upload_to_server(video_path)
        video_path.unlink(missing_ok=True)  # 업로드 후 파일 삭제 (선택)
    except Exception as e:
        print(f"❌ Error: {e}")

🎥 녹화된 영상은 vid_2025XXXX_XXXXXX.mp4 형식으로 저장 후 업로드됩니다.


4️⃣ 사용법

Jetson에서 다음으로 실행:

python3 upload_video.py
  • 10초간 녹화 후
  • WSL2 서버에 자동 업로드
  • 성공 메시지 출력

✅ 결과 예시

✅ SCP upload success: vid_20250513_102233.mp4

WSL2 서버의 /home/hi/container_train_videos/ 디렉토리에 영상이 저장됨


📌 추가 개선 아이디어

  • systemd or cron을 이용한 정기 실행
  • watchdog or ROS 노드로 통합하여 센서/이벤트 기반 자동 녹화
  • 녹화 후 영상 분석 모델 학습 자동화 → CI/CD로 다시 Jetson에 배포

🧾 참고 사항

항목내용
통신 방식SSH over Tailscale
인증 방식RSA 키 기반 (PEM 형식)
Python 라이브러리cv2, subprocess, datetime, pathlib

profile
지금까지 해온 여러 활동들을 간략하게라도 정리해보고자 합니다.

0개의 댓글