You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

能否预设未来时间执行scp远程到本地文件传输?含密码场景

如何让scp在未来预设时间自动执行文件传输?

当然可以实现!scp本身没有内置的定时调度功能,但我们可以借助系统自带的定时任务工具(比如cronat)来达成目标,同时得解决passphrase输入的问题——毕竟定时任务运行时没法手动输入密码短语,得先搞定免交互的SSH访问。下面给你几种实用方案:

方案一:用cron实现周期性/单次定时任务(适合类Unix系统)

cron是Linux/Unix系统默认的定时任务管理器,既适合长期重复任务,也能设置单次执行时间。

步骤1:配置免Passphrase的SSH访问(关键)

要让scp自动执行,必须避免手动输入passphrase,最安全的方式是配置SSH密钥登录:

  • 生成无passphrase的密钥对(注意密钥文件权限要设为600):
    ssh-keygen -t ed25519
    
    执行时一路按回车,不要设置passphrase。
  • 将公钥上传到远程服务器的授权列表:
    ssh-copy-id your_username@remote_server_ip
    
    验证一下:执行ssh your_username@remote_server_ip,如果能直接登录,说明配置成功,scp也无需再输入passphrase了。

步骤2:添加定时任务

  • 编辑用户级的cron表:
    crontab -e
    
  • 添加定时规则,比如要在明天14:30将远程日志复制到本地:
    30 14 * * * /usr/bin/scp your_username@remote_server_ip:/path/to/remote/logfile.log /local/save/path/
    
    解释cron的时间格式:分 时 日 月 周*表示匹配任意值。如果是单次任务,把日、月设为具体值即可(比如10月25日14:30就是30 14 25 10 *)。

方案二:用at实现一次性临时定时任务

如果你只需要执行一次定时传输,at命令比cron更简单直接:

步骤1:同样先配置好免Passphrase的SSH访问(同上)

步骤2:创建定时任务

  • 输入命令指定执行时间,比如明天14:30:
    at 14:30 tomorrow
    
  • 此时会进入at的交互模式,输入你的scp命令:
    /usr/bin/scp your_username@remote_server_ip:/path/to/remote/logfile.log /local/save/path/
    
  • Ctrl+D结束输入,任务就会被安排。
  • 查看待执行任务:atq;取消任务:atrm 任务编号

进阶:必须保留Passphrase的情况

如果出于安全考虑不能设置无passphrase的密钥,可以用keychain工具持久化SSH Agent的会话,让定时任务能自动获取密钥:

  1. 安装keychain(以Ubuntu为例):
    sudo apt install keychain
    
  2. 在你的~/.bashrc中添加以下内容,让每次登录时自动加载密钥到Agent:
    eval $(keychain --eval id_ed25519)
    
  3. 然后在cron任务中先加载Agent环境,再执行scp:
    30 14 * * * eval $(keychain --eval id_ed25519) && /usr/bin/scp your_username@remote_server_ip:/path/to/remote/logfile.log /local/save/path/
    

额外建议:根据远程代码执行状态触发传输

如果不确定远程代码的完成时间,与其预估时间定时,不如让远程代码执行完成后主动触发scp传输:

  • 在远程服务器的代码脚本末尾添加scp命令,将日志传到本地(需要把远程服务器的公钥添加到本地的~/.ssh/authorized_keys中,允许远程免密登录本地)。
  • 示例脚本片段:
    # 执行代码逻辑
    python your_script.py
    # 代码执行完成后传输日志
    scp /path/to/logfile.log your_local_username@local_server_ip:/local/save/path/
    

内容的提问来源于stack exchange,提问作者cianmscannell

火山引擎 最新活动