一、问题发生、排查以及解决

某天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问题之复盘的更多相关文章

  1. 管中窥豹-ssh链接过多的问题分析及复盘

    缘起 某一天,产品侧同事联系过来,反馈话单传输程序报错,现象如下: 实际上,该节点仅提供了一个sftp服务,供产品侧传输话单过来进行临时存储,由计费部门取走而已. 分析 于是找运维同事上服务器看了下情 ...

  2. 经典案例复盘——运维专家讲述如何实现K8S落地

    经典案例复盘——运维专家讲述如何实现K8S落地 背景介绍 运满满自开始微服务改造以来,线上线下已有数千个微服务的 Java 实例在运行中.这些 Java 实例部署在数百台云服务器或虚机上,除少数访问量 ...

  3. [linux]阿里云主机的免登陆安全SSH配置与思考

    公司服务器使用的第三方云端服务,即阿里云,而本地需要经常去登录到服务器做相应的配置工作,鉴于此,每次登录都要使用密码是比较烦躁的,本着极速思想,我们需要配置我们的免登陆. 一 理论概述 SSH介绍 S ...

  4. SSH实战 · 唯唯乐购项目(上)

    前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...

  5. 记录一则Linux SSH的互信配置过程

    需求:四台Linux主机,IP地址为192.168.10.10/11/12/13,配置登录用户的互信 1.各节点ssh-keygen生成RSA密钥和公钥 ssh-keygen -q -t rsa -N ...

  6. SSH免手动输入密码和设置代理

    通过使用sshpass将密码写入命令里,直接执行,免去手动密码输入的步骤命令如下: sshpass -p password_abc ssh user_abc@ssh_host -p ssh_port ...

  7. github免输用户名/密码SSH登录的配置

    从github上获取的,自己整理了下,以备后用. Generating an SSH key mac windows SSH keys are a way to identify trusted co ...

  8. Linux 利用Google Authenticator实现ssh登录双因素认证

    1.介绍 双因素认证:双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统.双因素认证是一种采用时间同步技术的系统,采用了基于时间.事件和密钥三变量而产生的一 ...

  9. mac下生成ssh keys 并上传github仓储

    使用github仓储需要本机生成一个公钥key 添加到自己的git账户SSH keys中   mac 生成方法:   1. 打开终端 输入   ssh-keygen 然后系统提示输入文件保存位置等信息 ...

随机推荐

  1. 搭建ARL资产安全灯塔

    老年人了,只能靠安装部署项目混混日子这样~ 简介: 斗象TCC团队正式发布「ARL资产安全灯塔」开源版,该项目现已上线开源社区GitHub.ARL旨在快速侦察与目标关联的互联网资产,构建基础资产信息库 ...

  2. 大数据技术体系 && NoSQL数据库的基本原理

    1.NoSQL产生的原因 目前关系型数据库难以应对日益增多的海量数据,横向的分布式扩展能力比较弱,因此构建出非关系型数据库(所谓的NoSQL),其目的是为了构建一种结构简单.分布式.易扩展.效率高且使 ...

  3. SQL Server 批量插入数据方案 SqlBulkCopy 的简单封装,让批量插入更方便

    一.Sql Server插入方案介绍 关于 SqlServer 批量插入的方式,有三种比较常用的插入方式,Insert.BatchInsert.SqlBulkCopy,下面我们对比以下三种方案的速度 ...

  4. P7077 函数调用

    我好蠢啊... 考试的时候不会写,现在看了这么多篇题解还是似懂非懂,所以决定写一下草稿... 草稿 和 题解 就是首先,题目保证了函数不会间接的调用其本身,所以可以直接知道这是一个 \(\text{D ...

  5. Java设计模式(一)——单例模式

    简介 定义: 确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例. 单例类拥有一个私有构造函数,确保用户无法通过 new 来直接实例化它.类中包含一个静态私有成员变量与静态公有的工厂方法, ...

  6. linux 上安装部署python

    一般在linux中使用python 需要安装pyenv 进行版本控制 因为linux6.9自带的Python是2.6的 同时很多命令都是基于2.6开发的 所以系统环境不能改 我们要开发 只能用pyen ...

  7. oracle 11.2.0.4下载

    Oracle 11.2.0.4下载地址 Linux x86: https://updates.oracle.com/Orion/Services/download/p13390677_112040_L ...

  8. 【面试专栏】JAVA锁机制

    1. 悲观锁 / 乐观锁   在Java和数据库中都存在悲观锁和乐观锁的应用.Mysql锁机制中的悲观锁和乐观锁请查看:   Mysql锁机制--悲观锁和乐观锁   悲观锁:在获得数据时先加锁,只到数 ...

  9. IOS开发中设置导航栏主题

    /** * 系统在第一次使用这个类的时候调用(1个类只会调用一次) */ + (void)initialize { // 设置导航栏主题 UINavigationBar *navBar = [UINa ...

  10. Kubernetes【K8S】(一):Kubernetes组件

    什么是Kubernetes ​ Kubernetes 是一个可移植的.可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化.Kubernetes拥有一个庞大且快速增长的生态系统. ...