Linux下 配置SSH实现免密登录

一、服务器A 免密登录 服务器B 原理

服务器A 要免密登录服务器B,则要把服务器A的公钥存到服务器B的授权公钥文件中:
先在服务器A上生成一对秘钥(ssh-keygen),然后将公钥拷贝到服务器Bauthorized_keys文件中。

原理:

  1. 服务器A 向 服务器B 发送一个连接请求,信息包括用户名、ip;
  2. 服务器B 收到请求,会从 authorized_keys 中查找是否有相同的用户名、ip;
    如果有,服务器B 会随机生成一个字符串,然后使用公钥进行加密,再发送给 服务器A;
  3. 服务器A 接到 服务器B 发来的信息后,会使用私钥进行解密,然后将解密后的字符串发送给 服务器B;
  4. 服务器B 接到 服务器A 发来的信息后,会和之前生成的字符串进行比对,如果一致,则允许免密登录

以下服务器A简称A,服务器B简称B。

二、启动 ssh 服务

# 查看 ssh 状态
systemctl status sshd
# 启动 ssh
systemctl start sshd
# 停止 ssh
systemctl stop sshd

三、A 生成秘钥,遇到提示直接敲回车即可

CentOS7 默认使用RSA加密算法生成密钥对,保存在~/.ssh目录下的id_rsa(私钥)和id_rsa.pub(公钥)。
ssh-keygen -t rsa(默认就是RSA加密算法,可不用加-t rsa
也可以使用-t DSA参数指定为DSA算法,对应文件为id_dsaid_dsa.pub
密钥对生成过程会提示输入私钥加密密码,可以直接回车不使用密码保护。

[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):    
Enter passphrase (empty for no passphrase): 
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:
SHA256:/gGrlDJN5euMS5aai5feBkEI/0WjEnzPzx1xGtdkKG4 [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|.o..  o      +o  |
| .o.oo .  + +..  |
|  oo.o. .. B     |
|   o..oo  E      |
|    ...oSo .     |
|    .o +o+.      |
|    ooB + .      |
|   .oX.= . .     |
|  .o=o=.o .      |
+----[SHA256]-----+
[root@localhost ~]# ls ~/.ssh/
id_rsa  id_rsa.pub  known_hosts
[root@localhost ~]# 

问题:

找不到 .ssh 目录

解决:

如果在上面生成秘钥后,执行 cd ~/.ssh 找不到 .ssh 目录,是因为没有使用 ssh 登录过,使用 ssh 登录一下即可生成 .ssh 目录,之后再重新执行 ssh-keygen 生成秘钥即可

[root@localhost ~]# ssh localhost
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:X8CavZpnxbyZ907OqCkc+NW703ZUpGWylfWxP9fQMiw.
ECDSA key fingerprint is MD5:89:5e:6f:d8:b7:51:cf:00:14:a9:d9:99:44:a2:85:a9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
root@localhost's password:
Last login: Wed Sep  7 16:15:14 2022 from 127.0.0.1
[root@localhost ~]# ls ~/.ssh/
known_hosts
[root@localhost ~]# exit
logout
Connection to localhost closed.
[root@localhost ~]#

四、将A的密钥添加到B的授权密钥

# 将 A ~/.ssh目录中的 id_rsa.pub 这个文件拷贝到你要登录的 B 的~/.ssh目录中
$ scp ~/.ssh/id_rsa.pub 192.168.100.102:~/.ssh/
# 然后在 B 运行以下命令来将公钥导入到~/.ssh/authorized_keys这个文件中
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# 或者是cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

你也可以使用以下命令:

$ ssh-copy-id [email protected]

这将把A的id_rsa.pub (在~/. ssh目录中)内容追加到B(192.168.100.102)的authorized_keys文件中。

重点:
注意请务必要将服务器上
~/.ssh权限设置为700
~/.ssh/authorized_keys的权限设置为600
这是linux的安全要求,如果权限不对,自动登录将不会生效

问题:

bash: /home/user/.ssh/authorized_keys: No such file or directory

解决:

方法1:

你必须首次创建.ssh目录和authorized_keys文件。

# 创建.ssh目录:
$ mkdir ~/.ssh
# 设置正确的权限:
$ chmod 700 ~/.ssh
# 创建authorized_keys文件:
$ touch ~/.ssh/authorized_keys
# 设置正确的权限:
$ chmod 600 ~/.ssh/authorized_keys
# 权限很重要,如果没有权限,则无法工作!

现在你可以将公钥添加到authorized_keys文件:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
必须将A的公钥添加到B的authorized_keys文件中!
你也可以使用以下命令:
ssh-copy-id [email protected]
这将把A的id_rsa.pub (在~/. ssh目录中)内容追加到B(192.168.100.102)的authorized_keys文件中。

方法2:
  1. SSH到服务器

在个人Windows电脑上用连接工具连接到服务器(例如:XShell、SecureCRT等)

  1. 设置密钥:
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ vi ~/.ssh/authorized_keys
# 小心准确地复制密钥并将它粘贴到编辑器窗口中的新行,确认它占用一行并保存。  
$ chmod 600 ~/.ssh/authorized_keys

五、验证免密登录

# 在A服务器上验证免密登录是否成功
$ ssh [email protected]


设置ssh权限:

$ vi /etc/ssh/sshd_config
# 将PermitRootLogin yes和PubkeyAuthentication yes取消注释之后重启sshd
$ service sshd restart

sftp常用命令:

  1. sftp user@ip
    在Linux的shell中执行上面的命令后,Linux shell会提示用户输入密码, 输入password 之后就成功建立了sftp连接。
  2. help
    建立连接后, Linux shell中的$变成sftp>。 执行help, 可以看sftp支持哪些命令。
  3. pwd和lpwd
    pwd是看远端服务器的目录, 即sftp服务器默认的当前目录。
    lpwd是看linux本地目录。
  4. ls和lls
    ls是看sftp服务器下当前目录下的内容
    lls是看linux当前目录下的内容。
  5. put a.txt
    这个是把linux当前目录下的a.txt文件上传到sftp服务器的当前目录下。
  6. get b.txt
    这个是把sftp服务器当前目录下的b.txt文件下载到linux当前目录下。
    $ get openssl-1.1.1i.tar.gz ~/
  7. !command
    这个是指在linux上执行command这个命令, 比如!ls是列举linux当前目录下的内容, !rm a.txt是删除linux当前目录下的a.txt文件。
    这个命令非常有用, 因为在sftp> 后输入命令, 默认只针对sftp服务器的, 所以执行rm a.txt删除的是sftp服务器上的a.txt文件, 而非本地的linux上的a.txt文件。
  8. exit和quit
    退出。

SSH设置别名访问远程服务器

使用cd ~/.ssh/ 进入ssh目录,会看到有 config、known_hosts 两个文件,一般没有设置的话,只会有known_hosts,可以使用touch config命令创建config文件。
使用vim编辑config文件,添加如下内容(或直接只用cat >> 添加内容):
cat >>~/.ssh/config<<EOF
Host xxx1
HostName 192.168.100.101
User root
IdentitiesOnly yes

Host xxx2
HostName 192.168.100.102
User root
IdentitiesOnly yes

Host xxx3
HostName 192.168.100.103
User root
IdentitiesOnly yes

Host xxx4
HostName 192.168.100.104
User root
IdentitiesOnly yes

Host xxx5
HostName 192.168.100.105
User root
IdentitiesOnly yes
EOF

其中:

  1. Host 后边的是名称,以后可以根据这个名称进行访问;
  2. HostName是你的主机IP地址;
  3. User为主机登录的用户名;
  4. IdentitiesOnly yes固有配置;

猜你喜欢

转载自blog.csdn.net/Laputa_Castle/article/details/117921673