ssh问题之复盘
一、问题发生、排查以及解决
某天H博士在登录B服务器时发现一个严重的问题,问题是H博士在执行脚本出现一个异常,这个异常是过去我执行脚本只需输入一次密码,现在要输入五六次,只有输入五六次后才能正确执行完脚本。这个问题非常严重。我记得那天ZH向我请教了几个关于Linux授权的问题。而后第二天H博士就开始反馈这个异常。于是ZH先处理,一直找不到问题在哪,于是便叫我来,一同排查是什么原因。
H博士那边给我们提供一个方案,他怀疑是SSH密钥失效导致的,于是我们按照H博士提供的方案一一执行,发现还是不行。
而且在验证H博士提供的方案之前,我参考我之前写过的文章:Linux远程传输文件免密码
试验开发服务器,按照我这边试验的,A服务器上的用户可以免密登录B服务器,而B服务器上的用户可以免密登录A服务器,前提是将彼此ssh-keygen -t rsa 生成密钥放入.ssh/authorized_keys即可。
我按照我之前写过试了试,完全没有问题。
由此排除了是密钥的问题。
接着怀疑是权限的原因,最后我给H博士经常使用的用户授予最大权限chmod 777或chown -R 用户 文件夹。但发现仍解决不了这个问题。
最后ZH和我一时想不到有效的办法,ZH就准备重装系统了,先从B服务器开始入手。
而我最初想着重装太费劲了,主要是备份很多东西和安装很多奇葩环境,一直在想如何解决这个问题。
某天灵感突然一来,明确我们的问题(登录某个用户执行该用户所属目录的脚本需要输入多次密码),我使用root用户新建了一个用户,按照H博士之前提供的方案,切换到新用户,执行相关命令,然后验证是否需要输入密码,最后发现完全不要。我此时还没有意识到是用户组权限问题。
为了解决这个问题,归纳一下,我试了如下方法:
- 认为是权限问题,授予该用户最大权限;
- 认为是密钥问题,使用该用户执行重新生成密钥步骤;
- 两台服务器存放密钥验证免密(最初定位错了问题,认为是两台服务器需要交互操作);
- 重新新建用户验证是否免密;
- 修改ssh配置文件。
最后均不能解决这个问题,后来我只能表示黔驴技穷,ZH也想不到更好的办法,基本上搜索引擎我们能搜的,能尝试的都尝试了,都不能解决这样的问题,ZH还亲自读脚本和执行脚本一步步用echo输出调试,还是不能定位问题根源在哪。最后我们采用最后的方案,重装系统,回归原来的环境。
ZH当时重复说了多次,我就仅仅动了一下用户权限,其它什么都没有动(这是一条非常关键的信息,当时我并未重视起来,仅仅是表面的以为没有权限,授个权就行了)。
自到ZH重装以后,再次授权,复现了这个问题,然后我叫他别动,我在此新建一个用户,发现执行免密登录所需步骤后,可以不用输入密码。最后他再次快速重装,什么都没有动,然后我使用H博士常使用的用户验证是否输入密码(在此安装免密步骤执行了),最后发现不要,问题就这么解决了。
后来过了一段时间,ZH再次给我反馈有这么一个问题,我问他做了什么操作,他回答到H博士经常操作的是A用户,但是我们部署微服务的是放在B用户上,B用户需要读A用户下的某个文件,于是他给B用户递归授权A用户目录,最后再次验证A用户是否需要输入密码,最后发现需要输入了。最后我使用ll命令查看了/home下的用户权限,发现有问题,譬如/home/A的用户和用户组应该是A A,而不是A B这样的,此次我发现A B。最后我断定一定是A用户的权限组不明确 生成的密钥与权限组有非常大的关联,如果权限组变了,密钥是无法识别的,于是造成A用户执行脚本时需要输入多次密码。
经常多次试验,果真是这个原因。
但因为B用户上部署的微服务程序需要访问A用户下的目录,这个问题不解决会有很大的影响,最后我们的方案是,/home下的A用户和B用户各自做各自的事情,不能交叉,例如A用户除了执行脚本外,还可以执行部署微服务,脚本执行每天人为地固定执行,而程序是自动化的,B用户仅仅是部署,完全没有这个必要,于是A用户只做两件事情,一件事情是执行脚本,另外一件事情是部署微服务,因为后续脚本将会自动化,所以A用户最终的职责就是部署微服务,由此我们推出了一个新的原则,叫做用户专一原则(一个用户只做一件事情或一类事情)。
二、总结
这个问题说大不大,说小也不小,足足磨了我们半个多月的时间,当然了,半个多月虽然还有其它的开发任务,但这个问题卡在这,让人着实不爽。虽然最终解决了,但我仍不高兴,因为明明我可以在几个小时内或不用几个小时就能快速解决这个问题,但最后却足足耽搁了半个多月。
1.之后我在想为什么这个问题这么长才定位到原因?
我想关键在于问题复现步骤上,首先我没有与ZH仔细沟通,询问他做了什么操作(没有具体到原来是给B用户授予A用户的权限),而仅仅是得到一个大致不精确的回答了授了一下权限。如果试想当初我追根刨底,具体到执行了什么命令,我想用不了这么长时间就能快速解决,因为问题本身并不难。
由此推出,原因在于我没有仔细询问ZH在该服务器上做了哪些操作,执行哪些具体命令,导致我错误的定位问题,如扫雷式排查,一个个试。
可见,遇到问题并不可怕,可怕的是没有找问题发现者,仔细询问是如何发现这个问题的,以及在发现这个问题时做了那些操作(因为这些操作可能是导致问题发生的引子)。
2.以后将如何避免这样类似的问题?
我总结出如下两个原则:
- (1)面对他人发现的问题,首先要仔细询问他是如何发现的或在此做了些什么(非常关键,需要重点留意),在与问题发现者的不断沟通中,得到更多的信息,这些信息实际上有助于问题的正确定位(这一刻我明白了磨刀不误砍柴工);
- (2)在(1)的基础上,根据从(1)所知的信息和结合以往的经验,找到问题的可能原因,定位问题并解决,另外必要时可请教相关专业人士提供帮助,在请教前,记得将问题陈述清楚(如问题是如何发现的、问题发现前做了哪些事情、为了解决这个问题根据问题可能原因尝试用哪些方法去解决等)。
ssh问题之复盘的更多相关文章
- 管中窥豹-ssh链接过多的问题分析及复盘
缘起 某一天,产品侧同事联系过来,反馈话单传输程序报错,现象如下: 实际上,该节点仅提供了一个sftp服务,供产品侧传输话单过来进行临时存储,由计费部门取走而已. 分析 于是找运维同事上服务器看了下情 ...
- 经典案例复盘——运维专家讲述如何实现K8S落地
经典案例复盘——运维专家讲述如何实现K8S落地 背景介绍 运满满自开始微服务改造以来,线上线下已有数千个微服务的 Java 实例在运行中.这些 Java 实例部署在数百台云服务器或虚机上,除少数访问量 ...
- [linux]阿里云主机的免登陆安全SSH配置与思考
公司服务器使用的第三方云端服务,即阿里云,而本地需要经常去登录到服务器做相应的配置工作,鉴于此,每次登录都要使用密码是比较烦躁的,本着极速思想,我们需要配置我们的免登陆. 一 理论概述 SSH介绍 S ...
- SSH实战 · 唯唯乐购项目(上)
前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...
- 记录一则Linux SSH的互信配置过程
需求:四台Linux主机,IP地址为192.168.10.10/11/12/13,配置登录用户的互信 1.各节点ssh-keygen生成RSA密钥和公钥 ssh-keygen -q -t rsa -N ...
- SSH免手动输入密码和设置代理
通过使用sshpass将密码写入命令里,直接执行,免去手动密码输入的步骤命令如下: sshpass -p password_abc ssh user_abc@ssh_host -p ssh_port ...
- github免输用户名/密码SSH登录的配置
从github上获取的,自己整理了下,以备后用. Generating an SSH key mac windows SSH keys are a way to identify trusted co ...
- Linux 利用Google Authenticator实现ssh登录双因素认证
1.介绍 双因素认证:双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统.双因素认证是一种采用时间同步技术的系统,采用了基于时间.事件和密钥三变量而产生的一 ...
- mac下生成ssh keys 并上传github仓储
使用github仓储需要本机生成一个公钥key 添加到自己的git账户SSH keys中 mac 生成方法: 1. 打开终端 输入 ssh-keygen 然后系统提示输入文件保存位置等信息 ...
随机推荐
- C#声明一个100大小的数组 随机生成1-100之间不重复的数
面试题:C#声明一个100大小的数组 随机生成1-100之间不重复的数下面是C#的实现方式,编译测试通过 public static void InsertRandomArray() { int[] ...
- 用STM32定时器测量信号频率——测频法和测周法[原创cnblogs.com/helesheng]
工业测试与控制系统中,经常需要对未知信号的频率进行测试.对于10MHz以下的信号,用单片机(MCU)定时器完成这项任务显然是最常见和最佳的选择.目前性价比最高的单片机STM32拥有功能强大且数量众多的 ...
- v-lazyload数据变化图片不切换
这个问题让我很困惑,明明得到的商品数据已经改变了,但是就图片不变化,随后找到了解决办法,那就是多加一个动态的key <img v-lazy="item.productImage&quo ...
- C# 继承类的值赋
C# 继承类的值赋 /// <summary> /// 将父类的值赋值到子类中 /// </summary> /// <typeparam name="TPar ...
- 题解-CF617E XOR and Favorite Number
题面 CF617E XOR and Favorite Number 给定 \(n,m,k\) 和 \(n\) 个数的序列 \(a_i\),\(m\) 次求区间 \([l,r]\) 中异或值为 \(k\ ...
- 二、利用Git将GitHub上的项目拉下项目
本地同样需要安装Git,同样在GitHub上加入ssh公共钥匙 如果忘了 去看上一篇 一.本地项目部署到GitHub上 - 中华田园猫饭饭 - 博客园 (cnblogs.com) 1-鼠标右键点击 G ...
- 我叫Mongo,干了「索引探索篇」提升我的效率,值得您拥有
这是mongo第四篇"索引探索",后续会连续更新4篇 mongodb的文章总结上会有一系列的文章,顺序是先学会怎么用,在学会怎么用好,戒急戒躁,循序渐进,跟着我一起来探索交流.通过 ...
- 未雨绸缪,数据保护之NBU介质备份
摘要:华为GaussDB目前已支持NBU介质的备份与恢复,本文主要描述了华为GaussDB数据库和NetBackup对接进行备份.恢复的配置方法与性能调优方法. 一.简介 企业要想避开自然灾难和站点中 ...
- 网站配置Gittalk教程和解决gittalk的Error: Not Found.问题
想把网站增加gittalk的评论功能,按照其他教程配置后,出现了 Error: Not Found. 的错误.截图如下: 网上找了很多解决方案,现在贴出来完整的配置Gittalk的教程. 01.新建评 ...
- [日常摸鱼]poj2778 DNA Sequence
这题太神啦 题意:求长度为$n$的不包含给定DNA序列的DNA序列个数,给定的不超过10个 构建出Trie图,用$danger[i]$来表示不能走到$i$,对于DNA序列结尾的结点$danger$设为 ...