本章主要介绍ssh远程登录系统和远程拷贝的方法。
- ssh的基本用法
- ssh无密码登录和安全设置
- ssh限制用户和其他设置
- Windows远程登录
- 远程拷贝
很多时候服务器并没有显示器,我们也不可能每次都通过控制台去管理服务器,这时就需
要远程登录。远程登录到服务器可以通过Telnet或ssh的方式。但是用Telnet登录,整个过
程都是以明文的方式传输的,不安全。所以,建议使用ssh的方式来登录,因为ssh在整个连
接过程中,数据都是加密的。
1.ssh的基本用法
语法:ssh 主机名/ip (/是或者的意思)
1)这里 如果没有指定用什么用户连接,则以当前用户连接。当第一次远程连接到服务器时,要记录服务器的公钥指纹信息。
[root@node02 ~]# ssh 192.168.182.200
The authenticity of host '192.168.182.200 (192.168.182.200)' can't be established.
ECDSA key fingerprint is SHA256:3cMgI+7W8GELajR0KarNlwXEody8ngbF3uHaM9Nagvg.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.182.200' (ECDSA) to the list of known hosts.
root@192.168.182.200's password:
上面如果输入的是no,则连接终止。输入yes,则保存在了当前用户家目录下
的.ssh/known_hosts文件中。
上面的命令中,我们并没有指定使用哪个用户连接到192.168.8.12,但它是以aaa用户
登录到192.168.182.200上的。
2)在node1上时没有aaa用户的
[root@node02 ~]# id aaa
id: “aaa”:无此用户
3)所以,输入密码都错误的。连续输入3次密码不正确就退出来,因为192.168.182.200上 根本没有aaa用户,但是有bbb用户,如下所示。
4)我们可以指定使用哪个用户名连接过去
语法:
- ssh 01 用户名 主机名 / IP
- ssh 用户名@主机名 / IP
建议使用第二个,现在以ccc的身份连接,命令如下
[bbb@node02 ~]$ ssh 192.168.182.200
bbb@192.168.182.200's password:
[bbb@node02 ~]$ ssh ccc@192.168.182.200
ccc@192.168.182.200's password:
Activate the web console with: systemctl enable --now cockpit.socket
This system is not registered to Red Hat Insights. See https://cloud.redhat.com/
To register this system, run: insights-client --register
[ccc@red01 ~]$
5)现在可以看到,此时已经正常连接过去了,要是退出时只需要输入 “exit” 即可
[ccc@red01 ~]$ exit
注销
Connection to 192.168.182.200 closed.
[bbb@node02 ~]$
6)如果连接时出现了图所示的错误,口要把家目录下的 .ssh/known_hosts删除,或者把 此文件中192.168.182.200对应的条目删除即可
2.ssh无密码登录
ssh远程登录到服务器时有两种认证方式。
1)密码认证
前面在node02上通过ssh连接到node1时,这里需要输入密码才能正常登录,这种就是密码认证,命令如下。
[bbb@node02 ~]$ ssh ccc@192.168.182.200
ccc@192.168.182.200's password:
2)密钥认证
如果做了密钥认证,远程登录时不需要密码就可以直接登 录。这里 node02上的lbbb准备以ccc身份无密码连接到 node01
1) 为了好描述,node02上的lbbb用户称为 bbb@node01上的 ccc用户称aaa@node01。 aaa@node01需要生成一个密钥对,命令如下。
[ccc@red01 ~]$ ssh-keygen -f ~/.ssh/id_rsa -N ""
Generating public/private rsa key pair.
Created directory '/home/ccc/.ssh'.
Your identification has been saved in /home/ccc/.ssh/id_rsa.
Your public key has been saved in /home/ccc/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Fp2oXmNQwMbUvcILBjTbZhU32PS+dSHAUkhXMjWXP/8 ccc@red01
The key's randomart image is:
+---[RSA 3072]----+
| .o+oo=BB*o+ ..|
| .++oo*+=+ o. |
| .o=.o +... ..|
| oooo... ..o|
| ...So . . +|
| . +.. o ..|
| . . .|
| E|
| |
+----[SHA256]-----+
[ccc@red01 ~]$
2) 这条命令会生成一个密钥对(私钥和公钥),这里-f指定了生成私钥的路径和名称,如果 不指定,默认也是这个路径。-N后面的双引号中没有空格,意思是不对生成的私钥加密。 这样blab生成了自己的密钥对,存放在自己家目录的.ssh目录下,命令如下。
[ccc@red01 ~]$ ls .ssh/
id_rsa id_rsa.pub
[ccc@red01 ~]$
其中id_rsa 时私钥,id_rsa_pub时公钥
3)然后通过ssh-copy-id把公钥的内容存储在 bbb@node02家目录下 的.ssh/authorized_keys文件中,如果没有此文件,拷贝过去之后会自动创建。
4)下面执行ssh-copy-id命令,命令如下。
[ccc@red01 ~]$ ssh-copy-id bbb@192.168.182.210
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/ccc/.ssh/id_rsa.pub"
The authenticity of host '192.168.182.210 (192.168.182.210)' can't be established.
ECDSA key fingerprint is SHA256:vk0uj0tG0uSmMq2mMNwSlCIPyrY3fDHuX8DM0HP2WLE.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
bbb@192.168.182.210's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'bbb@192.168.182.210'"
and check to make sure that only the key(s) you wanted were added.
[ccc@red01 ~]$
5)这样ccc的公钥就存放在bbb@node02的家目录下的.ssh/authorized_keys 文件中了
[bbb@node02 ~]$ cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCnF1gOoFAUUhebTtRFBubJqkw8lXCR9Kap2ebw+LYhoKQp8g3DxLgMhma0IuTSHbbSqA+XwXuvnr9KOIMDUlhVB9gRXR6xGxn6qpAL94x++KX/p2N/eSjJRVRg6NO6QZo4RfBn4z0eerN/5urGlitWQPvGYSyDOXhqQH6U8znT+vn0JnTdIsZivtzIgGrW7Pk76PenKTM4uKnp9lK4GnxTCap1DYrFcFwmCv51lS7gZz+2LxRFbkM91/HAUvPePWFbvNS9AkyS++2J3r9CIJP9tkqe8INZOOTP3qCeu9fXJUip1aEINtVETDwUYEowgqZzxy/5LD9MOjK9uXzbc7eUvw/td/KpclrNmnSiwW5hLuqjH11TQemU3jGM7F/YdAms34CuMR527/o6vX/bJE0uhP+BIOKwYrdC2KAOXrYiCwsk7KDmZ0JYBgXry6wxR5nLJrRUyW9lnt01TvW+Mvkn6qUKrtSyEcvfkYCGgtCiS22uHj7Hw0tb32Gm+b2l97k= ccc@red01
[bbb@node02 ~]$
通过对比,发现这个文件内容就是ccc@node01的公钥内容。
6)下面远程登录测试。命令如下
[ccc@red01 ~]$ ssh bbb@192.168.182.210
Last login: Fri Dec 1 11:05:59 2023 from 192.168.182.1
[bbb@node02 ~]$
可以看到,已经无密码登录过去了。
3.ssh安全设置
前面已经讲了,ssh有两种认证方式:密码认证和密钥认证。ccc@node01r到 bbb@node02用的是密钥认证,其他用户的登录方式仍然是密码登录,现在想设置只能用 其中一种认证,是否可以?答案是可以的。
1.禁止用密钥登录
1)在node02上,以 root用户编辑/etc/ssh/sshd_config,找到 PubkeyAuthentication, 修改内容如下。
![](https://i-blog.csdnimg.cn/blog_migrate/14dd3d16500a5fa0734eb0a560826a2c.png)
2)将#PubkeyAuthentication yes修改为PubkeyAuthentication no(需要注意的是,这里前面的注释符#被删除了),这样就禁用了密钥登录,保存退出并重启sshd,命令如下。
[root@node02 ~]# systemctl restart sshd
3)此时已经禁用了密钥登录,只能密码登录,到node01上进程测试,这里只能使用密码登录,原来配置的密钥认证不再生效,命令如下
[ccc@red01 ~]$ ssh bbb@192.168.182.210
bbb@192.168.182.210's password:
Last login: Fri Dec 1 12:05:55 2023 from 192.168.182.210
[bbb@node02 ~]$
4)再次设置允许密钥登录(PubkeyAuthentication yes),修改内容如下。
![](https://i-blog.csdnimg.cn/blog_migrate/07081ed6d84bd2c42f5f4bf774df3c9b.png)
5)将PubkeyAuthentication no修改为PubkeyAuthentication yes,并重启sshd,命令如下。
[root@node02 ~]# systemctl restart sshd
2.禁用密码登录
1) 在node02上,以root用户编辑/etc/ssh/sshd_config,找到PasswordAuthentication, 修改内容如下。
![](https://i-blog.csdnimg.cn/blog_migrate/076ca1b4d1a5410329f366df4665a2a0.png)
2)将PasswordAuthentication yes修改为PasswordAuthentication no,这样就禁用了密码登录,保存退出并重启sshd,命令如下。
[root@node02 ~]# systemctl restart sshd
此时只允许密钥登录,不允许密码登录。
3)为了测试方便,在node02上创建ddd用户,密码设置为123456
[root@node02 ~]# useradd ddd //创建用户
[root@node02 ~]# echo 123456 | passwd --stdin ddd //打印密码到ddd用户
更改用户 ddd 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@node02 ~]#
4)在node01上进行验证,以bbb身份连接过去
[ccc@red01 ~]$ ssh bbb@192.168.182.210
bbb@192.168.182.210's password:
Last login: Fri Dec 1 12:05:55 2023 from 192.168.182.210
[bbb@node02 ~]$
[bbb@node02 ~]$
[bbb@node02 ~]$ ssh bbb@192.168.182.210
The authenticity of host '192.168.182.210 (192.168.182.210)' can't be established.
ECDSA key fingerprint is SHA256:vk0uj0tG0uSmMq2mMNwSlCIPyrY3fDHuX8DM0HP2WLE.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.182.210' (ECDSA) to the list of known hosts.
bbb@192.168.182.210: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
[bbb@node02 ~]$
可以看到,使用bbb登录192.168.182.210时是可以无密码登录的。
5)然后以ddd身份连接过去
[ccc@red01 ~]$ ssh ddd@192.168.182.210
ddd@192.168.182.210: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
[ccc@red01 ~]$
因为我们并没有做bob用户无密码登录到node02,只能使用密码登录,而密码登录被禁用,
所以ddd登录失败。
6)自行设置允许密码登录,修改/etc/ssh/sshd_config,如下所示
![](https://i-blog.csdnimg.cn/blog_migrate/cd16211c23726a6af4e2c32db1a82f6a.png)
7)将PasswordAuthentication no修改为PasswordAuthentication yes,并重启sshd,命令如下。
[root@node02 ~]# systemctl restart sshd
[root@node02 ~]#
8)再次使用ddd用户登录,可以看到可以正常登录了。
[ccc@red01 ~]$ ssh ddd@192.168.182.210
ddd@192.168.182.210's password:
Last failed login: Fri Dec 1 12:23:23 CST 2023 from 192.168.182.200 on ssh:notty
There was 1 failed login attempt since the last successful login.
[ddd@node02 ~]$
3.ssh限制用户
对于服务器上的有效用户,基本上都是可以通过 ssh 连按过去的,但是有时为了安全性 要禁用某些用户登录,如禁用root等。
1.禁止root用户登录
1)默认情况下,是可以用root登录到远端服务器的
[root@red01 ~]# ssh root@192.168.182.210
The authenticity of host '192.168.182.210 (192.168.182.210)' can't be established.
ECDSA key fingerprint is SHA256:vk0uj0tG0uSmMq2mMNwSlCIPyrY3fDHuX8DM0HP2WLE.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.182.210' (ECDSA) to the list of known hosts.
root@192.168.182.210's password:
Last failed login: Fri Dec 1 15:54:21 CST 2023 from 192.168.182.200 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Fri Dec 1 15:53:09 2023 from 192.168.182.1
[root@node02 ~]#
可以看到,root成功连接到了node02了
2)如果要禁用root用户登录,在node02用vim编辑器打开 /etc/ssh/sshd_config ,按如下内容修改。
3)将PermitRootLogin yes修改为PermitRootLogin no,保存退出并重启sshd。
[root@node02 ~]# systemctl restart sshd
4)此时就禁用root用户登录了,在node01上进行验证。
[root@red01 ~]# ssh root@192.168.182.210
root@192.168.182.210's password:
Permission denied, please try again.
root@192.168.182.210's password:
提示被拒绝,是因为不允许root用户登录,按【Ctrl+C】组合键终止。
如果允许root用户登录,按如下内容修改,将PermitRootLogin no修改为PermitRootLogin yes,然后重启sshd 即可。
2.禁用普通用户登录
1) 如果想禁用某普通用户,可以用DenyUsers选项实现,用法是打开/etc/ssh/sshd_config, 在任意一行添加 DenyUsers userX,就可以限制userX ssh登录了。如果需要在server2上禁 用bob用户ssh登录,可以用vim 编辑器打开/etc/ssh/sshd_config,在任意一行添加 DenyUsersbob,命令如下。
![](https://i-blog.csdnimg.cn/blog_migrate/fc8120b72671ac6657da29f0732d38fb.png)
2)这里就是禁用bob用户ssh 登录,保存退出并重启sshd,
[root@node02 ~]# systemctl restart sshd
3)然后到server上进行测试,命令如下。
[root@node02 ~]# ssh bbb@192.168.182.210
bbb@192.168.182.210's password:
Permission denied, please try again.
bbb@192.168.182.210's password:
提示被拒绝,是因为bob用户被限制登录了,按【Ctrl+C】组合键终止。
这里只是禁用了bob用户,并不影响其他用户登录。
类似的选项还有AllowUsers和 DenyGroups。
其中AllowUsers userX的意思是,只允许userX用户登录,不允许其他用户登录。
如果写成AllowUsers userX userY,意思是只允许userX和userY登录,不允许其他用户
登录。
拒绝优先
4.ssh其他设置
ssh的其他设置可以设置ssh的默认用户及解决ssh慢的问题。
1.设置ssh的默认用户
前面讲了在使用ssh登录时,如果没有指定用户则使用当前用户登录。其实我们也是可以指定默认用户的,即ssh登录时如果没有指定用户,则使用默认用户登录。
1)下面进行一个练习,在bbb@node02家目录下的.ssh目录中创建config文件,内容如下.
[ccc@red01 ~]$ cat .ssh/config
Host 192.168.182.210
User bbb
[ccc@red01 ~]$
这个设置的意思就是,当连接到192.168.26.102时,如果没有指定用户,则默认用的是tom用户。
2)需要注意的是,这里要把.ssh/config的权限改为644。
[ccc@red01 ~]$ chmod 644 .ssh/config
3)在node01上验证。
[ccc@red01 ~]$ ssh 192.168.182.210
Last failed login: Fri Dec 1 16:06:33 CST 2023 from 192.168.182.210 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Fri Dec 1 15:53:18 2023 from 192.168.182.1
[bbb@node02 ~]$
这里虽然没有指定用户名,但是可以看到是以tom身份连接。
4)首次连接某台机器时,都会提示我们是否保存那台机器的公钥指纹信息,让我们输人 yes/no,这里必须输人yes。如果想默认输人yes,即自动输人ves,可以修改.ssh/config∙内 容如下。
[ccc@red01 ~]$ cat .ssh/config
Host 192.168.182.210
User bbb
Host *
StrictHostKeyChecking no
[ccc@red01 ~]$
上述加粗字是新增加的,Host后面的*是通配符,表示所有主机。整体的意思是不管连接到哪台主机都不会再提示 yes/no了。
5)验证命令如下。
[ccc@red01 ~]$ rm -rf .ssh/known_hosts
[ccc@red01 ~]$ ssh 192.168.182.210
Warning: Permanently added '192.168.182.210' (ECDSA) to the list of known hosts.
Last login: Fri Dec 1 16:31:04 2023 from 192.168.182.200
[bbb@node02 ~]$
这里先清除已经保存的记录,即删除.ssh/known_hosts,然后重新登录,可以看到现在已经不提示我们输入yes/no了。
2.解决 ssh 慢的问题
有时我们在通过ssh登录到一台服务器时,连接的过程会比较慢,要等几十秒才能看到输入密码的提示。很多时候是因为系统自动去做反向解析,即把ssh 192.168.26.102中的192.168.182.210反向解析成主机名,才会导致ssh速度慢。
为了防止出现这个问题,可以修改服务器上的配置。用vim编辑器打开/etc/ssh/sshd_config,找到UseDNS,进行如下修改。
![](https://i-blog.csdnimg.cn/blog_migrate/24761df820732672f12c6c6b1e99340c.png)
将#UseDNS yes 修改为UseDNS no,这里同时把注释符#去掉了,然后重启sshd 即 可。
5.Windows远程登录
很多时候服务器上安装的是 Linux系统,但我们平时用的笔记本电脑是Windows系统,
如果要使用Windows远程登录,只要在Windows上安装ssh客户端,就可以登录到远端的
Linux服务器了。Windows中常见的ssh客户端包括PuTTY、Xshell、SecureCRT 等。
Windows中的这些客户端,大家根据自己的喜好自行下载使用即可。
6.远程拷贝
有时我们需要远程拷贝一些文件,例如,把文件或目录从A机器拷贝到B机器上,这种情况下我们一般用scp或rsync。
1)scp或 rsync利用的是ssh建立的通道,然后把文件传输过去,scp的用法如下
scp 文件路径 用户名@ip:目标路径
##拷贝目录需要加上 -r 选项
这里的意思是把本地的/opt/txt1文件拷贝到node02 IP这台机器的/opt 目录中。需要注
意的是,远程主机上目录的表示方式是“IP:目录”,冒号两边没有空格。如果拷贝目录需加
上选项。
2)先查看node02上 /opt 目录上的内容
[root@node02 ~]# ls /opt/
[root@node02 ~]#
3)然后到node01上拷贝 /opt/txt1 到 node02上的 /opt 目录中
[root@red01 ~]# scp -r /opt/txt1 root@192.168.182.210:/opt/
root@192.168.182.210's password:
[root@red01 ~]#
这样就把文件拷贝过去了,scp利用的是ssh建立的通道,如果没有指定使用哪个用户接到 192.168.182.210,则使用的是当前用户 root。
4)下面以bbb身份登录192.168.182.210并拷贝文件,命令如下。
[root@red01 ~]# scp /etc/hosts bbb@192.168.182.210:/opt
bbb@192.168.182.210's password:
scp: /opt/hosts: Permission denied
[root@red01 ~]#
因为192.168.26.102上的tom用户对 /opt没有写权限,所以拷贝过去时出现了“Permission denied”这样的报错信息。
5)把目录/boot/grub2拷贝到node02上的/opt目录中,命令如下。
[root@red01 ~]# scp /boot/grub2/ 192.168.182.210:/opt
root@192.168.182.210's password:
/boot/grub2: not a regular file
[root@red01 ~]#
结果是没有拷贝过去,因为/boot/grub2是一个目录
6)拷贝目录需要加上r选项,这样就把该目录拷贝过去了。命令如下。
[root@red01 ~]# scp -r /boot/grub2/ 192.168.182.210:/opt
7)到node02上查看,命令如下。
[root@node02 ~]# ls /opt
grub2 txt1
[root@node02 ~]#