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

関連情報