Bash 脚本每 1 秒截取一次屏幕截图并将其上传到服务器

Bash 脚本每 1 秒截取一次屏幕截图并将其上传到服务器

操作系统: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

相关内容