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