1초마다 스크린샷을 찍어 서버에 업로드하는 Bash 스크립트

1초마다 스크린샷을 찍어 서버에 업로드하는 Bash 스크립트

운영 체제: Xubuntu

스크린샷을 찍고 결과 파일을 서버에 업로드할 수 있는 bash 스크립트를 만들려고 합니다. 여러 가지 방법을 시도하고 ChatGPT에도 문의했지만 여전히 작동하는 솔루션을 찾을 수 없습니다. 나에게 올바른 방향을 알려줄 수 있나요? 감사해요

이것은 내가 사용하는 코드입니다.

#!/bin/bash

# Set the FTP server hostname or IP address
FTP_SERVER=xxx

# Set the FTP username and password
FTP_USERNAME=xxx
FTP_PASSWORD=xxx


# Set the local and remote file paths
LOCAL_FILE=/home/nicola/screenshot.png
REMOTE_FILE=/public_html/screenshots/screenshot.png

# Connect to the FTP server and log in
ftp -inv $FTP_SERVER << EOF
user $FTP_USERNAME $FTP_PASSWORD

# Send the file
put $LOCAL_FILE $REMOTE_FILE

# Quit
bye
EOF

파일이 올바르게 전송되었으며 이제 매초마다 반복해야 하지만 서버에 대한 연결이 반복되어서는 안 되므로 루프 외부에 있어야 한다고 생각합니다.

파일을 덮어쓰지 않습니다. 날짜나 시간을 사용하여 파일 이름에 추가할 예정입니다.

답변1

  • 시간 접미사를 추가하는 방법은 간단합니다.REMOTE_FILE="/public_html/screenshots/screenshot-$(date +"%Y%m%d_%H%M%S.%N").png"
  • 지속적인 FTP 연결의 경우 CurlFtpFS를 사용해 볼 수 있습니다.

일반적으로 ftp를 사용하는 것은 나쁜 생각입니다. 구식이고 안전하지 않습니다. 원격 서버에 SSH를 통해 연결할 수 있으면 scp 또는 sshfs/rclone을 사용하세요.

장기적인 연결을 유지하는 것은 종종 고통스럽습니다. sshfs 또는 rclone을 사용하더라도 결국 파일 시스템이 정지되는 현상이 발생하게 됩니다. 따라서 스크린샷을 펄스로 전송하는 것이 좋습니다. 이미지를 수집하고 몇 분 동안 캐시한 다음 백그라운드 작업으로 전송을 시작합니다. 예를 들면 다음과 같습니다.

REMOTE_URL="<usr>@<server>:<path>/"
group_size=120
interval=1
# group_id can be the outer loop count
group_id=0
while true
do
  mkdir $group_id
  for _i in $(seq 1 $group_size)
  do
    filename="screenshot-$(date +"%Y%m%d_%H%M%S.%N").png"
    # whatever screenshot command you choose, here I use grim as example
    grim "$group_id/${filename}"
    sleep ${interval}
  done
  # run commands in background: copy all files in current subdir and remove the current dir after job is done.
  (scp "$group_id"/* "${REMOTE_URL}/${filename}" && rm -rf $group_id &)
  # the job is in background, so it won't block next screenshot.
  # you may see several copy jobs in parallel; if your network is slow.
  ((group_id++));
done

관련 정보