当前位置: 首页 > news >正文

SSH常见运维总结

1 -bash: ssh: command not found

解决办法:"yum install -y openssh-server openssh-clinets"

ssh登录时提示:Read from socket failed: Connection reset by peer.

原因:/etc/ssh/下没有ssh*key*文件

解决:

  • ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
  • ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
  • ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key

然后再尝试远程连接,显示成功。

或者

直接重启服务

systemctl restart sshd

3 优化ssh远程登陆后提示信息

经常会使用中控机ssh信任跳转到其他机器上,但是不知道有没有运维朋友注意到ssh跳转成功后的终端显示的提示信息?
这些提示信息,是为了方便运维同学在第一时间知道ssh跳转到哪台目标机上,也是为了避免长期频繁跳转后由于大意造成的误入机器操作的风险,运维同学通常会在ssh跳转到目标机器后显示一些提示信息,在一些国家, 登入给定系统前, 给出未经授权或者用户监视警告信息, 将会受到法律的保护.如下:

[root@bastion-IDC ~]# ssh -p22 192.168.1.15
Last login: Fri Jul 15 13:26:53 2016 from 124.65.197.154
===================================
|||||||||||||||||||||||||||||||||||
===================================
HOSTNAME: monit-server
IPADDRES: 192.168.1.15
===================================
IDC监控机
===================================

那么上面的提醒信息是在哪设置的呢?
1)/etc/motd文件自定义

[root@monit-server ~]# cat /etc/motd
===================================
|||||||||||||||||||||||||||||||||||
===================================
HOSTNAME: monit-server
IPADDRES: 192.168.1.15
===================================
IDC监控机
===================================

2)在目标机器的/etc/ssh/sshd_config文件里定义,然后重启sshd服务即可。

[root@host-192-168-1-117 ~]#vim /etc/ssh/sshd_configBanner /etc/sshfile[root@host-192-168-1-117 ~]# cat /etc/sshfile
this is 192.168.1.117

远程登陆:

[root@linux-node2 ~]# ssh 192.168.1.117
this is 192.168.1.117
实现SSH无密码登录:使用ssh-keygen和ssh-copy-id

ssh-keygen 产生公钥与私钥对.
ssh-copy-id 将本机的公钥复制到远程机器的authorized_keys文件中,ssh-copy-id也能让你有到远程机器的/home/username/.ssh和~/.ssh/authorized_keys的权利.
操作记录:
1)在本地机器上使用ssh-keygen产生公钥私钥对

#ssh-keygen -t rsa //一路默认回车

这样就会在当前用户家目录下的.ssh目录里产生公钥和私钥文件:id_rsa.pub、id_rsa。可以将id_rsa.pub公钥文件复制成authorized_keys

2)可以手动将本机的id_rsa.pub公钥文件内容复制到远程目标机的.ssh/authorized_keys文件中,可以就可以实现ssh无密码登陆。
当然,也可以在本机直接使用ssh-copy-id将公钥复制到远程机器中

#ssh-copy-id -i /root/.ssh/id_rsa.pub user@ip [把本机的公钥拷贝到远程机器上,比如B机器]

也可以不加公钥路径,会默认加上

#ssh-copy-id user@ip

注意:ssh-copy-id 将key写到远程机器的 ~/ .ssh/authorized_key.文件(文件会自动创建)中。

对于非22端口(比如22222)情况下的ssh-copy-id的使用,需要这样用:# ssh-copy-id -i /root/.ssh/id_rsa.pub '-p 22222 root@192.168.18.18'

3)这样,本机登录到上面远程机器(B机器)就不用输入密码

#ssh user@ip 
 ssh登录失败,报错:Pseudo-terminal will not be allocated because stdin

现象:
需要登录线上的一台目标机器A,但是不能直接登录(没有登录权限),需要先登录B机器,然后从B机器跳转到A机器。
脚本如下:

localhost:~ root# cat IDC-7.sh
#!/bin/bash
ssh root@101.201.114.106 "ssh -p25791 root@103.10.86.7"

但是在执行脚本的时候报错如下:

Pseudo-terminal will not be allocated because stdin

原因:
伪终端将无法分配,因为标准输入不是终端。
解决办法:
需要增加-t -t参数来强制伪终端分配,即使标准输入不是终端。
在脚本里添加-t -t参数即可,如下:

localhost:~ root# cat IDC-7.sh
#!/bin/bash
ssh root@101.201.114.106 "ssh -t -t -p25791 root@103.10.86.7"

或者

localhost:~ root# cat IDC-7.sh
#!/bin/bash
ssh -t root@101.201.114.106 "ssh -t -t -p25791 root@103.10.86.7"
ssh远程登陆缓慢问题

解决办法:
编译/etc/ssh/sshd_config配置文件:

UseDNS no
GSSAPIAuthentication no

然后重启sshd服务即可!

ssh登录出现:permission denied(publickey.gssapi-with-mic)

解决方法:
修改/etc/ssh/sshd-config文件,将其中的:

PermitRootLogin no修改为yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys前面加上#屏蔽掉
PasswordAuthentication no修改为yes

最后重启sshd服务即可!

ssh连接错误问题

1)在使用ssh或scp或rsync远程连接的时候,出现报错

报错信息:

Address **** maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!

解决方法:
修改本机ssh_config文件

[root@kvmserver ~]# vim /etc/ssh/ssh_config
GSSAPIAuthentication no
[root@kvmserver ~]#/etc/init.d/sshd restart

问题迎刃而解。

2)  本机scp、rsync命令都已具备,但是在使用scp或rsync远程同步的时候报错

报错信息:

bash: scp: command not found
bash: rsync: command not found

原因:是由于远程机器上没有安装scp或rsync造成的!安装这两个命令即可~

yum install openssh-clients
yum install rsync

3)远程ssh连接时错误“ The X11 forwarding request was rejected!”
解决方法:
将sshd_config中 设置 X11Forwarding yes
重启sshd服务。

ssh连接超时被踢出问题

当使用xshell,SecureCRT等客户端访问linux服务器,有时候会出现终端定期超时被踢出的情况。
下面介绍三种方法来防止超时被踢出的方法,后两种情况的设置方法以及通过设置shell变量来达到此目的的方法:

1)配置服务器
# vim /etc/ssh/sshd_config
找到 ClientAliveInterval参数,如果没有就自己加一行,数值是秒,比如你设置为120 ,则是2分钟
ClientAliveInterval 120
找到 ClientAliveCountMax参数,如果没有就自己加一行,指如果发现客户端没有响应,则判断一次超时,这个参数设置允许超时的次数。如3 、5等自定义

修改两项参数后如下:

ClientAliveInterval 120
ClientAliveCountMax 3                      //0 不允许超时次数
  • ClientAliveInterval指定了服务器端向客户端请求消息的时间间隔, 默认是0,不发送.ClientAliveInterval 60表示每分钟发送一次, 然后客户端响应, 这样就保持长连接了.
  • ClientAliveCountMax, 使用默认值3即可.ClientAliveCountMax表示服务器发出请求后客户端没有响应的次数达到一定值, 就自动断开. 正常情况下, 客户端不会不响应.

重新加载sshd服务。退出客户端,再次登陆即可验证。

# /etc/init.d/ssh restart

2)配置客户端
#vim /etc/ssh/ssh_config
然后找到里面的
ServerAliveInterval
参数,如果没有你同样自己加一个就好了
参数意义相同,都是秒数,比如5分钟等
ServerAliveInterval 300

3)配置超时

# echo export TMOUT=1000000 >> /root/.bash_profile; source .bash_profile
在Linux 终端的shell环境中通过设置环境变量TMOUT来阻止超时。如果显示空白,表示没有设置, 等于使用默认值0, 一般情况下应该是不超时. 如果大于0, 可以在如/etc/profile之类文件中设置它为0.

10 ssh远程登陆,公钥授权不通过:Permission denied (publickey,gssapi-keyex,gssapi-with-mic)

公司IDC机房服务器,之前做了跳板机环境,其他机器只允许从跳板机ssh无密码信任过去,并且在信任关系做好后,禁用了其他机器的密码登陆功能(sshd_config文件里设置“PermitEmptyPasswords no”)

后来跳板机出现了问题,打算重装这台机器,重装前取消了其他机器里只允许跳板机ssh信任关系,并且恢复了密码登陆功能:

[root@bastion-IDC ssh]# vim /etc/ssh/sshd_config
PermitEmptyPasswords yes
[root@bastion-IDC ssh]# service sshd restart

修改后,当时在其他机器间是可以ssh相互登陆,当时没在意,以为一切ok了。
可是,到了第二天,再次ssh登陆时,又报错了~~
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

最后发现是selinux惹的祸!关闭它即可。
1)临时关闭selinux

[root@bastion-IDC ssh]# setenforce 0
[root@bastion-IDC ssh]# getenforce
Permissive

2)永久关闭

[root@bastion-IDC ssh]# vim /etc/sysconfig/selinux
SELINUX=disabled
[root@bastion-IDC ssh]# reboot #重启系统才能生效

说明:
1)ssh可同时支持publickey和password两种授权方式,publickey默认不开启,需要配置为yes。
如果客户端不存在.ssh/id_rsa,则使用password授权;存在则使用publickey授权;如果publickey授权失败,依然会继续使用password授权。

2)GSSAPI身份验证.
GSSAPIAuthentication 是否允许使用基于 GSSAPI 的用户认证.默认值为"no".仅用于SSH-2.
GSSAPICleanupCredentials 是否在用户退出登录后自动销毁用户凭证缓存。默认值是"yes".仅用于SSH-2.

需要特别注意的是:
GSSAPI是公共安全事务应用程序接口(GSS-API)
公共安全事务应用程序接口以一种统一的模式为使用者提供安全事务,由于它支持最基本的机制和技术,所以保证不同的应用环境下的可移植性.
该规范定义了GSS-API事务和基本元素,并独立于基本的机制和程序设计语言环境,并借助于其它相关的文档规范实现.

如果我们在服务端打开GSSAPIAuthentication配置项,如下:

[root@server ~]#vim /etc/ssh/sshd_config
........
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes

那么在客户端登录服务端会用gssapi-keyex,gssapi-with-mic进行身份校验,同样客户端也要支持这种身份验证,如下:

[root@client ~]#vim /etc/ssh/ssh_config
GSSAPIAuthentication yes
GSSAPIDelegateCredentials yes

我们在客户端连接SSH服务端,如下:

ssh -v 192.168.1.11
.................
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password

我们看到如下的信息:

debug1: Unspecified GSS failure. Minor code may provide more information
No credentials cache found
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: gssapi-keyex
debug1: No valid Key exchange context

说明SSH登录时采用GSSAPI的方式进行身份验证,但我们的系统不支持.

最后如果我们不用这种方式进行身份验证的话,建议关闭这个选项,这样可以提高验证时的速度.

11 ssh自定义安全设置

1)  为了ssh登陆的时候加一层保护,可以修改默认端口。修改ssh服务配置文件/etc/ssh/sshd_config

port 2222

这样远程连接时加端口

#ssh 192.168.1.83 -p 2222

2)  ssh使用时加-l后面跟用户名,表示登陆到对方的这个用户下面。

#ssh -l wangshibo 192.168.1.83 -p 2222
等同于
#ssh wangshibo@192.168.1.83 -p 2222

3)  限制ssh登陆的来源ip,白名单设置(hosts.allow优先级最高,具体参考:Linux服务器安全登录设置记录)
一是通过iptables设置ssh端口的白名单,如下设置只允许192.168.1.0/24网段的客户机可以远程连接本机

#vim /etc/sysconfig/iptables
-A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 2222 -j ACCEPT

二是通过/etc/hosts.allow里面进行限制(如下),/etc/hosts.deny文件不要任何内容编辑,保持默认!

#vim /etc/hosts.allow
sshd:192.168.1.*,192.168.9.*,124.65.197.154,61.148.60.42,103.10.86.7:allow
sshd:all:deny

4)仅允许特定的用户通过SSH登陆
如不允许root用户登录;
只允许几个指定的用户登录(比如wangshibo、guohuihui、liuxing用户)
禁止某些指定的用户登录(比如zhangda,liqin用户)
但是要注意:设置的这几个用户必须同时存在于本机和对方机器上
修改ssh服务配置文件/etc/ssh/sshd_config

PermitRootLogin no //将yes修改为no
AllowUsers      wangshibo guohuihui liuxing //这个参数AllowUsers如果不存在,需要手动创建,用户之间空格隔开
DenyUsers      zhagnda liqin //这个参数DenyUsers如果不存在,需要手动创建,用户之间空格隔开

也可以设置仅允许某个组的成员通过ssh访问主机。

AllowGroups wheel ops

实例说明:

1)只允许指定用户进行登录(白名单):
在 /etc/ssh/sshd_config 配置文件中设置 AllowUsers 选项。格式如下:AllowUsers    root grace kevin app         
表示只允许grace用户、kevin用户通过ssh登录本机。AllowUsers    root@192.168.10.10 app@192.168.10.11 kevin@192.168.10.13         
表示只允许从192.168.10.10登录的root用户、从192.168.10.11登录的app用户、从192.168.10.13登录的kevin用户可以通过ssh登录本机。2)只拒绝指定用户进行登录(黑名单):)
在/etc/ssh/sshd_config配置文件中设置DenyUsers选项。格式如下:  DenyUsers    wangbo linan zhangyang    
表示拒绝wangbo、linan和zhangyang用户通过ssh登录本机。需要注意的是:
- AllowUsers、DenyUsers跟后面的配置之间使用TAB键进行隔开
- 多个百名单或黑名单之间使用空格隔开例子:
[root@Centos6 ~]# cat /etc/ssh/sshd_config
.......
AllowUsers    root@192.168.10.202 app@192.168.10.200 kevin@192.168.10.202
[root@Centos6 ~]# /etc/init.d/sshd restart[root@Centos6 ~]# cat /etc/ssh/sshd_config
.......
AllowUsers    root app kevin
[root@Centos6 ~]# /etc/init.d/sshd restart[root@Centos6 ~]# cat /etc/ssh/sshd_config
.......
DenyUsers    wangbo linan zhangyang
[root@Centos6 ~]# /etc/init.d/sshd restart如下,由于已经允许了app和root登录,则后面针对root@192.168.10.202和app@192.168.10.200的限制就无效了(两者别放在一起配置)
[root@Centos6 ~]# cat /etc/ssh/sshd_config
.......
AllowUsers    app root root@192.168.10.202 app@192.168.10.200
[root@Centos6 ~]# /etc/init.d/sshd restart

########  还可以使用pam规则限制ssh登录  ########

1)允许指定的用户(比如kevin、grace账号)进行登录
在/etc/pam.d/sshd文件第一行加入,一定要在第一行,因为规则是自上而下进行匹配的。
auth required pam_listfile.so item=user sense=allow file=/etc/sshusers onerr=fail然后在/etc下建立sshusers文件,编辑这个文件,加入你允许使用ssh服务的用户名,不用重新启动sshd服务。
最后重启sshd服务即可!操作如下:
[root@docker-test1 ~]# vim /etc/pam.d/sshd
#%PAM-1.0
auth required pam_listfile.so item=user sense=allow file=/etc/sshusers onerr=fail
........[root@docker-test1 ~]# touch /etc/sshusers
[root@docker-test1 ~]# vim /etc/sshusers
kevin
grace[root@docker-test1 ~]# /etc/init.d/sshd restart2)pam规则也可以写成deny的。比如拒绝kevin、grace账号进行登录
操作如下:
[root@docker-test1 ~]# vim /etc/pam.d/sshd
#%PAM-1.0
auth required pam_listfile.so item=user sense=deny file=/etc/sshusers onerr=succeed
........[root@docker-test1 ~]# touch /etc/sshusers
[root@docker-test1 ~]# vim /etc/sshusers
kevin
grace[root@docker-test1 ~]# /etc/init.d/sshd restart3)pam规则可以使用group限制。允许规则:
auth required pam_listfile.so item=group sense=allow file=/etc/security/allow_groups onerr=fail禁止规则:
auth required pam_listfile.so item=group sense=deny file=/etc/security/deny_groups onerr=succeed操作如下:
[root@docker-test1 ~]# vim /etc/pam.d/sshd  
#%PAM-1.0
auth required pam_listfile.so item=group sense=allow file=/etc/security/allow_groups onerr=fail新建一个组,组名为bobo,然后将kevin和grace添加到这个bobo组内
[root@docker-test1 ~]# groupadd bobo
[root@docker-test1 ~]# gpasswd -a kevin bobo
Adding user kevin to group bobo
[root@docker-test1 ~]# usermod -G bobo grace
[root@docker-test1 ~]# id kevin
uid=1000(kevin) gid=1000(kevin) groups=1000(kevin),1002(bobo)
[root@docker-test1 ~]# id grace
uid=1001(grace) gid=1001(grace) groups=1001(grace),1002(bobo)在/etc/security/allow_groups文件按中加入组名(注意如果不加root,则root就不能被允许登录了)
[root@docker-test1 ~]# vim /etc/security/allow_groups
bobo[root@docker-test1 ~]# /etc/init.d/sshd restart如上设置后,则只有kevin用户能被允许登录!
如果是禁止规则,则第一行改为下面内容:
auth required pam_listfile.so item=group sense=deny file=/etc/security/deny_groups onerr=succeed

除此之外,禁止某些用户ssh登录,可以 使用passwd或usermod命令进行账号锁定。

5)取消密码验证,只用密钥对验证
修改ssh服务配置文件/etc/ssh/sshd_config

PasswordAuthentication no
PubkeyAuthentication yes

6)给账号设置强壮的密码:将密码保存到文本进行复制和粘帖就可以了

# yum -y install expect
# mkpasswd -l 128 -d 8 -C 15 -s 10                                  
lVj.jg&sKrf0cvtgmydqo7qPotxzxen9mefy?ej!kcaX2gQrcu2ndftkeamllznx>iHikTagiVz0$cMtqOcIypkpd,vvD*kJhs3q@sb:CiCqgtqdqvse5lssfmranbtx

参数说明:

  • -l 密码长度
  • -d 多少个数字
  • -C 大写字母个数
  • -s 特殊符号的个数

7)只允许通过指定的网络接口来访问SSH服务,(如果本服务器有多个IP的时候)
仍然是修改/etc/ssh/sshd_config,如下:

ListenAddress 192.168.1.15                //默认监听的是0.0.0.0

这样,就只允许远程机器通过ssh连接本机的192.168.1.15内网ip来进行登陆了。

8)禁止空密码登录
如果本机系统有些账号没有设置密码,而ssh配置文件里又没做限制,那么远程通过这个空密码账号就可以登陆了,这是及其不安全的!
所以一定要禁止空密码登陆。修改/etc/ssh/sshd_config,如下:

PermitEmptyPasswords no //这一项,默认就是禁用空密码登陆

9) ssh_config和sshd_config
ssh_config和sshd_config都是ssh服务器的配置文件,二者区别在于,前者是针对客户端的配置文件,后者则是针对服务端的配置文件。两个配置文件都允许你通过设置不同的选项来改变客户端程序的运行方式。sshd_config的配置一般都比较熟悉,下面单独说下ssh_config针对客户端的配置文件:


[root@dns01 dns_rsync]# cat /etc/ssh/ssh_config
# Site-wide defaults for various optionsHost *ForwardAgent noForwardX11 noRhostsAuthentication noRhostsRSAAuthentication noRSAAuthentication yesPasswordAuthentication yesFallBackToRsh noUseRsh noBatchMode noCheckHostIP yesStrictHostKeyChecking noIdentityFile ~/.ssh/identityPort 22Cipher blowfishEscapeChar ~下面对上述选项参数逐进行解释:
# Site-wide defaults for various options
带“#”表示该句为注释不起作,该句不属于配置文件原文,意在说明下面选项均为系统初始默认的选项。说明一下,实际配置文件中也有很多选项前面加有“#”注释,虽然表示不起作用,其实是说明此为系统默认的初始化设置。
Host *
"Host"只对匹配后面字串的计算机有效,“*”表示所有的计算机。从该项格式前置一些可以看出,这是一个类似于全局的选项,表示下面缩进的选项都适用于该设置,可以指定某计算机替换*号使下面选项只针对该算机器生效。
ForwardAgent no
"ForwardAgent"设置连接是否经过验证代理(如果存在)转发给远程计算机。
ForwardX11 no
"ForwardX11"设置X11连接是否被自动重定向到安全的通道和显示集(DISPLAY set)。
RhostsAuthentication no
"RhostsAuthentication"设置是否使用基于rhosts的安全验证。
RhostsRSAAuthentication no
"RhostsRSAAuthentication"设置是否使用用RSA算法的基于rhosts的安全验证。
RSAAuthentication yes
"RSAAuthentication"设置是否使用RSA算法进行安全验证。
PasswordAuthentication yes
"PasswordAuthentication"设置是否使用口令验证。
FallBackToRsh no
"FallBackToRsh"设置如果用ssh连接出现错误是否自动使用rsh,由于rsh并不安全,所以此选项应当设置为"no"。
UseRsh no
"UseRsh"设置是否在这台计算机上使用"rlogin/rsh",原因同上,设为"no"。
BatchMode no
"BatchMode":批处理模式,一般设为"no";如果设为"yes",交互式输入口令的提示将被禁止,这个选项对脚本文件和批处理任务十分有用。
CheckHostIP yes
"CheckHostIP"设置ssh是否查看连接到服务器的主机的IP地址以防止DNS欺骗。建议设置为"yes"。
StrictHostKeyChecking no
"StrictHostKeyChecking"如果设为"yes",ssh将不会自动把计算机的密匙加入"$HOME/.ssh/known_hosts"文件,且一旦计算机的密匙发生了变化,就拒绝连接。
IdentityFile ~/.ssh/identity
"IdentityFile"设置读取用户的RSA安全验证标识。
Port 22
"Port"设置连接到远程主机的端口,ssh默认端口为22。
Cipher blowfish
“Cipher”设置加密用的密钥,blowfish可以自己随意设置。
EscapeChar ~
“EscapeChar”设置escape字符。<br>
=================================================================================
比如说,A机器的ssh端口是22,B机器的端口是22222,一般来说A机器ssh连接B机器的时候是使用-p22222指定端口。但是可以修改A机器的/etc/ssh/ssh_config文件中的
Port为22222,这样A机器ssh连接的时候就默认使用22222端口了。

########  去掉SSH公钥检查的方法(交互式yes/no)########

SSH公钥检查是一个重要的安全机制,可以防范中间人劫持等黑客攻击。但是在特定情况下,严格的 SSH 公钥检查会破坏一些依赖SSH协议的自动化任务,就需要一种手段能够绕过SSH的公钥检查。
SSH连接远程主机时,会检查主机的公钥。如果是第一次连接该主机,会显示该主机的公钥摘要,弹出公钥确认的提示,提示用户是否信任该主机(Yes/no)。当选择Yes接受,就会将该主机的公钥追加到文件 ~/.ssh/known_hosts 中。当再次连接该主机时,就不会再提示该问题了。
SSH公钥检查有好处,但首次连接时会导致某些自动化任务中断,或者由于 ~/.ssh/known_hosts 文件内容清空,导致自动化任务中断。

去掉SSH公钥检查的方法:
1)SSH客户端的StrictHostKeyChecking 配置指令,可以实现当第一次连接服务器时,自动接受新的公钥。只需要修改 /etc/ssh/ssh_config 文件,包含下列语句:

StrictHostKeyChecking no

2)或者在ssh连接命令中使用-oStrictHostKeyChecking=no参数

[root@puppet ~]# ssh -p22222 172.168.1.33 -oStrictHostKeyChecking=no
或者
[root@puppet ~]# ssh -p22222 172.168.1.33 -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no

########  ssh 登陆忽略known_hosts文件  ########
使用ssh登录远程机器,同时会把ssh信息记录在本地的~/.ssh/known_hsots文件中。如果出现ssh冲突了,需要手动删除或修改known_hsots里面对应远程机器的ssh信息。那么如果忽略掉这个known_hosts的访问? 操作如下:
1)修改/etc/ssh/sshd_config 配置文件中的选项 IgnoreUserKnownHosts 改成 yes,重启sshd服务即可。
2)如果还是不行,就在/etc/ssh/sshd_config 配置文件中再加入一下几行,然后再重启sshd服务。

StrictHostKeyChecking no
UserKnownHostsFile /dev/null

########  ansible中取消ssh交换式yes/no  ########
配置文件/etc/ansible/ansible.cfg的 [defaults] 中(打开注释)
# uncomment this to disable SSH key host checking

host_key_checking = False 

########  ssh只允许使用key登录, 禁止使用密码登录  ########
1)  生产公私钥文件

# ssh-keygen -t rsa

上面命令一路回车, 此时在/root/.ssh/目录下生成了2个文件,id_rsa为私钥,id_rsa.pub为公钥。
私钥自己下载到本地电脑妥善保存(丢了服务器可就没法再登陆了),为安全,建议删除服务器端的私钥。公钥则可以任意公开。

使用以下命令将公钥导入到系统中:

# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

2)  修改SSH的配置文件/etc/ssh/sshd_config 

# vim /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

#默认PasswordAuthentication 为yes,即允许密码登录,改为no后,禁止密码登录

PasswordAuthentication no

3)  重启SSH服务

# /etc/init.d/sshd restart

4)  使用私钥登录xshell或securecrt客户端了

########  SSH服务启动报错案例  ########
在某台服务器上部署了sftp服务,最后发现sftp远程登录正常,但是ssh远程登录失败(尽管已经输入了正确的用户名和密码)。


[root@kevin ssh]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd:/etc/ssh/sshd_config line 81: Unsupported option GSSAPIAuthentication
/etc/ssh/sshd_config line 83: Unsupported option GSSAPICleanupCredentials
Starting sshd: [ OK ]如上启动后,远程ssh登录这台机器,输入正确的用户名和密码,则会登录失败!![root@kevin ssh]# ssh -V
OpenSSH_7.6p1, OpenSSL 1.0.1e-fips 11 Feb 2013原因是新版本的openssh不支持以上参数,需要修改sshd的配置文件。
修改内容如下,否则还是无法通过ssh登录这台服务器:
[root@kevin ssh]# vim /etc/ssh/sshd_config
.......
##去掉前面的注释,允许root通过ssh登录
PermitRootLogin yes
##注释掉下面三个参数
#GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes
#UsePAM yes再次重启ssh,上面的报错信息就没有了。此时远程ssh登录就OK了!
[root@kevin ssh]# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]

########  SSH连接超时时间(timed out)设置  ########

1)使用下面命令连接,可以减少ssh连接超时等待的时间

# ssh -o ConnectTimeout=5 -p22 root@172.16.60.20

或者

修改sshd_config文件里面的UseDNS 选项,改为

UseDNS no

2)设置SSH超时时间的方法

# vim /root/.bash_profile export TMOUT=1000000#以秒为单位。或者修改/etc/profile文件也可以。# source /root/.bash_profile# vim /etc/ssh/sshd_configClientAliveInterval=60# service sshd restart

意思是每过一分钟,sshd都会和ssh client打个招呼 (即服务器端给客户端发送一个"空包"),检测它是否存在,如果不存时则断开连接!

注意:设置完成后,要退出ssh远程连接,再次登录后才可以生效。因为要再读取一次~/bash_profile文件。

总结:

在ClientAliveInterval(/etc/ssh/sshd_config)、环境变量TMOUT(在/etc/profile或.bash_profile中设置)以及putty的"Seconds between keepalives"(默认为0)这些设置方法中,经检测验证,只有TMOUT可以控制ssh连接在空闲时间超时,自动断开连接的时间,数字单位为"秒"。在设置了TMOUT后(非0),另外两个变量则不起作用的。

特别提醒的是,设置好ssh的登录超时时间以后,记得退出重新登录或重启系统,以使配置生效。

3)SSH禁止超时设置

SSH默认过一段时间会超时,有时候正在执行着脚本,出去一会回来就断开了,输出信息都看不到了,很是无奈!

其实禁止SSH自动超时最简单的办法就是:每隔一段时间在客户端和服务器之间发送一个"空包"!!!!!

至于到底是从客户端发给服务器,还是服务器发给客户端其实都不重要,重要的是需要它们之间要有通信。

下面介绍两种阻止SSH连接超时的方法(推荐方法二):

方法一:客户端阻止SSH超时编辑本地的SSH配置文件:~/.ssh/config

# vim ~/.ssh/configServerAliveInterval 120

这个设置会让客服端机器在使用SSH连接服务器时,每隔120秒给服务器发送一个"空包",保持它们之间的连接。

方法二:服务器端阻止SSH超时如果有服务器端的root权限,可以在服务端进行配置,这样就不需要每个客户端都单独配置。
 

# vim /etc/ssh/sshd_configClientAliveInterval 120ClientAliveCountMax 720

第一行,表示每隔120秒向客户端发送一个"空包",以保持于客户端的连接。

第二行,表示总共发送720次"空包",之后断开它们之间的连接,也就是:120秒 × 720 = 86400 秒 = 24小时 后。

最后重启sshd服务,再打开新终端进行ssh连接就可以了,在24小时内不会出现连接超时。# /etc/init.d/ssh restart

######## SSH公钥下发无效 ########
ssh的.pub公钥已经拷贝到远程主机的.ssh/authorized_keys文件里,但是ssh跳转时,仍然要输入密码!!即公钥下发后,ssh信任关系没有生效!

解决办法:
1)远程主机对应用户家目录下的.ssh目录必须是700或755权限,绝不能是775或777权限!即只对该用户有写权限!(一般设置700权限)
2)远程主机对应用户家目录下的.ssh/authorized_keys文件权限必须是600权限!即只对该用户有写权限!(一般设置600权限)
3)远程主机对应用户家目录的权限必须是700或755权限,绝不能是775或777权限!即只对该用户有写权限!(一般设置700权限),大多数情况下都是由于这个原因导致的!!!如果.ssh目录和.ssh/authorized_keys文件权限对别的用户有写权限,则就会导致ssh认证失败!=====================================================================================================
例如在一次ansible自动化部署中,之前配置好的ssh信任关系失效,报错如下:
{"changed": false, "msg": "SSH Error: data could not be sent to remote host \"172.16.60.240\". Make sure this host can be reached over ssh", "unreachable": true}查看现象,发现之前配置好的ssh信任关系失效了!!
[root@bz3devjenci1002 lx0319]# ssh -p22 kevin@172.16.60.240          
Authorized only. All activity will be monitored and reported
kevin@172.16.60.240's password:分析原因及解决办法:
登录172.16.60.240这台机器的kevin用户下,发现authorized_keys文件里确实已经传入了ansible主节点的id_rsa.pub公钥内容,并且下面两个权限都正确:
[kevin@bz4autestap1002 ~]$ ll -d .ssh
drwx------ 2 kevin kevin 4096 Jul 24 10:48 .ssh         #700权限是正确的[kevin@bz4autestap1002 ~]$ ll .ssh/authorized_keys
-rw------- 1 kevin kevin 2412 Jul 24 10:45 .ssh/authorized_keys     #600权限也是正确的然后查看kevin用户目录权限,发现是777!这才是问题根源!该用户目录权限不能对别的用户有写权限,否则会造成ssh认证失败!
[kevin@bz4autestap1002 ~]$ ll -d /home/kevin
drwxrwxrwx 14 kevin kevin 4096 Jul 24 10:48 /home/kevin修改为600权限即可
[kevin@bz4autestap1002 ~]$ chmod 600 /home/kevin
[kevin@bz4autestap1002 ~]$ ll -d /home/kevin
drwx------ 14 kevin kevin 4096 Jul 24 10:48 /home/kevin再次在远程尝试ssh认证跳转
[root@bz3devjenci1002 lx0319]# ssh -p22 kevin@172.16.60.240 
[kevin@bz4autestap1002 ~]$

########  Centos7修改ssh默认端口的方法  ########

CentOS 7 对于防火墙这一块的设置有一定的修改,修改ssh端口后,必须关闭防火墙和selinux之后才能正常重启sshd服务,否则启动失败。操作记录如下:
1)修改/etc/ssh/sshd_config                         #这个是修改ssh服务端配置文件。
[root@k8s-master01 ~]# vim /etc/ssh/sshd_config
.........
#Port 22         #这行最好去掉#号,防止配置失效以后不能远程登录,还得去机房修改,等修改以后的端口能使用以后在注释掉
Port 6666       #下面添加这一行[root@k8s-master01 ~]# vim /etc/ssh/ssh_config    #这个是修改ssh客户端配置文件,一般可以不用修改。
........
#   Port 22Port 6666======================================================================================================
ssh客户端配置文件使用场景:
比如A机器的/etc/ssh/ssh_config客户端配置文件的ssh端口是22,B机器的/etc/ssh/sshd_config服务端配置文件是6666
那么A机器ssh连接B机器时就要带上"-p6666", 如果A机器的ssh客户端配置文件的端口也是6666的话,就可以直接ssh连接B机器了。
======================================================================================================2)要关闭防火墙和selinux。否则,centos7修改ssh端口后会启动sshd服务失败!一定要注意这个!
[root@k8s-master01 ~]# systemctl disable firewalld
[root@k8s-master01 ~]# systemctl stop firewalld
[root@k8s-master01 ~]# firewall-cmd --state
not running[root@k8s-master01 ~]# cat /etc/sysconfig/selinux
.......
SELINUX=disabled
[root@k8s-master01 ~]# setenforce 0
[root@k8s-master01 ~]# getenforce
Disabled这样,在修改ssh端口后,就能顺利启动sshd服务了!======================================================================================================
这里还需要注意下:如果是打开了防火墙或selinux,则需要将修改的sshd端口添加到对应的防火墙规则中(默认只加了ssh的22端口)a)firewalld配置
添加到防火墙:
# firewall-cmd --zone=public --add-port=6666/tcp --permanent (permanent是保存配置,不然下次重启以后这次修改无效)
重启:
#firewall-cmd --reload查看添加端口是否成功,如果添加成功则会显示yes,否则no
# firewall-cmd --zone=public --query-port=6666/tcpb)selinux配置
使用以下命令查看当前SElinux 允许的ssh端口:
# semanage port -l | grep ssh添加6666端口到 SELinux
# semanage port -a -t ssh_port_t -p tcp 6666然后确认一下是否添加进去
# semanage port -l | grep ssh如果成功会输出
ssh_port_t                    tcp    6666, 22c)然后就可以顺利启动sshd服务了。

相关文章:

SSH常见运维总结

1 -bash: ssh: command not found 解决办法&#xff1a;"yum install &#xff0d;y openssh-server openssh-clinets" 2 ssh登录时提示&#xff1a;Read from socket failed: Connection reset by peer. 原因&#xff1a;/etc/ssh/下没有ssh*key*文件 解决&…...

uni app 扫雷

闲来无聊。做个扫雷玩玩吧&#xff0c;点击打开&#xff0c;长按标记&#xff0c;标记的点击两次或长按取消标记。所有打开结束 <template><view class"page_main"><view class"add_button" style"width: 100vw; margin-bottom: 20r…...

MATLAB绘制堆叠填充图--巧用句柄

MATLAB绘制堆叠填充图–巧用句柄 目录 MATLAB绘制堆叠填充图--巧用句柄1. 主要原理讲解1.1 主要函数1.2 句柄原理 2. 绘图示例2.1 准备数据2.2 绘制堆叠填充图-使用句柄控制图形属性2.3 设置填充颜色和样式2.4 添加标题和标签2.5 绘图效果 3. 结语 堆叠填充图是一种常见的数据可…...

JQuery的定义

jQuery是一个js库&#xff0c;使用jQuery会比js简单一点 jQuery文件是一个自执行函数 jQuery文件是一个自执行函数 $传递的参数不同&#xff0c;效果也不同&#xff1a; 传递的是匿名函数&#xff0c;那$就是一个入口函数&#xff0c;传递的是一个字符串&#xff0c;那$就…...

【操作系统】FCFS、SJF、HRRN、RR、EDF、LLF调度算法及python实现代码

文章目录 一、先来先服务调度算法&#xff08;FCFS&#xff09; 二、短作业优先调度算法&#xff08;SJF&#xff09; 三、高响应比优先调度算法&#xff08;HRRN&#xff09; 四、轮转调度算法&#xff08;RR&#xff09; 五、最早截至时间优先算法&#xff08;EDF&#…...

Image-Adaptive YOLO for Object Detection in Adverse Weather Conditions(IA-YOLO)

1、总体概述 基于深度学习的目标检测在常规条件的数据集可以获得不错的结果&#xff0c;但是在环境、场景、天气、照度、雾霾等自然条件的综合干扰下&#xff0c;深度学习模型的适应程度变低&#xff0c;检测结果也随之下降&#xff0c;因此研究在复杂气象条件下的目标检测方法…...

Mac电脑Jmeter集成到Jenkins,压测多个接口并生成测试报告

Jenkins支持的JDK版本17、21&#xff0c;通过java -version查看当前JDK版本&#xff0c;确认是否匹配 打开网址https://www.jenkins.io/download 点击下载&#xff0c;选择mac版本 commend空格打开终端&#xff0c;输入安装命令brew install jenkins 安装完成后输入brew servi…...

redis-Hash

一&#xff0c;应用场景 Redis hash 是一个string类型的field和value的映射表&#xff0c;hash特别适合用于存储对象。Set就是一种简化的Hash,只变动key,而value使用默认值填充。 可以将一个Hash表作为一个对象进行存储&#xff0c;表中存放对象的信息。 二&#xff0c;命令 H…...

Kubernetes kafka系列 | Strimzi 部署kafka-bridge

Strimzi kafka集群部署直通车 一、kafka bridge 介绍 Kafka Bridge 是 Apache Kafka 生态系统中的一个工具或组件&#xff0c;用于实现 Kafka 与其他系统或协议之间的通信或集成。Kafka 本身是一个分布式事件流平台&#xff0c;广泛用于构建实时数据流水线和流式应用程序。然而…...

AR和VR如何改变客户体验?

How AR and VR are transforming customer experiences&#xff1f; How AR and VR are transforming customer experiences AR和VR如何改变客户体验 AR and VR technology was largely expedited by the past pandemic with at least 93.3 million and 58.9 million users r…...

微信小程序中实现埋点的方法

在小程序开发过程中,埋点是实现数据采集和用户行为分析的重要手段。通过埋点,我们可以获取用户在使用小程序时的各种操作信息,从而更好地了解用户行为特征,优化产品体验。下面将介绍如何在小程序中实现埋点,并通过代码示例进行说明。 一、埋点实现思路 小程序的埋点实现主要依…...

vue记事本渲染以及交互

以下是记事本的源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>记事本</title><styl…...

Zookeeper中的脑裂

简单点来说&#xff0c;脑裂(Split-Brain) 就是比如当你的 cluster 里面有两个节点&#xff0c;它们都知道在这个cluster 里需要选举出一个 master。那么当它们两个之间的通信完全没有问题的时候&#xff0c;就会达成共识&#xff0c;选出其中一个作为 master。但是如果它们之间…...

【漏洞复现】金和OA XmlDeal.aspx XXE漏洞

0x01 产品简介 金和数字化智能办公平台(简称JC6)是一款结合了人工智能技术的数字化办公平台,为企业带来了智能化的办公体验和全面的数字化转型支持。同时符合国家信创认证标准,支持组织数字化转型,实现业务流程的数字化、智能化和协同化,提高企业竞争力。 0x02 漏洞概述…...

对比:React 还是 Vue

自己之前的开发栈一直是 Vue&#xff0c;对 Vue 的设计理念及底层实现原理算是颇有了解&#xff1b;随着公司技术迭代&#xff0c;近半年来开始接触&使用 React。 前面写了几篇关于 React 的文章&#xff0c;但大部分都是知识点以及开发过程问题的沉淀总结。 这篇文章想尝…...

ubuntu 20.04 SD 卡分区类型 msdos 改为 GPT 的方法

前言 默认 SD 卡分区是 FAT32 格式&#xff0c;为了用于嵌入式Linux ext4 文件系统&#xff0c;需要改为 ext4 文件系统&#xff0c;但是SD 卡分区类型默认是 msdos 类型&#xff0c;也就是 MBR 类型&#xff0c;不是 GPT 类型。 烧写 ext4 分区表&#xff0c;或者使用 ubuntu…...

Kubernetes(K8s)技术解析

1. K8s简介 Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排平台&#xff0c;旨在简化容器化应用程序的部署、扩展和管理。为开发者和运维人员提供了丰富的功能和灵活的解决方案&#xff0c;帮助他们更轻松地构建、部署和管理云原生应用程序。以下是关于Kubern…...

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十 简单颜色反转效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十 简单颜色反转效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十 简单颜色反转效果 一、简单介绍 二、简单颜色反转效果实现原理 三、简单颜色反转效果案例实现简单步骤 四、注…...

【ELK+Kafka+filebeat分布式日志收集】部署filebeat和Kibana(三)

filebeat下载 官网:https://www.elastic.co/cn/downloads/beats/filebeat 或者 cd /opt wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.8.1-linux-x86_64.tar.gz依次执行如下命令...

二.音视频编辑-媒体组合-播放

引言 当涉及到音视频编辑时&#xff0c;媒体资源的提取和组合是至关重要的环节。在iOS平台上&#xff0c;AVFoundation框架提供了丰富而强大的功能&#xff0c;使得媒体资源的操作变得轻松而高效。从原始的媒体中提取片段&#xff0c;然后将它们巧妙地组合成一个完整的作品&am…...

前端安全-面试题(2024)

1. 面试总结话术: 前端常见的安全问题主要包括以下几种: 跨站脚本攻击(XSS):攻击者通过在目标网站注入恶意脚本,当用户访问网站时,恶意脚本会被执行,从而窃取用户信息或进行其他恶意操作。这种攻击通常利用表单提交、URL参数等方式注入脚本。存储型 xss 恶意代码存在数…...

CVE-2022-29405 Apache Archiva任意用户密码重置漏洞分析

Apache Archiva是一套可扩展的Artifact Repository管理系统。它能够与Maven&#xff0c;Continuum和ANT等构建工具完美结合。Archiva提供的功能包括&#xff1a;远程Repository代理&#xff0c;基于角色的安全访问管理&#xff0c;Artifact分发、维护、查询&#xff0c;生成使用…...

ssm框架配置文件例子

emmm。。。。 就是说&#xff0c;正常ssm的配置文件长啥样&#xff1f; 就最基础的&#xff1f; 贴一下&#xff0c;备忘吧。 第一个&#xff1a;applicationContext.xml <beans xmlns"http://www.springframework.org/schema/beans"xmlns:context"http…...

maven构建项目报错:Failure to find com.microsoft.sqlserver:sqljdbc4:jar:4.0 in

背景 今天在项目里面查询sqlserver的数据库的时候&#xff0c;本地maven中引入依赖&#xff1a; <dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>sqljdbc4</artifactId><version>4.0</version></dependenc…...

已解决rabbitmq AMQPConnectionClosedException:管道破裂或连接关闭异常的正确解决方法,亲测有效!!!

已解决rabbitmq AMQPConnectionClosedException&#xff1a;管道破裂或连接关闭异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 一、问题分析 二、报错原因 三、解决思路 四、解决方法 五、总结 博主v&#xff1a;XiaoMing_Java 一、…...

Excel 隔几行批量插入空白行

例如如下表格&#xff0c;每隔6行插入一行数据&#xff1a; 1&#xff09;第7个单元格输入1 2&#xff09;选中6个单元格&#xff0c;然后双击填充数据&#xff1a; 3&#xff09;F5 找到常量 Ctrlshift 复制插入的数据&#xff0c;然后选中数据 按F5&#xff0c;定位到空值...

2024年04月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名&#xff08;每月更新&#xff09; 2024年04月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多&#xff0c;人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…...

如何通过Elasticsearch实现搜索的关键词达到高亮的效果

高亮 首先介绍一下什么是搜索的关键词达到高亮的效果&#xff0c;如图所示 当在百度里面搜索elasticsearch的时候&#xff0c;可以看到出现的搜索结果里面elasticsearch这个关键词明显与其他的条文不一样&#xff0c;用红颜色凸显了“高亮效果”。当我们想要在自己的项目里面…...

真实sql注入以及小xss--BurpSuite联动sqlmap篇

前几天漏洞检测的时候无意发现一个sql注入 首先我先去网站的robots.txt去看了看无意间发现很多资产 而我意外发现admin就是后台 之后我通过基础的万能账号密码测试or ‘1‘’1也根本没有效果 而当我注入列的时候情况出现了 出现了报错&#xff0c;有报错必有注入点 因此我…...

Java类和对象练习题

练习一 下面代码的运行结果是&#xff08;&#xff09; public static void main(String[] args){String s;System.out.println("s"s);} 解析&#xff1a;本题中的代码不能编译通过&#xff0c;因为在Java当中局部变量必须先初始化&#xff0c;后使用。所以此处编译不…...

wordpress什么意思/最近的时事新闻

SQL server 写sql 时&#xff0c;出现了下面的错误 在将 varchar 值 , 转换成数据类型 int 时失败 只需要将int 类型字段转为VARCHAR 字段即可。 cast(&#xff09;函数 SELECT ,cast(t2.id as varchar) FROM ( SELECT * FROM qc_flow_record t1 WHERE t1.check_order 1 AN…...

新密做网站推广/我想做百度推广

lazy running(最短路) 题意: 一个环上有四个点&#xff0c;从点2出发回到起点&#xff0c;走过的距离不小于K的最短距离是多少 \(K < 10^{18} 1 < d < 30000\) 看完这道题&#xff0c;觉得这是个智力题&#xff0c;想了一想&#xff0c;无从下手啊 每次总是看完题解&a…...

湖州高端网站建设/网站生成app

智云通CRM认为做好销售必须抱着“为客户解决问题”的意识去面对客户。为此销售要明白自己不是售货员&#xff0c;而是一名专业的顾问。无论产品多么出众、性价比多么高&#xff0c;客户没有需求是不会购买的。 不过&#xff0c;你是否真的理解这一点&#xff1f; 你是否直接问…...

可以生成静态网站源码/自助建站的优势

文章目录1、数据库性能指标1.1、事务吞吐率1.2、响应时间2、数据库性能测试的目的3、数据库性能测试的注意事项4、数据库性能测试工具选型4.1、sysbench4.2、mysqlslap5、sysbench测试介绍5.1、sysbench的安装5.1.1、sysbench的正常安装步骤5.1.2、安装中的异常处理5.2、sysben…...

福州成人报考网站/新闻热搜榜 今日热点

1.在firefox下&#xff0c;每页均会打印重复thead(表头)&#xff0c;tfoot(表尾)的内容&#xff1b;IE8下无效(其它IE版本未测试)2.分页的处理media print {.page-break { page-break-after: always; }}在需要分页的tr上&#xff0c;加上该样式即可3.隐藏某些不需要打印的区域m…...

东莞网站建设制作软件/公众号seo排名软件

在讲到使用hash还是string存储的选择前&#xff0c;先了解Redis的hash和string结构。 以下资料引自老钱的Redis深度历险。 string string和hash都是Redis的一种数据结构。string结构常用来缓存用户信息&#xff0c;通常将用户信息结构体使用JSON序列化成字符串&#xff0c;然…...