精通Linux系列二十四:如何在多台机器之间高效传输文件?
点击关注公众号,AI&编程干货及时送达
命令 | 含义 |
ssh | 安全地登录到远程主机,或在其上运行命令。 |
scp | 安全地将文件复制到/从远程主机(批处理)。 |
sftp | 安全地将文件复制到/从远程主机(交互式)。 |
ftp | 将文件复制到/从远程主机(交互式,不安全!)。 |
netcat | 创建任意网络连接。 |
在 Linux 中,从一台机器到另一台机器建立网络连接进行远程登录和文件传输是很方便的。
ssh
stdin stdout - 文件 -- opt --help --version
ssh [options] host [command]
ssh
程序可以安全地将你登录到你已经拥有帐户的远程机器上:
→ ssh remote.example.com
或者,它可以在那个远程机器上调用一个程序,而不需要你登录:
→ ssh remote.example.com who
ssh
加密所有穿越其连接的数据,包括你的用户名和密码(你需要用它来访问远程机器)。SSH 协议也支持其他的认证方式,例如公钥和主机ID。查看 man sshd
了解详情。
有用的选项
-l user | 指定你的远程用户名;否则,ssh 会假设你的本地用户名。你也可以使用 username @host 的语法:→ ssh smith@server.example.com ` |
-p port | 使用一个与默认(22)不同的 port 号。 |
-t | 在远程系统上分配一个 tty;当尝试运行一个具有交互式用户界面的远程命令(例如一个文本编辑器)时很有用。 |
-v | 生成详细的输出,对于调试很有用。 |
scp
stdin stdout - 文件 -- opt --help --version
scp local_spec remote_spec
scp
(安全拷贝)命令在批处理中从一台计算机到另一台计算机复制文件和目录。(对于交互式用户界面,请看 sftp
。)它加密了两台机器之间的所有通信。作为一个简单的例子,scp
可以将一个本地文件复制到远程机器:
→ scp myfile remote.example.com:newfile
递归地将一个目录复制到远程机器:
→ scp -r mydir remote.example.com:
将远程文件复制到你的本地机器:
→ scp remote.example.com:myfile .
或者递归地将一个远程目录复制到你的本地机器:
→ scp -r remote.example.com:mydir .
要在远程系统上指定一个替代用户名,使用 username
@host
语法:
→ scp myfile smith@remote.example.com:
有用的选项
-p | 在复制时复制所有文件属性(权限,时间戳)。 |
-r | 递归地复制一个目录及其内容。 |
-v | 生成详细的输出,对于调试很有用。 |
sftp
stdin stdout - 文件 -- opt --help --version
sftp (host username@host)
sftp
程序在两台计算机之间交互式地安全地复制文件。(与 scp
相反,后者是在批处理中复制文件。)用户界面很像 ftp
,但 ftp
不是安全的:
→ sftp remote.example.com
密码: ********
sftp> cd MyFiles
sftp> ls
README
file1
file2
file3
sftp> get file2
Fetching /home/smith/MyFiles/file2 to file2
sftp> quit
如果你在远程系统上的用户名与本地的不同,使用 username
@host
参数:
→ sftp smith@remote.example.com
Command | Meaning |
help | 查看可用命令的列表。 |
ls | 列出当前远程目录中的文件。 |
lls | 列出当前本地目录中的文件。 |
pwd | 打印远程工作目录。 |
lpwd | 打印本地工作目录。 |
cd dir | 将你的远程目录更改为 *dir *。 |
lcd dir | 将你的本地目录更改为 *dir *。 |
get file1 [file2 ] | 将远程 *file1 *复制到本地机器,可选地重命名为 *file2 *。 |
put file1 [file2 ] | 将本地 file1 复制到远程机器,可选地重命名为 *file2 *。 |
mget file * | 使用通配符 * 和 ? 将多个远程文件复制到本地机器。 |
mput file * | 使用通配符 * 和 ? 将多个本地文件复制到远程机器。 |
quit | 退出 sftp 。 |
ftp
stdin stdout - file -- opt --help --version
ftp [选项] 主机
ftp
(文件传输协议)程序在计算机之间复制文件,但并不安全:您的用户名和密码以纯文本形式在网络上传输。如果您的远程服务器支持,使用 sftp
代替。
我们为 sftp
列出的相同命令也适用于 ftp
。
netcat
stdin stdout - file -- opt --help --version
netcat [选项] [目标] [端口]
nc [选项] [目标] [端口]
netcat
,或者等效地,nc
,是一个通用的网络连接工具。它对于调试、学习网络知识以及许多其他用途非常方便。例如,netcat
可以直接与任何TCP或UDP服务通信,比如在本地TCP端口22上的SSH服务器:
→ netcat localhost 22
SSH-2.0-OpenSSH_6.9p1 Ubuntu-2ubuntu0.1
^C
这个特性非常有用,可以确定特定服务是启动还是关闭,也可以使用 /etc/services 中列出的服务名称。例如,您可以连接到Google的Web服务(端口80):
→ netcat www.google.com http
xxx 输入一些无用的内容然后按回车
HTTP/1.0 400 Bad Request
Content-Type: text/html; charset=UTF-8
Content-Length: 1555
Date: Fri, 04 Mar 2016 02:17:37 GMT
...
如果您是一个老派的Linux用户,也许会使用 telnet
来连接任意的TCP端口。但是 netcat
更加灵活。例如,使用两个终端窗口,您可以创建一个客户端和一个服务端,并让它们彼此通信。在一个窗口中启动一个在端口55555上监听的服务:
→ netcat -l 55555
然后在另一个窗口中,运行一个客户端与同一端口通信,并输入一条消息:
→ netcat localhost 55555
Hello world, how are you?
您的消息会被发送到您的服务端,它将打印出“Hello world, how are you?”以及您输入的任何后续行。按 ^D
来关闭连接。
有用的选项
-u | 建立UDP连接,而不是TCP连接。 |
-l | 在给定端口上监听连接。 |
-p * N* | 使用端口 N 作为源端口。 |
-w * N* | 在 N 秒后超时。 |
-h | 获取帮助信息。 |
推荐阅读
你好,我是拾叁,7年开发老司机、互联网两年外企5年。怼得过阿三老美,也被PR comments搞崩溃过。这些年我打过工,创过业,接过私活,也混过upwork。赚过钱也亏过钱。一路过来,给我最深的感受就是不管学什么,一定要不断学习。只要你能坚持下来,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯和编程知识,帮你积累弯道超车的资本。