网络传输
网络的最重要的一个作用就是实现文件的一个传输共享,本文将要介绍的是可以在Linux终端上使用的文件传输命令,利用这些工具可以在网络中方便的实现共享文件。
名词解释
FTP
介绍
FTP
(File Transfer Protocol): 是 TCP/IP 网络上两台计算机传送文件的协议,FTP 是在 TCP/IP 网络和 INTERNET 上最早使用的协议之一,它属于网络协议组的应用层。
FTP 客户机可以给服务器发出命令来下载文件,上载文件,创建或改变服务器上的目录。相比于 HTTP,FTP 协议要复杂得多。复杂的原因,是因为 FTP 协议要用到两个 TCP 连接:
- 一个是命令链路,用来在 FTP 客户端与服务器之间传递命令;
- 另一个是数据链路,用来上传或下载数据。
FTP 是基于 TCP 协议的,因此 iptables 防火墙设置中只需要放开指定端口(21 + PASV 端口范围)的 TCP 协议即可。
工作模式
PORT(主动)方式的连接过程是:
- 客户端向服务器的 FTP 端口(默认是 21)发送连接请求,服务器接受连接,建立一条命令链路。
- 当需要传送数据时,客户端在命令链路上用 PORT 命令告诉服务器:“我打开了一个 1024 + 的随机端口,你过来连接我”。
- 于是服务器从 20 端口向客户端的 1024 + 随机端口发送连接请求,建立一条数据链路来传送数据。
PASV(Passive 被动)方式的连接过程是:
- 客户端向服务器的 FTP 端口(默认是 21)发送连接请求,服务器接受连接,建立一条命令链路。
- 当需要传送数据时,服务器在命令链路上用 PASV 命令告诉客户端:“我打开了一个 1024 + 的随机端口,你过来连接我”。
- 于是客户端向服务器的指定端口发送连接请求,建立一条数据链路来传送数据。
PORT 方式,服务器会主动连接客户端的指定端口,那么如果客户端通过代理服务器链接到 internet 上的网络的话,服务器端可能会连接不到客户端本机指定的端口,或者被客户端、代理服务器防火墙阻塞了连接,导致连接失败
PASV 方式,服务器端防火墙除了要放开 21 端口外,还要放开 PASV 配置指定的端口范围
SFTP
SFTP
(Secure File Transfer Protocol):安全文件传送协议。
可以为传输文件提供一种安全的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。
SFTP 为 SSH 的一部份,是一种传输文件到服务器的安全方式。
在 SSH 软件包中,已经包含了一个叫作 SFTP的安全文件传输子系统,SFTP 本身没有单独的守护进程,它必须使用 sshd 守护进程(端口号默认是 22)来完成相应的连接操作,所以从某种意义上来说,SFTP 并不像一个服务器程序,而更像是一个客户端程序。
SFTP 同样是使用加密传输认证信息和传输的数据,所以,使用 SFTP 是非常安全的。
但是,由于这种传输方式使用了加密 / 解密技术,所以传输效率比普通的 FTP 要低得多,如果您对网络安全性要求更高时,可以使用 SFTP 代替 FTP。
SCP
SCP
(Secure Copy):scp 就是 secure copy
,是用来进行远程文件复制的,并且整个复制过程是加密的。数据传输使用 ssh,并且和使用和 ssh 相同的认证方式,提供相同的安全保证。
FTP & SCP/SFTP 比较:
- sftp/scp 传输协议是采用加密方式来传输数据的。
- ftp 一般来说允许明文传输,当然现在也有带 SSL 的加密 ftp,有些服务器软件也可以设置成 “只允许加密连接”,但是毕竟不是默认设置需要我们手工调整,而且很多用户都会忽略这个设置。
- 普通 ftp 仅使用端口 21 作为命令传输,由服务器和客户端协商另外一个随机端口来进行数据传送。在 pasv 模式下,服务器端需要侦听另一个端口。假如服务器在路由器或者防火墙后面,端口映射会比较麻烦,因为无法提前知道数据端口编号,无法映射。
- 当你的网络中还有一些 unix 系统的机器时,在它们上面自带了 scp/sftp 等客户端,不用再安装其它软件来实现传输目的。
- scp/sftp 属于开源协议,我们可以免费使用不像 FTP 那样使用上存在安全或版权问题。
- 所有 scp/sftp 传输软件(服务器端和客户端)均免费并开源,方便我们开发各种扩展插件和应用组件。
**小提示:**当然在提供安全传输的前提下 sftp 还是存在一些不足的,例如: 他的帐号访问权限是严格遵照系统用户实现的,只有将该帐户添加为操作系统某用户才能够保证其可以正常登录 sftp 服务器
SSH
SSH
(Secure Shell):由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。
SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
SSH 是由客户端和服务端的软件组成的:
服务端是一个守护进程 (daemon),他在后台运行并响应来自客户端的连接请求。
服务端一般是 sshd 进程,提供了对远程连接的处理,一般包括公共密钥认证、密钥交换、对称密钥加密和非安全连接;
客户端包含 ssh 程序以及像 scp(远程拷贝)、slogin(远程登陆)、sftp(安全文件传输)等其他的应用程序。从客户端来看,SSH 提供两种级别的安全验证:
- 第一种级别(基于口令的安全验证)
- 第二种级别(基于密匙的安全验证)
SSH 主要有三部分组成: 传输层协议 [SSH-TRANS
] ;用户认证协议 [SSH-USERAUTH
] ;连接协议 [SSH-CONNECT
]。
OpenSSH
OpenSSH
: 是 SSH(Secure SHell)协议的免费开源实现。
SSH 协议族可以用来进行远程控制,或在计算机之间传送文件。
而实现此功能的传统方式,如 telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh 都是极为不安全的,并且会使用明文传送密码。
OpenSSH 提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程的中的数据,并由此来代替原来的类似服务。
OpenSSH 是使用 SSH 透过计算机网络加密通讯的实现。它是取代由 SSH Communications Security
所提供的商用版本的开放源代码方案。
目前 OpenSSH 是 OpenBSD 的子计划。OpenSSH 常常被误认以为与 OpenSSL 有关联,但实际上这两个计划的有不同的目的,不同的发展团队,名称相近只是因为两者有同样的软件发展目标──提供开放源代码的加密通讯软件。
操作命令
ssh
安装ssh-server
此处环境以
Ubuntu18.04
为例
- 修改镜像源为中科大镜像
sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
- 升级镜像源
apt update
- 安装
openssh-server
、vim
apt install openssh-server vim -y
设置密码
由于SSH
使用的就是账号的登录密码,所以不存在单独的SSH
密码。如果你需要修改SSH
远程登录密码,需要修改这台服务器的账号的登录密码。
$ passwd
Enter new UNIX password: # 输入新密码
Retype new UNIX password: # 输入确认密码
passwd: password updated successfully # 密码设置成功
修改配置项
- 打开
ssh
客户端配置文件/etc/ssh/ssh_config
,修改ssh
客户端配置
去掉
PasswordAuthentication yes
前面的#
号,保存退出
Host *
# ForwardAgent no
# ForwardX11 no
# ForwardX11Trusted yes
PasswordAuthentication yes # 允许客户端使用密码登录
# HostbasedAuthentication no
# GSSAPIAuthentication no
# GSSAPIDelegateCredentials no
# GSSAPIKeyExchange no
- 打开
ssh
服务器配置文件/etc/ssh/sshd_config
,修改ssh
服务器配置
把
PermitRootLogin prohibit-password
改成PermitRootLogin yes
,保存退出
#LoginGraceTime 2m
#PermitRootLogin prohibit-password
PermitRootLogin yes # 允许以root用户登录
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
去掉
PubkeyAuthentication yes
前面的#
号; 去掉AuthorizedKeysFile
前面的#
号,保存退出
PubkeyAuthentication yes # 打开该配置,允许使用密钥验证
AuthorizedKeysFile .ssh/authorized_keys # 指明公钥位置,多个公钥,可以在文件末尾追加
- 重启ssh服务
/etc/init.d/ssh start
- 查看服务是否开启
$ ps -e | grep ssh
在vi的命令模式下
/关键词
即可实现搜索效果
密码登录
在上一步中,服务器端已经配置过
ssh
服务端,现在就可以在本地电脑上,使用ssh
客户端链接远程的服务器
$ ssh root@192.168.1.9 -p 2222 # ssh服务的端口号默认是22,如果不是,就需要使用 -p 指明
命令执行完成后,会提示输入密码,注意: 密码是远程服务器的密码,也就是上一步最后设置的密码
密钥登录
此时每次链接远程服务都需要输入密码,比较麻烦;可以通过公钥验证身份
制作密钥对
首先在客户端执行如下命令, 制作密钥对。
[root@host ~]$ ssh-keygen # <== 建立密钥对
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): # <== 按 Enter
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): # <== 输入密钥锁码,或直接按 Enter 留空
Enter same passphrase again: # <== 再输入一遍密钥锁码
Your identification has been saved in /root/.ssh/id_rsa. # <== 私钥
Your public key has been saved in /root/.ssh/id_rsa.pub. # <== 公钥
The key fingerprint is:
0f:d3:e7:1a:1c:bd:5c:03:f1:19:f1:22:df:9b:cc:08 root@host
# 密钥锁码在使用私钥时必须输入,这样就可以保护私钥不被盗用。当然,也可以留空,实现无密码登录。
# 现在,在 root 用户的家目录中生成了一个 .ssh 的隐藏目录,内含两个密钥文件。id_rsa 为私钥,id_rsa.pub 为公钥。
上传公钥到服务器
方法一(推荐)
直接将公钥内容添加到服务器的 授权密钥文件~/.ssh/authorized_keys
中
$ ssh-copy-id -p 22 -i ~/.ssh/id_rsa.pub root@192.168.1.9
执行命令了会要求输入远程机器的密码,输入密码即可。
注:ssh-copy-id
默认端口是22,如果您的SSH端口不是22,也就是远程服务器端口修改成其他的了,那就要得加上 -p
+端口。
方法二
先在客户端使用scp
命令将公钥文件上传至服务器
$ scp ~/.ssh/id_rsa.pub root@192.168.1.9:~/.ssh/
使用密码登录服务器
$ ssh -p 22 root@192.168.1.9
在服务器将公钥文件添加到授权密钥文件~/.ssh/authorized_keys
中
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
登录服务器
$ ssh root@192.168.1.9
scp
本地文件复制到远程服务器, **当远程ssh服务的端口不是22,通过
-P
** 指明
# scp -P 端口 本地文件地址 用户名@远程服务器地址:/文件路径
# 注意:远程服务器的文件路径必须存在
scp -P 2222 ~/.ssh/id_rsa.pub root@127.0.0.1:/root/.ssh/authorized_keys
将本地公钥 复制到远程服务器上, 此时在复制时,还需要 输入root用户的密码
复制成功,之后的所有操作 就可以通过密钥实现验证,不需要再输入密码
将远程服务器文件复制到本地
# scp -P 端口 用户名@远程服务器地址:/文件路径 本地路径
scp -P 2222 root@127.0.0.1:/root/.ssh/authorized_keys ~/Documents
sftp
链接远程服务器
# sftp user@ip, 当远程ssh服务的端口不是22,通过 -P 指明
sftp -P 2222 root@127.0.0.1
执行命令,进入交互环境
sftp>
以下命令都是在交互环境下执行
- 查看帮助信息
sftp> help # 执行help, 可以看看sftp支持哪些命令。
- 查看路径
sftp> pwd # 查看远程服务器的当前路径
Remote working directory: /root
sftp> lpwd # 查看本地的当前路径
Local working directory: /Users/lsf/Documents
- 查看目录下的文件信息
sftp> ls # 查看远程服务器当前目录下的文件列表
authorized_keys id_rsa.pub
sftp> lls # 查看本地电脑当前目录下的文件列表
$RECYCLE.BIN GitNote gitbook hexo
- 下载文件
# 下载远程服务器的文件 到本地
sftp> get id_rsa.pub /Users/lsf/Documents
Fetching /root/.ssh/id_rsa.pub to /Users/lsf/Documents/id_rsa.pub
/root/.ssh/id_rsa.pub 100% 575 213.3KB/s 00:00
# 下载远程服务器的 .ssh 文件夹 到 本地目录, 需要参数 -r
sftp> get -r .ssh/ /Users/lsf/Documents
Fetching /root/.ssh/ to /Users/lsf/Documents/.ssh
Retrieving /root/.ssh
/root/.ssh/authorized_keys 100% 575 262.3KB/s 00:00
/root/.ssh/id_rsa.pub
- 上传文件
# 上传 本地文件到 远程服务器的当前目录
sftp> put random.html .
Uploading random.html to /root/.ssh/./random.html
random.html
# 上传 本地文件夹到 远程服务器的当前目录,需要参数 -r
sftp> put -r GitNote .
Uploading GitNote/ to /root/.ssh/./GitNote
Entering GitNote/
Entering GitNote/Note
GitNote/Note/Shadowsocks配置.md 100% 1107 1.0MB/s 00:00
GitNote/Note/Docker镜像配置.md 100% 84 66.4KB/s 00:00
command
, 此时命令都是在 远程服务器执行
sftp> rm id_rsa.pub
Removing /root/.ssh/id_rsa.pub
sftp> mkdir upload
sftp> ls
GitNote authorized_keys random.html upload
!command
, 此时命令是在本地电脑上执行
sftp> !ls
$RECYCLE.BIN GitNote authorized_keys desktop.ini gitbook
sftp> !rm authorized_keys
sftp> !ls
$RECYCLE.BIN GitNote desktop.ini gitbook
sftp> lls
$RECYCLE.BIN GitNote desktop.ini gitbook
- 退出命令:
exit
、bye
、quit``quit