[实践OK]Linux下通过ssh-keygen生成公钥放~/.ssh下,使ssh不用输入密码,免密码登录, ssh-keygen的使用方法。
用它在Alpine上生成各种级别的密钥,RSA、DSA和ECDSA三者的签名:
有些时候,我们在复制/移动文件到另一台机器时会用到scp,因为它比较安全。但如果每次
都要输入密码,就比较烦了,尤其是在script里。不过,ssh有另一种用密钥对来验证的方
式。下面写出我生成密匙对的过程,供大家参考。
关键点:
1)生成密钥的机器私钥不动,公钥给待连接的服务器。
2)公钥放到要待连接的机器上要改名为:authorized_keys。(mv id_rsa.pub authorized_keys)
3)权限得要是700:chmod -R 700 authorized_keys,在谁家就是chown 谁的权限,总之,在某人hime目录下面就只能某人读取即可,不需要其他人能读取或修改,一旦chown 后,755不必了,也是为了安全,# chmod 600 authorized_keys即可读取写入即可,记住:目录是700,里面的文件是600,也就是只能这个用户读取600,这个目录也是只能这个用户进入也就是目录得有x。
4)服务端:放谁的Home目录下在服务端执行命令时就是谁。
5)客户端:在客户端登录时如不指明用户,就是客户端的用户名,如:客户端是root用户,不指名则是root@xx.xx.xx.xx去连接。如果服务端也是放/root/.ssh/authorized_key下,刚好,如客户端不是root,是test,则直接ssh是肯定连接不上的,因为变成了:test@xx.xx.xx.xx。
6)同样,你客户client端连接时是xiangdong,但你生成密钥时是root(公钥匙放到待连接机的/home/xiangdong/.ssh/下。),此时也是对不上的,得以root环境(因为他要找当时生成密钥的私钥,你client本地换成了xiangodng,它没有了。)
7)所以,鉴于6这种情况,最好生成时的用户和待连接的用户一样(实践证明如果lvops用户设置后,如果root下执行ssh -llvops xx.xx.xx.xx 也是需要密码的,而su到lvops就能免密码登陆成功,这块ansible是可以的,因为如xiangdong的/home/.ansible.cfg自己设置了id_rsa文件路径,而root下用ssh -l这种方法并没有带上id_rsa的路径去登陆,所以还是需要密码的。private_key_file = /home/xiangdong/irdcops_private_key 前面文件来自后面拷贝:private_key_file = /home/lvops/.ssh/id_rsa ,这块儿如果是root操作注意把irdcops_private_key权限为xiangdong且能读取,否则ansible没法读取也就会需要密码或报错的问题。http://jackxiang.com/post/8967/),这样就会省去指定也好,用户名对不上,还得指定才行的这些小问题引发连接不上的问题。
第七点,也是实践证明了的,符合上面1-6点后,也就不用指明用户名了,如下:
[xiangdong@localhost .ssh]$ ssh 10.70.37.24
The authenticity of host '10.70.37.24 (10.70.37.24)' can't be established.
RSA key fingerprint is 56:94:6d:81:f3:e5:e2:8b:90:0a:93:3b:8e:7e:fd:c8.
Please type 'yes' or 'no': yes
Warning: Permanently added '10.70.37.24' (RSA) to the list of known hosts.
Last login: Thu May 5 17:27:03 2016 from 192.168.101.227
http://blog.csdn.net/kongqz/article/details/6338690
——————————————————生成步骤如下:——————————————————
第一步:生成密匙对,我用的是rsa的密钥。使用命令 "ssh-keygen -t rsa"
[user1@rh user1]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user1/.ssh/id_rsa):
Created directory '/home/user1/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user1/.ssh/id_rsa.
Your public key has been saved in /home/user1/.ssh/id_rsa.pub.
The key fingerprint is:
e0:f0:3b:d3:0a:3d:da:42:01:6a:61:2f:6c:a0:c6:e7 user1@rh.test.com
[user1@rh user1]$
我的:
注意,我这儿:
这儿公用密钥:/root/.ssh2/id_rsa_2048_a.pub
私有密钥:/root/.ssh2/id_rsa_2048_a
生成的过程中提示输入密钥对保存位置,直接回车,接受默认值就行了。接着会提示输入一
个不同于你的password的密码,直接回车,让它空着。当然,也可以输入一个。(我比较懒
,不想每次都要输入密码。) 这样,密钥对就生成完了。
其中公共密钥保存在 ~/.ssh/id_rsa.pub =》 /root/.ssh2/id_rsa_2048_a.pub
私有密钥保存在 ~/.ssh/id_rsa =》/root/.ssh2/id_rsa_2048_a
然后改一下 .ssh 目录的权限,使用命令 "chmod 755 ~/.ssh" =》chmod 755 /root/.ssh2
[user1@rh user1]$ chmod 755 /root/.ssh
[user1@rh user1]$
之后把这个密钥对中的公共密钥复制到你要访问的机器上去(被以前需要密码访问的机器上),并保存为
~/.ssh/authorized_keys #My: mv id_rsa_2048_a.pub authorized_key
[user1@rh user1]$ scp ~/.ssh/id_rsa.pub rh1:/home/user1/.ssh/authorized_keys //特别注意:这个是在服务器端操作的
user1@rh1's password:
id_rsa.pub 100% 228 3.2MB/s 00:00
[user1@rh user1]$
之这样就大功告成了。之后你再用ssh scp sftp 之类的访问那台机器时,就不用输入密码
了,用在script上更是方便。
SSH服务的配置
1、配置SSH服务的运行参数,是通过修改配置文件/etc/ssh/sshd_config实现的。
2、因为SSH服务使用默认的配置已经能够很好的工作,如果仅仅提供SSH服务不需要修改。这里只介绍一
些常用的选项。
#Port 22
定义了SSH服务监听的断口号,SSH服务默认使用的端口号是22
#Proctocol 2,1
定义了SSH服务器使用SSH协议的顺序。默认识先使用SSH2协议,如果不成功则使用SSH1协议,为了安全起
见,可以设置只使用SSH2协议。
#ListenAddress 0.0.0.0
定义SSH服务器帮定的IP地址,默认绑定服务器所有可用的IP地址.
#PermitRootLogin yes
定义是否允许管理员登陆
#PermitEmptyPasswords no
定义是否允许空密码登陆.
#PasswordAuthentication no
定义是否使用口令认证方式,如果准备使用公钥认证可以设置为no
# ps aux|grep ssh
root 2649 0.0 0.0 3360 840 ? Ss 2009 0:00 /usr/local/sbin/sshd -f /etc/ssh2/sshd2_config.l
vi /etc/ssh2/sshd2_config.l
即可!
四 :
吧 id_rsa ,拷到客户端,在服务器端吧id_rsa.pub 改名为authorized_keys
cat id_rsa.pub >> authorized_keys
注意:
ssh2的配置:
#PermitRootLogin yes
定义是否允许管理员登陆
#PermitEmptyPasswords no
定义是否允许空密码登陆.
把 id_rsa ,拷到客户端,在服务器端吧id_rsa.pub 改名为authorized_keys
mv id_rsa_2048_a.pub authorized_key 这个是公钥重新命名。而客户端则是安装在自己的机器上这儿是:id_rsa_2048_a
别弄反了!
写在最后:
root
Jackxiang:/root/.ssh2 # scp ~/.ssh2/id_rsa_2048_a /root/.ssh2/authorized_keys21
scp: warning: stat: id_rsa_2048_a (src): no such file (server msg: 'syserr: No such file or directory, file: /home/admin/.ssh2/id_rsa_2048_a')
Tencent:/root/.ssh2 # whoami
root
admin:x:0:100::/home/admin:/bin/bash
Jackxiang:/root/.ssh2 # ls /home/admin
***
不是真正的root,是root这个组的,于是得拷贝到:
/home/admin/.ssh2/ 下,才行!
附送,方便一键ssh连接:
都三年前写的了,
今年2011加上个参考:http://chenlb.blogjava.net/archive/2008/07/03/212293.html
有些时候,我们在复制/移动文件到另一台机器时会用到scp,因为它比较安全。但如果每次
都要输入密码,就比较烦了,尤其是在script里。不过,ssh有另一种用密钥对来验证的方
式。下面写出我生成密匙对的过程,供大家参考。
关键点:
1)生成密钥的机器私钥不动,公钥给待连接的服务器。
2)公钥放到要待连接的机器上要改名为:authorized_keys。(mv id_rsa.pub authorized_keys)
3)权限得要是700:chmod -R 700 authorized_keys,在谁家就是chown 谁的权限,总之,在某人hime目录下面就只能某人读取即可,不需要其他人能读取或修改,一旦chown 后,755不必了,也是为了安全,# chmod 600 authorized_keys即可读取写入即可,记住:目录是700,里面的文件是600,也就是只能这个用户读取600,这个目录也是只能这个用户进入也就是目录得有x。
4)服务端:放谁的Home目录下在服务端执行命令时就是谁。
5)客户端:在客户端登录时如不指明用户,就是客户端的用户名,如:客户端是root用户,不指名则是root@xx.xx.xx.xx去连接。如果服务端也是放/root/.ssh/authorized_key下,刚好,如客户端不是root,是test,则直接ssh是肯定连接不上的,因为变成了:test@xx.xx.xx.xx。
6)同样,你客户client端连接时是xiangdong,但你生成密钥时是root(公钥匙放到待连接机的/home/xiangdong/.ssh/下。),此时也是对不上的,得以root环境(因为他要找当时生成密钥的私钥,你client本地换成了xiangodng,它没有了。)
7)所以,鉴于6这种情况,最好生成时的用户和待连接的用户一样(实践证明如果lvops用户设置后,如果root下执行ssh -llvops xx.xx.xx.xx 也是需要密码的,而su到lvops就能免密码登陆成功,这块ansible是可以的,因为如xiangdong的/home/.ansible.cfg自己设置了id_rsa文件路径,而root下用ssh -l这种方法并没有带上id_rsa的路径去登陆,所以还是需要密码的。private_key_file = /home/xiangdong/irdcops_private_key 前面文件来自后面拷贝:private_key_file = /home/lvops/.ssh/id_rsa ,这块儿如果是root操作注意把irdcops_private_key权限为xiangdong且能读取,否则ansible没法读取也就会需要密码或报错的问题。http://jackxiang.com/post/8967/),这样就会省去指定也好,用户名对不上,还得指定才行的这些小问题引发连接不上的问题。
第七点,也是实践证明了的,符合上面1-6点后,也就不用指明用户名了,如下:
[xiangdong@localhost .ssh]$ ssh 10.70.37.24
The authenticity of host '10.70.37.24 (10.70.37.24)' can't be established.
RSA key fingerprint is 56:94:6d:81:f3:e5:e2:8b:90:0a:93:3b:8e:7e:fd:c8.
Please type 'yes' or 'no': yes
Warning: Permanently added '10.70.37.24' (RSA) to the list of known hosts.
Last login: Thu May 5 17:27:03 2016 from 192.168.101.227
http://blog.csdn.net/kongqz/article/details/6338690
——————————————————生成步骤如下:——————————————————
第一步:生成密匙对,我用的是rsa的密钥。使用命令 "ssh-keygen -t rsa"
[user1@rh user1]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user1/.ssh/id_rsa):
Created directory '/home/user1/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user1/.ssh/id_rsa.
Your public key has been saved in /home/user1/.ssh/id_rsa.pub.
The key fingerprint is:
e0:f0:3b:d3:0a:3d:da:42:01:6a:61:2f:6c:a0:c6:e7 user1@rh.test.com
[user1@rh user1]$
我的:
Jackxiang:/usr/local/tads/htdocs/xxy/src/view/images # ssh-keygen -t rsa
Generating 2048-bit rsa key pair
3 o.oOo.oOo.oO
Key generated.
2048-bit rsa, root@Tencent, Tue Mar 02 2010 11:26:08 +0800
Passphrase :
Again :
Key is stored with NULL passphrase.
(You can ignore the following warning if you are generating hostkeys.)
This is not recommended.
Don't do this unless you know what you're doing.
If file system protections fail (someone can access the keyfile),
or if the super-user is malicious, your key can be used without
the deciphering effort.
Private key saved to /root/.ssh2/id_rsa_2048_a
Public key saved to /root/.ssh2/id_rsa_2048_a.pub
Generating 2048-bit rsa key pair
3 o.oOo.oOo.oO
Key generated.
2048-bit rsa, root@Tencent, Tue Mar 02 2010 11:26:08 +0800
Passphrase :
Again :
Key is stored with NULL passphrase.
(You can ignore the following warning if you are generating hostkeys.)
This is not recommended.
Don't do this unless you know what you're doing.
If file system protections fail (someone can access the keyfile),
or if the super-user is malicious, your key can be used without
the deciphering effort.
Private key saved to /root/.ssh2/id_rsa_2048_a
Public key saved to /root/.ssh2/id_rsa_2048_a.pub
注意,我这儿:
这儿公用密钥:/root/.ssh2/id_rsa_2048_a.pub
私有密钥:/root/.ssh2/id_rsa_2048_a
生成的过程中提示输入密钥对保存位置,直接回车,接受默认值就行了。接着会提示输入一
个不同于你的password的密码,直接回车,让它空着。当然,也可以输入一个。(我比较懒
,不想每次都要输入密码。) 这样,密钥对就生成完了。
其中公共密钥保存在 ~/.ssh/id_rsa.pub =》 /root/.ssh2/id_rsa_2048_a.pub
私有密钥保存在 ~/.ssh/id_rsa =》/root/.ssh2/id_rsa_2048_a
然后改一下 .ssh 目录的权限,使用命令 "chmod 755 ~/.ssh" =》chmod 755 /root/.ssh2
[user1@rh user1]$ chmod 755 /root/.ssh
[user1@rh user1]$
之后把这个密钥对中的公共密钥复制到你要访问的机器上去(被以前需要密码访问的机器上),并保存为
~/.ssh/authorized_keys #My: mv id_rsa_2048_a.pub authorized_key
[user1@rh user1]$ scp ~/.ssh/id_rsa.pub rh1:/home/user1/.ssh/authorized_keys //特别注意:这个是在服务器端操作的
user1@rh1's password:
id_rsa.pub 100% 228 3.2MB/s 00:00
[user1@rh user1]$
之这样就大功告成了。之后你再用ssh scp sftp 之类的访问那台机器时,就不用输入密码
了,用在script上更是方便。
SSH服务的配置
1、配置SSH服务的运行参数,是通过修改配置文件/etc/ssh/sshd_config实现的。
2、因为SSH服务使用默认的配置已经能够很好的工作,如果仅仅提供SSH服务不需要修改。这里只介绍一
些常用的选项。
#Port 22
定义了SSH服务监听的断口号,SSH服务默认使用的端口号是22
#Proctocol 2,1
定义了SSH服务器使用SSH协议的顺序。默认识先使用SSH2协议,如果不成功则使用SSH1协议,为了安全起
见,可以设置只使用SSH2协议。
#ListenAddress 0.0.0.0
定义SSH服务器帮定的IP地址,默认绑定服务器所有可用的IP地址.
#PermitRootLogin yes
定义是否允许管理员登陆
#PermitEmptyPasswords no
定义是否允许空密码登陆.
#PasswordAuthentication no
定义是否使用口令认证方式,如果准备使用公钥认证可以设置为no
# ps aux|grep ssh
root 2649 0.0 0.0 3360 840 ? Ss 2009 0:00 /usr/local/sbin/sshd -f /etc/ssh2/sshd2_config.l
vi /etc/ssh2/sshd2_config.l
即可!
四 :
吧 id_rsa ,拷到客户端,在服务器端吧id_rsa.pub 改名为authorized_keys
cat id_rsa.pub >> authorized_keys
注意:
ssh2的配置:
#PermitRootLogin yes
定义是否允许管理员登陆
#PermitEmptyPasswords no
定义是否允许空密码登陆.
把 id_rsa ,拷到客户端,在服务器端吧id_rsa.pub 改名为authorized_keys
mv id_rsa_2048_a.pub authorized_key 这个是公钥重新命名。而客户端则是安装在自己的机器上这儿是:id_rsa_2048_a
别弄反了!
写在最后:
root
Jackxiang:/root/.ssh2 # scp ~/.ssh2/id_rsa_2048_a /root/.ssh2/authorized_keys21
scp: warning: stat: id_rsa_2048_a (src): no such file (server msg: 'syserr: No such file or directory, file: /home/admin/.ssh2/id_rsa_2048_a')
Tencent:/root/.ssh2 # whoami
root
admin:x:0:100::/home/admin:/bin/bash
Jackxiang:/root/.ssh2 # ls /home/admin
***
不是真正的root,是root这个组的,于是得拷贝到:
/home/admin/.ssh2/ 下,才行!
附送,方便一键ssh连接:
# User specific aliases and functions
alias df='df -Th'
alias l='ls -CF'
alias la='ls -A'
alias les='less -S'
alias topme='top -u `whoami`'
alias s33='ssh -Yi ~/.ssh/33 192.168.8.33'
alias s34='ssh -Yi ~/.ssh/33 192.168.8.34'
alias s35='ssh -Yi ~/.ssh/33 192.168.8.35'
alias s32='ssh -Yi ~/.ssh/33 192.168.8.32'
alias f32='sftp -oIdentityFile=~/.ssh/33 192.168.8.32'
alias s15='ssh -Yi ~/.ssh/15 192.168.8.15'
alias s16='ssh -Yi ~/.ssh/15 192.168.8.16'
alias s17='ssh -Yi ~/.ssh/15 192.168.8.17'
alias f15='sftp -oIdentityFile=~/.ssh/15 192.168.8.15'
alias df='df -Th'
alias l='ls -CF'
alias la='ls -A'
alias les='less -S'
alias topme='top -u `whoami`'
alias s33='ssh -Yi ~/.ssh/33 192.168.8.33'
alias s34='ssh -Yi ~/.ssh/33 192.168.8.34'
alias s35='ssh -Yi ~/.ssh/33 192.168.8.35'
alias s32='ssh -Yi ~/.ssh/33 192.168.8.32'
alias f32='sftp -oIdentityFile=~/.ssh/33 192.168.8.32'
alias s15='ssh -Yi ~/.ssh/15 192.168.8.15'
alias s16='ssh -Yi ~/.ssh/15 192.168.8.16'
alias s17='ssh -Yi ~/.ssh/15 192.168.8.17'
alias f15='sftp -oIdentityFile=~/.ssh/15 192.168.8.15'
都三年前写的了,
今年2011加上个参考:http://chenlb.blogjava.net/archive/2008/07/03/212293.html
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/2752/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2023-8-16 11:38
评论列表