オペレーティングシステム: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