ssh入门

转自阮一峰的ssh教程https://wangdoc.com/ssh/index.html
SSH 是 Linux 系统的登录工具,现在广泛用于服务器登录和各种加密通信。SSH 密钥登录采用的是非对称加密,每个用户通过自己的密钥登录。其中,私钥必须私密保存,不能泄漏;公钥则是公开的,可以对外发送。它们的关系是,公钥和私钥是一一对应的,每一个私钥都有且仅有一个对应的公钥,反之亦然。

如果数据使用公钥加密,那么只有使用对应的私钥才能解密,其他密钥都不行;反过来,如果使用私钥加密(这个过程一般称为“签名”),也只有使用对应的公钥解密。

SSH 密钥登录分为以下的步骤。

预备步骤,客户端通过ssh-keygen生成自己的公钥和私钥。

第一步,手动将客户端的公钥放入远程服务器的指定位置。

第二步,客户端向服务器发起 SSH 登录的请求。

第三步,服务器收到用户 SSH 登录的请求,发送一些随机数据给用户,要求用户证明自己的身份。

第四步,客户端收到服务器发来的数据,使用私钥对数据进行签名,然后再发还给服务器。

第五步,服务器收到客户端发来的加密签名后,使用对应的公钥解密,然后跟原始数据比较。如果一致,就允许用户登录。

密钥登录时,首先需要生成公钥和私钥。OpenSSH提供了一个工具程序ssh-keygen命令,用来生成密钥。

执行ssh-keygen命令以后,会出现第一个问题,询问密钥保存的文件名,默认是~/.ssh/id_dsa文件,这个是私钥的文件名,对应的公钥文件~/.ssh/id_dsa.pub是自动生成的。用户的密钥一般都放在主目录的.ssh目录里面。

如果选择rsa算法,生成的密钥文件默认就会是~/.ssh/id_rsa(私钥)和~/.ssh/id_rsa.pub(公钥)。

接着,就会是第二个问题,询问是否要为私钥文件设定密码保护(passphrase)。这样的话,即使入侵者拿到私钥,还是需要破解密码。如果为了方便,不想设定密码保护,可以直接按回车键,密码就会为空。后面还会让你再输入一次密码,两次输入必须一致。

最后,就会生成私钥和公钥,屏幕上还会给出公钥的指纹,以及当前的用户名和主机名作为注释,用来识别密钥的来源。

生成密钥以后,建议修改它们的权限,防止其他人读取。更改文件权限一般用chmod命令,格式一般为:

chmod <abc> file...

在这种使用方式中,首先,我们规定 数字 4 、2 和 1表示读、写、执行权限,即 r=4,w=2,x=1 。此时其他的权限组合也可以用其他的八进制数字表示出来,

如:

rwx = 4 + 2 + 1 = 7

rw = 4 + 2 = 6

rx = 4 +1 = 5

若要同时设置rwx (可读写运行) 权限则将该权限位 设置 为 4 + 2 + 1 = 7

若要同时设置 rw-(可读写不可运行)权限则将该权限位 设置 为 4 + 2 = 6

若要同时设置r-x(可读可运行不可写)权限则将该权限位 设置 为 4 +1 = 5

上面我们提到,每个文件都可以针对三个粒度,设置不同的rwx(读写执行)权限。即我们可以用用三个8进制数字分别表示 拥有者 、群组 、其它组( u、 g 、o)的权限详情,并用chmod直接加三个8进制数字的方式直接改变文件权限。如:

chmod 777 file   #(等价于  chmod u=rwx,g=rwx,o=rwx file 或  chmod a=rwx file)   所有人可读写及执行
chmod 600 file   #(等价于  chmod u=rw,g=---,o=--- file 或 chmod u=rw,go-rwx file )   拥有者可读写,其他人不可读写及执行

生成密钥以后,公钥必须上传到服务器,才能使用公钥登录。

OpenSSH规定,用户公钥保存在服务器的~/.ssh/authorized_keys文件。你要以哪个用户的身份登录到服务器,密钥就必须保存在该用户主目录的~/.ssh/authorized_keys文件。只要把公钥添加到这个文件之中,就相当于公钥上传到服务器了。每个公钥占据一行。如果该文件不存在,可以手动创建。

用户可以手动编辑该文件,把公钥粘贴进去,也可以在本机计算机上,执行下面的命令。

$ cat ~/.ssh/id_rsa.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

上面示例中,user@host要替换成你所要登录的用户名和主机名。

注意,authorized_keys文件的权限要设为644,即只有文件所有者才能写。如果权限设置不对,SSH 服务器可能会拒绝读取该文件。只要公钥上传到服务器,下次登录时,OpenSSH就会自动采用密钥登录,不再提示输入密码。

除了手动cv公钥到服务器,OpenSSH 自带一个ssh-copy-id命令,可以自动将公钥拷贝到远程服务器的~/.ssh/authorized_keys文件。如果~/.ssh/authorized_keys文件不存在,ssh-copy-id命令会自动创建该文件。

用户在本地计算机执行下面的命令,就可以把本地的公钥拷贝到服务器。

$ ssh-copy-id -i key_file user@host

上面命令中,-i参数用来指定公钥文件,user是所要登录的账户名,host是服务器地址。如果省略用户名,默认为当前的本机用户名。执行完该命令,公钥就会拷贝到服务器。ssh-copy-id会采用密码登录,系统会提示输入远程服务器的密码。

注意,ssh-copy-id是直接将公钥添加到authorized_keys文件的末尾。如果authorized_keys文件的末尾不是一个换行符,会导致新的公钥添加到前一个公钥的末尾,两个公钥连在一起,使得它们都无法生效。所以,如果authorized_keys文件已经存在,使用ssh-copy-id命令之前,务必保证authorized_keys文件的末尾是换行符。

私钥设置了密码以后,每次使用都必须输入密码,有时让人感觉非常麻烦。比如,连续使用scp命令远程拷贝文件时,每次都要求输入密码。

ssh-agent命令就是为了解决这个问题而设计的,它让用户在整个 Bash 对话(session)之中,只在第一次使用 SSH 命令时输入密码,然后将私钥保存在内存中,后面都不需要再输入私钥的密码了。

第一步,使用下面的命令新建一次命令行对话。

$ ssh-agent bash

上面命令中,如果你使用的命令行环境不是 Bash,可以用其他的 Shell 命令代替。比如zshfish

如果想在当前对话启用ssh-agent,可以使用下面的命令。

$ eval `ssh-agent`

上面命令中,ssh-agent会先自动在后台运行,并将需要设置的环境变量输出在屏幕上,类似下面这样。

$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-barrett/ssh-22841-agent; export SSH_AUTH_SOCK;
SSH_AGENT_PID=22842; export SSH_AGENT_PID;
echo Agent pid 22842;

eval命令的作用,就是运行上面的ssh-agent命令的输出,设置环境变量。

第二步,在新建的 Shell 对话里面,使用ssh-add命令添加默认的私钥(比如~/.ssh/id_rsa,或~/.ssh/id_dsa,或~/.ssh/id_ecdsa,或~/.ssh/id_ed25519)。

$ ssh-add
Enter passphrase for /home/you/.ssh/id_dsa: ********
Identity added: /home/you/.ssh/id_dsa (/home/you/.ssh/id_dsa)

上面例子中,添加私钥时,会要求输入密码。以后,在这个对话里面再使用密钥时,就不需要输入私钥的密码了,因为私钥已经加载到内存里面了。

如果添加的不是默认私钥,ssh-add命令需要显式指定私钥文件。

$ ssh-add my-other-key-file

上面的命令中,my-other-key-file就是用户指定的私钥文件。

第三步,使用 ssh 命令正常登录远程服务器。

$ ssh remoteHost

上面命令中,remoteHost是远程服务器的地址,ssh 使用的是默认的私钥。这时如果私钥设有密码,ssh 将不再询问密码,而是直接取出内容里面的私钥。

如果要使用其他私钥登录服务器,需要使用 ssh 命令的-i参数指定私钥文件。

$ ssh –i OpenSSHPrivateKey remoteHost

最后,如果要退出ssh-agent,可以直接退出子 Shell(按下Ctrl + d),也可以使用下面的命令。

$ ssh-agent -k

SSH 除了登录服务器,还有一大用途,就是作为加密通信的中介,充当两台服务器之间的通信加密跳板,使得原本不加密的通信变成加密通信。这个功能称为端口转发(port forwarding),又称 SSH 隧道(tunnel)。

端口转发有两个主要作用:

(1)将不加密的数据放在 SSH 安全连接里面传输,使得原本不安全的网络服务增加了安全性,比如通过端口转发访问 Telnet、FTP 等明文服务,数据传输就都会加密。

(2)作为数据通信的加密跳板,绕过网络防火墙。

端口转发有三种使用方法:动态转发,本地转发,远程转发。下面逐一介绍。

动态转发指的是,本机与 SSH 服务器之间创建了一个加密连接,然后本机内部针对某个端口的通信,都通过这个加密连接转发。它的一个使用场景就是,访问所有外部网站,都通过 SSH 转发。

动态转发需要把本地端口绑定到 SSH 服务器。至于 SSH 服务器要去访问哪一个网站,完全是动态的,取决于原始通信,所以叫做动态转发。

$ ssh -D local-port tunnel-host -N

上面命令中,-D表示动态转发,local-port是本地端口,tunnel-host是 SSH 服务器,-N表示这个 SSH 连接只进行端口转发,不登录远程 Shell,不能执行远程命令,只能充当隧道。

举例来说,如果本地端口是2121,那么动态转发的命令就是下面这样。

$ ssh -D 2121 tunnel-host -N

注意,这种转发采用了 SOCKS5 协议。访问外部网站时,需要把 HTTP 请求转成SOCKS5协议,才能把本地端口的请求转发出去。

下面是 SSH 隧道建立后的一个使用实例。

$ curl -x socks5://localhost:2121 http://www.example.com

上面命令中,curl 的-x参数指定代理服务器,即通过 SOCKS5协议的本地2121端口,访问http://www.example.com

如果经常使用动态转发,可以将设置写入 SSH 客户端的用户个人配置文件(~/.ssh/config)。

DynamicForward tunnel-host:local-port

本地转发(local forwarding)指的是,SSH 服务器作为中介的跳板机,建立本地计算机与特定目标网站之间的加密连接。本地转发是在本地计算机的 SSH 客户端建立的转发规则。

它会指定一个本地端口(local-port),所有发向那个端口的请求,都会转发到 SSH 跳板机(tunnel-host),然后 SSH 跳板机作为中介,将收到的请求发到目标服务器(target-host)的目标端口(target-port)。

$ ssh -L local-port:target-host:target-port tunnel-host

上面命令中,-L参数表示本地转发,local-port是本地端口,target-host是你想要访问的目标服务器,target-port是目标服务器的端口,tunnel-host是 SSH 跳板机。

举例来说,现在有一台 SSH 跳板机tunnel-host,我们想要通过这台机器,在本地2121端口与目标网站www.example.com的80端口之间建立 SSH 隧道,就可以写成下面这样。

$ ssh -L 2121:www.example.com:80 tunnel-host -N

然后,访问本机的2121端口,就是访问www.example.com的80端口。

$ curl http://localhost:2121

注意,本地端口转发采用 HTTP 协议,不用转成 SOCKS5 协议。

另一个例子是加密访问邮件获取协议 POP3

$ ssh -L 1100:mail.example.com:110 mail.example.com

上面命令将本机的1100端口,绑定邮件服务器mail.example.com的110端口(POP3 协议的默认端口)。端口转发建立以后,POP3 邮件客户端只需要访问本机的1100端口,请求就会通过 SSH 跳板机(这里是mail.example.com),自动转发到mail.example.com的110端口。

上面这种情况有一个前提条件,就是mail.example.com必须运行 SSH 服务器。否则,就必须通过另一台 SSH 服务器中介,执行的命令要改成下面这样。

$ ssh -L 1100:mail.example.com:110 other.example.com

上面命令中,本机的1100端口还是绑定mail.example.com的110端口,但是由于mail.example.com没有运行 SSH 服务器,所以必须通过other.example.com中介。本机的 POP3 请求通过1100端口,先发给other.example.com的22端口(sshd 默认端口),再由后者转给mail.example.com,得到数据以后再原路返回。

注意,采用上面的中介方式,只有本机到other.example.com的这一段是加密的,other.example.commail.example.com的这一段并不加密。

这个命令最好加上-N参数,表示不在 SSH 跳板机执行远程命令,让 SSH 只充当隧道。另外还有一个-f参数表示 SSH 连接在后台运行。

如果经常使用本地转发,可以将设置写入 SSH 客户端的用户个人配置文件(~/.ssh/config)。

Host test.example.com
LocalForward client-IP:client-port server-IP:server-port

远程端口指的是在远程 SSH 服务器建立的转发规则。

这种场景比较特殊,主要针对内网的情况。本地计算机在外网,SSH 跳板机和目标服务器都在内网,而且本地计算机无法访问内网之中的 SSH 跳板机,但是 SSH 跳板机可以访问本机计算机。

由于本机无法访问内网 SSH 跳板机,就无法从外网发起 SSH 隧道,建立端口转发。必须反过来,从 SSH 跳板机发起隧道,建立端口转发,这时就形成了远程端口转发。

$ ssh -R local-port:target-host:target-port -N local

上面的命令,首先需要注意,不是在本机执行的,而是在 SSH 跳板机执行的,从跳板机去连接本地计算机。-R参数表示远程端口转发,local-port是本地计算机的端口,target-hosttarget-port是目标服务器及其端口,local是本地计算机。

显然,远程端口转发要求本地计算机也安装了 SSH 服务器,这样才能接受 SSH 跳板机的远程登录。

比如,跳板机执行下面的命令,绑定本地计算机的2121端口,去访问www.example.com:80

$ ssh -R 2121:www.example.com:80 local -N

执行上面的命令以后,跳板机到本地计算机的隧道已经建立了。然后,就可以从本机访问目标服务器了,即在本机执行下面的命令。

$ curl http://localhost:2121

执行上面的命令以后,命令就会输出服务器www.example.com的80端口返回的内容。

如果经常执行远程端口转发,可以将设置写入 SSH 客户端的用户个人配置文件(~/.ssh/config)。

Host test.example.com
RemoteForward local-IP:local-port target-ip:target-port

下面看两个端口转发的实例。

1.简易vpn

VPN用来在外网与内网之间建立一条加密通道。内网的服务器不能从外网直接访问,必须通过一个跳板机,如果本机可以访问跳板机,就可以使用 SSH 本地转发,简单实现一个 VPN

$ ssh -L 2080:corp-server:80 -L 2443:corp-server:443 tunnel-host -N

上面命令通过 SSH 跳板机,将本机的2080端口绑定内网服务器的80端口,本机的2443端口绑定内网服务器的443端口。

2.两级跳板

端口转发可以有多级,比如新建两个 SSH 隧道,第一个隧道转发给第二个隧道,第二个隧道才能访问目标服务器。

首先,在本机新建第一级隧道。

$ ssh -L 7999:localhost:2999 tunnel1-hostsh

上面命令在本地7999端口与tunnel1-host之间建立一条隧道,隧道的出口是tunnel1-hostlocalhost:2999,也就是tunnel1-host收到本机的请求以后,转发给自己的2999端口。

然后,在第一台跳板机(tunnel1-host)执行下面的命令,新建第二级隧道。

$ ssh -L 2999:target-host:7999 tunnel2-host -N

上面命令将第一台跳板机tunnel1-host2999端口,通过第二台跳板机tunnel2-host,连接到目标服务器target-host7999端口。

最终效果就是,访问本机的7999端口,就会转发到target-host7999端口。

证书登录

SSH 作为服务器登录工具,除了通常采用的密码登录或密钥登录, 还有第三种登录方法,就是证书登录。

密码登录和密钥登录,都有各自的缺点。

密码登录需要输入服务器密码,这非常麻烦,也不安全,存在被暴力破解的风险。

密钥登录需要服务器保存用户的公钥,也需要用户保存服务器公钥的指纹。这对于多用户、多服务器的大型机构很不方便,如果有员工离职,需要将他的公钥从每台服务器删除。

证书登录就是为了解决上面的缺点而设计的。它引入了一个证书颁发机构(Certificate Authority,简称 CA),对信任的服务器颁发服务器证书,对信任的用户颁发用户证书。

登录时,用户和服务器不需要提前知道彼此的公钥,只需要交换各自的证书,验证是否可信即可。

证书登录的主要优点有两个:(1)用户和服务器不用交换公钥,这更容易管理,也具有更好的可扩展性。(2)证书可以设置到期时间,而公钥没有到期时间。针对不同的情况,可以设置有效期很短的证书,进一步提高安全性。

SSH 证书登录之前,如果还没有证书,需要生成证书。具体方法是:(1)用户和服务器都将自己的公钥,发给 CA;(2)CA 使用服务器公钥,生成服务器证书,发给服务器;(3)CA 使用用户的公钥,生成用户证书,发给用户。

有了证书以后,用户就可以登录服务器了。整个过程都是 SSH 自动处理,用户无感知。

第一步,用户登录服务器时,SSH 自动将用户证书发给服务器。

第二步,服务器检查用户证书是否有效,以及是否由可信的 CA 颁发。证实以后,就可以信任用户。

第三步,SSH 自动将服务器证书发给用户。

第四步,用户检查服务器证书是否有效,以及是否由信任的 CA 颁发。证实以后,就可以信任服务器。

第五步,双方建立连接,服务器允许用户登录。

证书登录的前提是,必须有一个 CA,而 CA 本质上就是一对密钥,跟其他密钥没有不同,CA 就用这对密钥去签发证书。

虽然 CA 可以用同一对密钥签发用户证书和服务器证书,但是出于安全性和灵活性,最好用不同的密钥分别签发。所以,CA 至少需要两对密钥,一对是签发用户证书的密钥,假设叫做user_ca,另一对是签发服务器证书的密钥,假设叫做host_ca

使用下面的命令,生成user_ca

# 生成 CA 签发用户证书的密钥
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/user_ca -C user_ca

上面的命令会在~/.ssh目录生成一对密钥:user_ca(私钥)和user_ca.pub(公钥)。

使用下面的命令,生成host_ca

# 生成 CA 签发服务器证书的密钥
$ ssh-keygen -t rsa -b 4096 -f host_ca -C host_ca

上面的命令会在~/.ssh目录生成一对密钥:host_ca(私钥)和host_ca.pub(公钥)。

有了 CA 以后,就可以签发服务器证书了。

签发证书,除了 CA 的密钥以外,还需要服务器的公钥。一般来说,SSH 服务器(通常是sshd)安装时,已经生成密钥/etc/ssh/ssh_host_rsa_key了。如果没有的话,可以用下面的命令生成。

$ sudo ssh-keygen -f /etc/ssh/ssh_host_rsa_key -b 4096 -t rsa

上面命令会在/etc/ssh目录,生成ssh_host_rsa_key(私钥)和ssh_host_rsa_key.pub(公钥)。然后,需要把服务器公钥ssh_host_rsa_key.pub,复制或上传到 CA 所在的服务器。

上传以后,CA 就可以使用密钥host_ca为服务器的公钥ssh_host_rsa_key.pub签发服务器证书。

$ ssh-keygen -s host_ca -I host.example.com -h -n host.example.com -V +52w ssh_host_rsa_key.pub

上面的命令会生成服务器证书ssh_host_rsa_key-cert.pub(服务器公钥名字加后缀-cert)。这个命令各个参数的含义如下。

  • -s:指定 CA 签发证书的密钥。
  • -I:身份字符串,可以随便设置,相当于注释,方便区分证书,将来可以使用这个字符串撤销证书。
  • -h:指定该证书是服务器证书,而不是用户证书。
  • -n host.example.com:指定服务器的域名,表示证书仅对该域名有效。如果有多个域名,则使用逗号分隔。用户登录该域名服务器时,SSH 通过证书的这个值,分辨应该使用哪张证书发给用户,用来证明服务器的可信性。
  • -V +52w:指定证书的有效期,这里为52周(一年)。默认情况下,证书是永远有效的。建议使用该参数指定有效期,并且有效期最好短一点,最长不超过52周。
  • ssh_host_rsa_key.pub:服务器公钥。

生成证书以后,可以使用下面的命令,查看证书的细节。

$ ssh-keygen -L -f ssh_host_rsa_key-cert.pub

最后,为证书设置权限。

$ chmod 600 ssh_host_rsa_key-cert.pub

下面,再用 CA 签发用户证书。这时需要用户的公钥,如果没有的话,客户端可以用下面的命令生成一对密钥。

$ ssh-keygen -f ~/.ssh/user_key -b 4096 -t rsa

上面命令会在~/.ssh目录,生成user_key(私钥)和user_key.pub(公钥)。

然后,将用户公钥user_key.pub,上传或复制到 CA 服务器。接下来,就可以使用 CA 的密钥user_ca为用户公钥user_key.pub签发用户证书。

$ ssh-keygen -s user_ca -I user@example.com -n user -V +1d user_key.pub

上面的命令会生成用户证书user_key-cert.pub(用户公钥名字加后缀-cert)。这个命令各个参数的含义如下。

  • -s:指定 CA 签发证书的密钥
  • -I:身份字符串,可以随便设置,相当于注释,方便区分证书,将来可以使用这个字符串撤销证书。
  • -n user:指定用户名,表示证书仅对该用户名有效。如果有多个用户名,使用逗号分隔。用户以该用户名登录服务器时,SSH 通过这个值,分辨应该使用哪张证书,证明自己的身份,发给服务器。
  • -V +1d:指定证书的有效期,这里为1天,强制用户每天都申请一次证书,提高安全性。默认情况下,证书是永远有效的。
  • user_key.pub:用户公钥。

生成证书以后,可以使用下面的命令,查看证书的细节。

$ ssh-keygen -L -f user_key-cert.pub

最后,为证书设置权限。

$ chmod 600 user_key-cert.pub

CA 生成服务器证书ssh_host_rsa_key-cert.pub以后,需要将该证书发回服务器,可以使用下面的scp命令,将证书拷贝过去。

$ scp ~/.ssh/ssh_host_rsa_key-cert.pub root@host.example.com:/etc/ssh/

然后,将下面一行添加到服务器配置文件/etc/ssh/sshd_config

HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub

上面的代码告诉sshd,服务器证书是哪一个文件。

重新启动 sshd

$ sudo systemctl restart sshd.service
# 或者
$ sudo service sshd restart

为了让服务器信任用户证书,必须将 CA 签发用户证书的公钥user_ca.pub,拷贝到服务器。

$ scp ~/.ssh/user_ca.pub root@host.example.com:/etc/ssh/

上面的命令,将 CA 签发用户证书的公钥user_ca.pub,拷贝到 SSH 服务器的/etc/ssh目录。

然后,将下面一行添加到服务器配置文件/etc/ssh/sshd_config

TrustedUserCAKeys /etc/ssh/user_ca.pub

上面的做法是将user_ca.pub加到/etc/ssh/sshd_config,这会产生全局效果,即服务器的所有账户都会信任user_ca签发的所有用户证书。

另一种做法是将user_ca.pub加到服务器某个账户的~/.ssh/authorized_keys文件,只让该账户信任user_ca签发的用户证书。具体方法是打开~/.ssh/authorized_keys,追加一行,开头是@cert-authority principals="...",然后后面加上user_ca.pub的内容,大概是下面这个样子。

@cert-authority principals="user" ssh-rsa AAAAB3Nz...XNRM1EX2gQ==

上面代码中,principals="user"指定用户登录的服务器账户名,一般就是authorized_keys文件所在的账户。

重新启动sshd

$ sudo systemctl restart sshd.service
# 或者
$ sudo service sshd restart

至此,SSH 服务器已配置为信任user_ca签发的证书。

客户端安装用户证书很简单,就是从 CA 将用户证书user_key-cert.pub复制到客户端,与用户的密钥user_key保存在同一个目录即可。

为了让客户端信任服务器证书,必须将 CA 签发服务器证书的公钥host_ca.pub,加到客户端的/etc/ssh/ssh_known_hosts文件(全局级别)或者~/.ssh/known_hosts文件(用户级别)。

具体做法是打开ssh_known_hostsknown_hosts文件,追加一行,开头为@cert-authority *.example.com,然后将host_ca.pub文件的内容(即公钥)粘贴在后面,大概是下面这个样子。

@cert-authority *.example.com ssh-rsa AAAAB3Nz...XNRM1EX2gQ==

上面代码中,*.example.com是域名的模式匹配,表示只要服务器符合该模式的域名,且签发服务器证书的 CA 匹配后面给出的公钥,就都可以信任。如果没有域名限制,这里可以写成*。如果有多个域名模式,可以使用逗号分隔;如果服务器没有域名,可以用主机名(比如host1,host2,host3)或者 IP 地址(比如11.12.13.14,21.22.23.24)。

然后,就可以使用证书,登录远程服务器了。

$ ssh -i ~/.ssh/user_key user@host.example.com

上面命令的-i参数用来指定用户的密钥。如果证书与密钥在同一个目录,则连接服务器时将自动使用该证书。

废除证书的操作,分成用户证书的废除和服务器证书的废除两种。

服务器证书的废除,用户需要在known_hosts文件里面,修改或删除对应的@cert-authority命令的那一行。

用户证书的废除,需要在服务器新建一个/etc/ssh/revoked_keys文件,然后在配置文件sshd_config添加一行,内容如下。

RevokedKeys /etc/ssh/revoked_keys

revoked_keys文件保存不再信任的用户公钥,由下面的命令生成。

$ ssh-keygen -kf /etc/ssh/revoked_keys -z 1 ~/.ssh/user1_key.pub

上面命令中,-z参数用来指定用户公钥保存在revoked_keys文件的哪一行,这个例子是保存在第1行。

如果以后需要废除其他的用户公钥,可以用下面的命令保存在第2行。

$ ssh-keygen -ukf /etc/ssh/revoked_keys -z 2 ~/.ssh/user2_key.pub

scp使用方法

scp是 SSH 提供的一个客户端程序,用来在两台主机之间加密传送文件(即复制文件)。

scp是 secure copy 的缩写,相当于cp命令 + SSH。它的底层是 SSH 协议,默认端口是22,相当于先使用ssh命令登录远程主机,然后再执行拷贝操作。

scp主要用于以下三种复制操作。

  • 本地复制到远程。
  • 远程复制到本地。
  • 两个远程系统之间的复制。

使用scp传输数据时,文件和密码都是加密的,不会泄漏敏感信息。

基本语法

scp的语法类似cp的语法。

$ scp source destination

上面命令中,source是文件当前的位置,destination是文件所要复制到的位置。它们都可以包含用户名和主机名。

$ scp user@host:foo.txt bar.txt

上面命令将远程主机(user@host)用户主目录下的foo.txt,复制为本机当前目录的bar.txt。可以看到,主机与文件之间要使用冒号(:)分隔。

scp会先用 SSH 登录到远程主机,然后在加密连接之中复制文件。客户端发起连接后,会提示用户输入密码,这部分是跟 SSH 的用法一致的。

用户名和主机名都是可以省略的。用户名的默认值是本机的当前用户名,主机名默认为当前主机。注意,scp会使用 SSH 客户端的配置文件.ssh/config,如果配置文件里面定义了主机的别名,这里也可以使用别名连接。

scp支持一次复制多个文件。

$ scp source1 source2 destination

上面命令会将source1source2两个文件,复制到destination

注意,如果所要复制的文件,在目标位置已经存在同名文件,scp会在没有警告的情况下覆盖同名文件。

用法示例

(1)本地文件复制到远程

复制本机文件到远程系统的用法如下。

# 语法
$ scp SourceFile user@host:directory/TargetFile

# 示例
$ scp file.txt remote_username@10.10.0.2:/remote/directory

下面是复制整个目录的例子。

# 将本机的 documents 目录拷贝到远程主机,
# 会在远程主机创建 documents 目录
$ scp -r documents username@server_ip:/path_to_remote_directory

# 将本机整个目录拷贝到远程目录下
$ scp -r localmachine/path_to_the_directory username@server_ip:/path_to_remote_directory/

# 将本机目录下的所有内容拷贝到远程目录下
$ scp -r localmachine/path_to_the_directory/* username@server_ip:/path_to_remote_directory/

(2)远程文件复制到本地

从远程主机复制文件到本地的用法如下。

# 语法
$ scp user@host:directory/SourceFile TargetFile

# 示例
$ scp remote_username@10.10.0.2:/remote/file.txt /local/directory

下面是复制整个目录的例子。

# 拷贝一个远程目录到本机目录下
$ scp -r username@server_ip:/path_to_remote_directory local-machine/path_to_the_directory/

# 拷贝远程目录下的所有内容,到本机目录下
$ scp -r username@server_ip:/path_to_remote_directory/* local-machine/path_to_the_directory/
$ scp -r user@host:directory/SourceFolder TargetFolder
(3)两个远程系统之间的复制

本机发出指令,从远程主机 A 拷贝到远程主机 B 的用法如下。

# 语法
$ scp user@host1:directory/SourceFile user@host2:directory/SourceFile

# 示例
$ scp user1@host1.com:/files/file.txt user2@host2.com:/files

系统将提示你输入两个远程帐户的密码。数据将直接从一个远程主机传输到另一个远程主机。

rsync使用

rsync是一个常用的 Linux 应用程序,用于文件同步。

它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步)。它也可以当作文件复制工具,替代cpmv命令。

它名称里面的r指的是 remote,rsync其实就是“远程同步”(remote sync)的意思。与其他文件传输工具(如 FTP 或 scp)不同,rsync 的最大特点是会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)。

虽然 rsync 不是 SSH 工具集的一部分,但因为也涉及到远程操作,所以放在这里一起介绍。

如果本机或者远程计算机没有安装 rsync,可以用下面的命令安装。

# Debian
$ sudo apt-get install rsync

# Red Hat
$ sudo yum install rsync

# Arch Linux
$ sudo pacman -S rsync

注意,传输的双方都必须安装rsync

rsync 除了支持本地两个目录之间的同步,也支持远程同步。它可以将本地内容,同步到远程服务器。

$ rsync -av source/ username@remote_host:destination

也可以将远程内容同步到本地。

$ rsync -av username@remote_host:source/ destination

rsync 默认使用 SSH 进行远程登录和数据传输。

由于早期rsync 不使用 SSH 协议,需要用-e参数指定协议,后来才改的。所以,下面-e ssh可以省略。

$ rsync -av -e ssh source/ user@remote_host:/destination

但是,如果 ssh 命令有附加的参数,则必须使用-e参数指定所要执行的 SSH 命令。

$ rsync -av -e 'ssh -p 2234' source/ user@remote_host:/destination

上面命令中,-e参数指定 SSH 使用2234端口。

sftp使用

sftp是 SSH 提供的一个客户端应用程序,主要用来安全地访问 FTP。因为 FTP 是不加密协议,很不安全,sftp就相当于将 FTP 放入了 SSH。

下面的命令连接 FTP 主机。

$ sftp username@hostname

执行上面的命令,会要求输入 FTP 的密码。密码验证成功以后,就会出现 FTP 的提示符sftp>,下面是一个例子。

$ sftp USER@penguin.example.com
USER@penguin.example.com's password:
Connected to penguin.example.com.
sftp>

FTP 的提示符下面,就可以输入各种 FTP 命令了,这部分完全跟传统的 FTP 用法完全一样。

  • ls [directory]:列出一个远程目录的内容。如果没有指定目标目录,则默认列出当前目录。
  • cd directory:从当前目录改到指定目录。
  • mkdir directory:创建一个远程目录。
  • rmdir path:删除一个远程目录。
  • put localfile [remotefile]:本地文件传输到远程主机。
  • get remotefile [localfile]:远程文件传输到本地。
  • help:显示帮助信息。
  • bye:退出sftp
  • quit:退出 sftp
  • exit:退出sftp
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值