[远程文件拷贝 | qxdn 的乐园](https://qianxu.run/2021/11/02/remote-copy/)

实验室分配了服务器,有必要了解以下远程数据的拷贝
封面《月に寄りそう乙女の作法》

前言

向实验室申请了一个服务器准备炼丹,第一步暂时打算先上传数据集。对服务器上文件的远程拷贝只用过 VNC 和 vscode。vscode 在打开服务器中含有较多文件的目录容易卡死,且拷贝文件的进度也不容易观察,只能通过当前的网速进行判断。VNC 只拷贝过一些小型文件,但是个人猜测对大文件的传输也不太行。因此有必要了解一下 linux 自带的 scp 命令。

scp

scp 命令是 secure copy 的缩写,是一个远程文件拷贝命令。

语法

对于这种命令通过 man 命令可以查看其详细的文档。man scp

BASH
1
2
scp [-12346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] 
[-S program] [[user@]host1:]file1 ... [[user@]host2:]file2

参数说明

  • -1: 强制使用 ssh1
  • -2: 强制使用 ssh2
  • -3: 通过本地 host 传输两个远程服务器直接的拷贝。如果没有该选项,将会直接在两个远程服务器之间拷贝。
  • -4: 强制 scp 只使用 ipv4
  • -6: 强制 scp 只是用 ipv6
  • -B: 选择批次模式(不使用密码或者密钥)
  • -C: 开启压缩模式
  • -c cipher: 以 cipher 将数据传输进行加密,这个选项将直接传递给 ssh
  • -F ssh_config: 指定一个替代的 ssh 配置文件,此参数直接传递给 ssh
  • -i identity_file: 从指定文件中读取传输时使用的密钥文件,此参数直接传递给 ssh
  • -l limit: 带宽限制,单位 Kbit/s
  • -o ssh_option: 传输可选项到 ssh 中,并没有 scp flag
  • -P: 指定远程服务器的端口,注意大写 P,因为小写已经被使用了
  • -p: 保留原始文件的修改时间,访问时间和访问权限
  • -q: 安静模式,不显示进度条
  • -r: 递归拷贝整个文件夹
  • -S program: 指定加密传输时所使用的程序。此程序必须能够理解 ssh (1) 的选项
  • -v: 详细模式

实例

废话说了一堆不如直接上手写测试

本地复制文件到远程

BASH
1
2
3
scp local_file remote_username@remote_ip:remote_folder 
# or 
scp local_file remote_username@remote_ip:remote_file 

本地目录复制到远程

BASH
1
scp -r local_folder remote_username@remote_ip:remote_folder 

远程文件复制到本地

BASH
1
2
3
scp remote_username@remote_ip:remote_file local_file
# or 
scp remote_username@remote_ip:remote_file local_folder 

远程目录复制到本地

BASH
1
scp -r remote_username@remote_ip:remote_folder local_folder 

sftp

在看 scp 命令文档的适合发现了里面有写 sftp (secure file transfer program)。出于好奇,便查询一下 sftp 的使用方法。

语法

BASH
1
2
3
4
5
6
sftp [-1246aCfpqrv] [-B buffer_size] [-b batchfile] [-c cipher] [-D sftp_server_path] [-F ssh_config]
          [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-R num_requests] [-S program]
          [-s subsystem | sftp_server] host
sftp [user@]host[:file ...]
sftp [user@]host[:dir[/]]
sftp -b batchfile [user@]host

许多参数与 scp 类似这里不再多说

实例

连接

BASH
1
sftp -P port user@ip

获取远程文件

BASH
1
2
3
sftp> get remoteFile
sftp> get remoteFile localFile
sftp> get -r someDirectory

上传本地文件

BASH
1
2
3
sftp> put localFile
sftp> get localFile remoteFile
sftp> put -r localDirectory

参考资料

Linux scp 命令
How To Use SFTP to Securely Transfer Files with a Remote Server