备份一个 3G 的项目目录到备份机,敲了句 scp backup.zip 一路顺畅,换成目录就报 not a regular file,才知道目录得加 -r。scp -r 就是递归拷贝,整个目录连子目录一层不落地端过去。

标准写法就一行

scp -r /data/project root@192.168.1.20:/data/backup/

方向反过来就从远程拉到本机:源写远程路径,目标写本地。远端 SSH 端口改过的话加个大写 -P 2222,注意 scp 里大写 P 是端口,小写 p 是保留时间戳,和 ssh 正好相反,混过的都懂。

传一半断了怎么办

scp 不支持断点续传,跨公网传大目录容易前功尽弃。这种场景换 rsync,命令格式几乎一样:rsync -avz /data/project root@192.168.1.20:/data/backup/,断了重跑还能接着传,只同步有差异的部分。内网小目录随手 scp -r 最省事,没必要为此多装东西。

三个高频报错

  • Permission denied (publickey):目标机没开密码登录,先 ssh-copy-id 把公钥送过去。
  • not a regular file:源是目录却没加 -r,补上就好。
  • No such file or directory:目标路径不存在,scp 不会自动建目录,先 ssh 过去 mkdir。

提醒一句:scp 走 ssh 通道,密钥或密码认证都行;-r 覆盖目标同名目录时不问一声,重要数据先做快照再传,别拿生产目录练手。