密钥设置实现免密码访问

进行项目分析等工作,经常要链接服务器,登陆过程中总会需要我们输入密码,如果频率比较低,还好,但是每天的重复输入,总归会浪费我们大量的时间。另一方面部分工具或任务,可能不方便进行交互式的密码输入,因此通过使用密钥来实现免密码展现出较大的优势。

通过公钥与私钥

创建公钥与私钥对

在本地机器上运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
ssh-keygen  -f test  -C "test key"

支持以下选项:

–b bits
指定要创建的密钥的位数。最小位数为 512 位。通常,2048 位足以满足安全需要。密钥大小超过该值并不会提高安全性,反而会降低速度。缺省值为 2048 位。
–B
显示指定的私钥或公钥文件的 bubblebabble 摘要。
–c
请求更改私钥和公钥文件中的注释。该程序会提示您提供包含私钥的文件、口令短语(如果密钥具有一个口令短语)以及新的注释。
此选项仅适用于 rsa1 (SSHv1) 密钥。
–C comment
提供新注释。
–e
此选项读取 OpenSSH 私钥或公钥文件并将密钥以 "SECSH" 公钥文件格式输出到 stdout。此选项允许导出密钥供其他一些 SSH 实现使用。
–f
指定密钥文件的文件名。
–F
在 known_hosts 文件中搜索指定的 hostname,列出找到的任何匹配项。此选项可用于查找散列格式的主机名或地址,还可以与 –H 选项一起使用,以散列格式输出找到的密钥。
–H
对 known_hosts 文件执行散列计算。此选项使用散列形式替换指定文件内的所有主机名和地址。原始内容将移动到后缀为 .old 的文件中。这些散列值通常由 ssh 和 sshd 使用,即使文件内容被公开,这些散列值也并不会透露可识别的信息。此选项不会修改现有的散列主机名,因此可以放心地用于同时包含散列名称和非散列名称的文件。
–i
此选项以 SSH2 兼容格式读取未加密的私钥(或公钥)文件并将 OpenSSH 兼容的私钥(或公钥)输出到 stdout。ssh-keygen 还可读取 “SECSH” 公钥文件格式。此选项允许从其他一些 SSH 实现中导入密钥。
–l
显示指定的私钥或公钥文件的指纹。
–N new_passphrase
提供新口令短语。
–p
请求更改私钥文件的口令短语,而不创建新私钥。该程序会提示您提供包含私钥的文件、旧口令短语,并两次提示您输入新口令短语。
–P passphrase
提供(旧)口令短语。
–q
退出 ssh-keygen。
–t type
指定用于生成密钥的算法,其中 type 是 rsa、dsa 和 rsa1 中的一种。rsa1 类型仅用于 SSHv1 协议。
–R hostname
从 known_hosts 文件中删除属于 hostname 的所有密钥。此选项可用于删除散列主机。请参见 –H。
–x
已过时。已被 –e 选项取代。
–X
已过时。已被 –i 选项取代。
–y
此选项读取 OpenSSH 私钥格式文件并将 OpenSSH 公钥输出到 stdout。
–8
指定 ssh-keygen 生成 PKCS#8 格式的密钥。对于要生成的密钥,支持的类型为 rsa 或 dsa。
将公钥复制到远程目录
1
2
3
ssh-copy-id -i ~/.ssh/id_rsa.pub remote-host
# 会提示输入远程服务器的密码
# 密码输入后,会将key写到远程机器的 ~/.ssh/authorized_key.文件中
多公钥的配置

有些特殊情况下,可能我们需要配置多个独立的密钥,比如gitlab和github的独立公钥,或者集群公钥:
这个时候,我们可以通过编辑 ~/.ssh/config 文件进行适配。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# host 与 hostname 需要相同

# configuration 1
Host cluster
# 你的主机名
HostName 10.1**.**.**
# 你的用户名
User liu******
# 你的rsa秘钥文件
IdentityFile ~/.ssh/id_rsa

# configuration 2
Host github.com
HostName github.com
# 你的github账号
User 6****@qq.com
# github对应的rsa秘钥文件
IdentityFile ~/.ssh/id_rsa_github

# configuration 3
# gitlab
# host 与 hostname 需要相同
Host gitlab.******.cn
HostName gitlab.******.cn
# 你的gitlab账号
User liu******@********ics.cn
# gitlab对应的rsa秘钥文件
IdentityFile ~/.ssh/id_rsa_gitlab

其中关键字不分大小,但是后面的值是区分大小写的,常用的关键字如下:

  • Host:类似昵称,用于标识某个特定的配置,在ssh命令中使用,例如我们想要ssh连接到上例中的#1配置的主机,则在命令行执行如下命令即可:ssh cluster , cluster == liubo4@10.192.36.4
  • HostName: ssh链接的主机名,一般是IP地址或域名。
  • User: ssh链接的用户名
  • IdentityFile: 认证证书文件,默认位置是~/.ssh/id_rsa, ~/ssh/id_dsa等,如果采用默认的证书,可以不用设置此参数,除非你的证书放在某个自定义的目录,那么你就需要设置该参数来指向你的证书
  • Port: SSH访问主机的端口号,默认是22端口,同上,只有在非默认情况下才需要设置该值

更多关键字可以通过执行 man ssh_config 查看。

配置完成进行测试
1
ssh remote-host

不需要输入密码即可登录到远程服务器

sshpass 工具

先在机器A上安装 sshpass 工具,然后使用

1
2
sshpass -p passwd ssh(scp) ** 或者 
sshpass -f file ssh(scp) **

其中 -p 直接指定密码,-f 则从文件中读取密码。

-------------本文结束感谢您的阅读-------------