Linux系统中,如何通过命令scp/rsync来实现文件跨服务器之间的传输, 以及注意事项有哪些?全网最细!逐步操作一文详解!

为了高效地在两台服务器之间传输文件,最推荐使用 scprsync 命令。

具体使用哪条命令取决于你当前登录在哪台服务器上。

以下是最高效的执行命令(请将命令中的 [用户名] 替换为目标/源服务器的实际登录用户名,例如 rootmypc):

方案一:假设我当前登录在 111.111.111.11 (源服务器)

最直接的方式是从当前服务器“推”过去。

使用 scp (简单快捷):

scp /home/mypc/king/whisper_zh/WhisperLive_zh.tar.gz [用户名]@111.111.111.12:/home/mypc/king/

使用 rsync (推荐,支持断点续传和显示进度):

rsync -avP /home/mypc/king/whisper_zh/WhisperLive_zh.tar.gz [用户名]@111.111.111.12:/home/mypc/king/


方案二:如果你当前登录在 111.111.111.12 (目标服务器)

你可以从目标服务器把文件“拉”过来。

使用 scp:

scp [用户名]@111.111.111.11:/home/mypc/king/whisper_zh/WhisperLive_zh.tar.gz /home/mypc/king/

使用 rsync:

rsync -avP [用户名]@111.111.111.11:/home/mypc/king/whisper_zh/WhisperLive_zh.tar.gz /home/mypc/king/

💡 效率提升小贴士:

  1. **优先使用 rsync -avP**:如果文件较大,网络不稳定时 rsync 可以断点续传(-P 参数),避免因为网络波动导致传输失败从头再来。
  2. 无需额外压缩:因为你的文件已经是 .tar.gz 格式(已经压缩过),所以在传输命令中不要再加 -C(压缩传输)参数,否则反而会消耗 CPU 资源,拖慢传输速度。
  3. 权限确认:执行命令前,请确保目标路径 /home/mypc/king/ 在服务器 111.111.111.12 上已经存在,并且你使用的登录用户有权限响应该目录写入文件。如果目录不存在,可以先在目标服务器执行 mkdir -p /home/mypc/king/


追问:如下这个是算上传成功了吗?那这个key是不是没必要保存,只是一次性的对吗?

(base) mypc@mypc-R4900-G5:~/king/whisper_zh$ rsync -avP /home/mypc/king/whisper_zh/WhisperLive_zh.tar.gz mypc@111.111.111.12:/home/mypc/king

The authenticity of host '111.111.111.12 (111.111.111.12)' can't be established.

ED25519 key fingerprint is SHA256:VU7A5DA168>ASD.+ASD1F68AS949SDFA.

This key is not known by any other names

Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

Warning: Permanently added '111.111.111.12' (ED25519) to the list of known hosts.

mypc@111.111.111.12's password:

sending incremental file list

WhisperLive_zh.tar.gz

     27,300,013 100%  111.61MB/s    0:00:00 (xfr#1, to-chk=0/1)


sent 27,306,798 bytes  received 35 bytes  327,027.94 bytes/sec

total size is 27,300,013  speedup is 1.00

是的,是的,目前文件已经完美上传成功了! 从日志来看,传输非常顺利。日志里的 100% 以及最后的 sent 27,306,798 bytes... speedup is 1.00 都明确表示文件已经完整地传到了目标服务器。

关于你提到的那个 key(密钥指纹),这里有一个需要纠正的小误区

那个 key 不是一次性的,而且你也不需要手动去保存它,系统已经替你自动保存好了

给你简单解释一下刚才发生了什么:

  1. “查户口”机制: 因为你是第一次111.11...11 连接到 111.11...12,底层使用的 SSH 协议不认识这台新服务器,所以它弹出了那段 The authenticity of host... can't be established. 的提示,展示了目标服务器的“身份证号”(ED25519 key fingerprint),问你信不信任这台机器。
  2. 系统自动记录: 当你输入 yes 之后,日志里紧接着有一句 Warning: Permanently added '111.111.111.12' (ED25519) to the list of known hosts.。这就意味着,你的服务器已经把这个 key 永久保存在了本地隐藏文件(通常是 ~/.ssh/known_hosts)里
  3. 以后的便利与安全: 下次你再往 111.111.111.12 传文件时,系统就不会再弹这堆英文问你了,它会直接提示你输入密码。同时,如果哪天目标服务器的“身份证号”突然变了(可能是服务器被重置,也可能是遭遇了网络劫持),系统会立刻报错并阻止你连接,以此来保护你的安全。

总结: 文件传得很成功,那个 key 机制是帮你保驾护航的,系统已经自动帮你记住了,你现在可以放心去 111.111.111.12 服务器的 /home/mypc/king/ 目录下找你的文件了。



追问:如果对于python的(anaconda/miniconda)构建的虚拟环境,也能采用类似【压缩】--> 【rsync传输】 --> 【解压】 操作吗?

说实话,这的确是很符合直觉的。但是:不可行!
直接这样做的会遇到:terminals database is inaccessible 这个报错。

直接把 Conda 虚拟环境打包压缩,然后传到另一台服务器上解压——这种操作在 Conda 里是非常容易“水土不服”的。特别是咱们的路径还发生了变化(从源服务器的 /home/mypcapp/... 变成了目标服务器的 /home/mypc/...)。

⚠️ 为什么直接复制 Conda 环境会出问题?

Conda 环境并不是完全便携的。在创建环境和安装包时,Conda 会在很多脚本(比如 pip)和二进制文件里写死绝对路径

当你把环境直接拷过去后:

  1. clear 命令内部写死了去找原来那个 /home/mypcapp/... 路径下的 terminfo 数据库,结果现在路径变成了 /home/mypc/...,它自然就找不到了。
  2. 更大的隐患:除了 clear 不能用,你接下来极有可能会遇到更头疼的问题。比如用 pip install 安装新包时报错、装到了系统目录里,或者运行某些 Python 脚本时提示找不到解释器(因为脚本开头的 #!/home/mypcapp/.../python 路径已经失效了)。

💡 正确的迁移姿势(建议重做)

虽然有些临时的方案(配置 TERMINFO 环境变量)能当“创可贴”解决眼前清屏的问题,
但为了避免以后跑深度学习代码时出现各种玄学报错,强烈建议你用标准的方法重新迁移这个环境

这里有两种正确且高效的做法:

方案一:导出配置并重新创建(最稳妥,推荐)

如果你的目标服务器(111.111.111.12)有网,这是最好的办法。

  1. 在源服务器 (111.11...11) 上导出环境:
conda activate whisperlive_funasr_zh
conda env export > environment.yml

  1. environment.yml 传给目标服务器:
scp environment.yml mypc@111.111.111.12:/home/mypc/king/

  1. 在目标服务器 (111.11...12) 上重新创建:
conda env create -f environment.yml

方案二:使用 conda-pack 专门打包(适合离线/无网环境)

如果你就是想打包传过去,必须使用专门的 conda-pack 工具,它会在解压时自动帮你修复所有写死的路径

  1. 在源服务器上安装并打包:
conda install -c conda-forge conda-pack
# 将环境打包成 tar.gz
conda pack -n whisperlive_funasr_zh -o whisperlive_env.tar.gz

  1. 传到目标服务器:(用你已经很熟练的 rsync
  2. 在目标服务器上解压并修复路径:
# 创建一个目录存放新环境
mkdir -p ~/miniconda3/envs/whisperlive_funasr_zh  # 替换为你实际的 conda envs 路径
# 解压进去
tar -xzf whisperlive_env.tar.gz -C ~/miniconda3/envs/whisperlive_funasr_zh
# 激活环境
conda activate whisperlive_funasr_zh
# 这一步非常关键:让 conda-pack 修复所有的路径映射!
conda-unpack

总结: 现在的这个环境因为路径写死的问题属于“半残废”状态。长痛不如短痛,我们需要用上面两种正规军的方法重新迁移一下,以绝后患!

posted @ 2026-05-08 15:57  AlphaGeek  阅读(170)  评论(0)    收藏  举报