strace在线上环境的troubleshooting

我们线上的机器登录都是通过每5秒钟获取一次密码的方式登录的,今天要登录线上的一组机器,发现去不到root的password了,一直显示错误,后通过console进去获取到密码才得以登录进去,因为系统里用的是/usr/bin/mkpasswd的方式来生成密码的,手工执行mkpasswd root, 发现没有返回,也没有报错,打开文件看看源码是怎么写的,发现是一个shell脚本,是通过系统的passwd,/dev/random获取随机数字,和expect来实现每次请求的时候都更改用户的密码并回显到调用的网页上。抄家伙,看看他是哪里出问题了

strace -c -T -f /usr/bin/mkpasswd root

Process 26921 attached
Process 26922 attached (waiting for parent)
Process 26922 resumed (parent 26921 ready)
Process 26923 attached
Process 26923 detached
Process 26922 detached
^CProcess 26921 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.000736           5       141           read
  0.00    0.000000           0         4           write
  0.00    0.000000           0       136        16 open
  0.00    0.000000           0       140           close
  0.00    0.000000           0        53        28 stat
  0.00    0.000000           0        92           fstat
  0.00    0.000000           0        16           lstat
  0.00    0.000000           0         9         6 lseek
  0.00    0.000000           0       172           mmap
  0.00    0.000000           0        84           mprotect
  0.00    0.000000           0        34           munmap
  0.00    0.000000           0        19           brk
  0.00    0.000000           0       100         2 rt_sigaction
  0.00    0.000000           0        24           rt_sigprocmask
  0.00    0.000000           0         1           rt_sigreturn
  0.00    0.000000           0        52        23 ioctl
  0.00    0.000000           0        27        17 access
  0.00    0.000000           0         3           pipe
  0.00    0.000000           0         3           select
  0.00    0.000000           0         2           dup2
  0.00    0.000000           0         3           getpid
  0.00    0.000000           0         7           socket
  0.00    0.000000           0         6         6 connect
  0.00    0.000000           0         3           clone
  0.00    0.000000           0        14         9 execve
  0.00    0.000000           0         3         1 wait4
  0.00    0.000000           0         3           uname
  0.00    0.000000           0        41         1 fcntl
  0.00    0.000000           0         2           readlink
  0.00    0.000000           0         4           getrlimit
  0.00    0.000000           0        14           getuid
  0.00    0.000000           0        10           getgid
  0.00    0.000000           0        12           geteuid
  0.00    0.000000           0        10           getegid
  0.00    0.000000           0         2           getppid
  0.00    0.000000           0         2           getpgrp
  0.00    0.000000           0         1           setsid
  0.00    0.000000           0         2           statfs
  0.00    0.000000           0         5           arch_prctl
------ ----------- ----------- --------- --------- ----------------

100.00    0.000736                  1256       109 total

-c表示打印出统计信息,-T显示没个调用所消耗的时间,-f表示跟着子进程,从上面结果可以看到到了read的地方就一直卡在那里不动,一开始以为是没有读取到用户名,后来代码上加上echo $1,是可以打印出来的,那strace显示是在read的地方卡住的,那问题到底出在哪里了呢,在继续往下看代码,突然想到既然用的expect,那肯定是执行passwd的时候read屏幕回显的字符,代码段在这里

spawn $prog $user

197      expect {

198          "assword*: " {

199              # some systems say "Password (again):"

200              send "$password \r "

201              exp_continue

202          }

203      }

赶紧回shell手工执行以下passwd,发现显示乱码了,echo $LANG,nnd,竟然是zh_CN, 我们线上环境的服务器都是en_US.UTF-8的呀,赶紧加上一条export到.bashrc里面,至此问题解决,就是由于系统语言是中文,导致expect执行的之后无法读取想要匹配的字符导致没法获取到密码。

文章涉及的脚本文件请到这里下载https://github.com/sangrealest/shell/blob/master/mkpasswd

时间: 2024-11-07 06:51:35

strace在线上环境的troubleshooting的相关文章

BUG在线上环境中出现的原因总结

1.线上环境数据的复杂度以及数据量是测试环境不能比拟的. 2.业务操作的不可控性,用户错误的使用习惯. 3.实际场景的复杂性. 上线之后,测试人员需要做好以下二件事: 第一,灰度测试 项目上线之后,首先是测试人员开始做灰度测试. 灰度测试时,可以设置由业务开关或者白名单之类做控制,只要少量数据或添加在白名单上的数据可以走新业务流程. 灰度测试完全之后,也就是将所有业务流程走完,检查各项数据的正确性.流程是否通.流程是否完整等等检查点. 确定无问题时,再将开关打开,再开放少量真实用户数据. 第二,

[Nginx笔记]关于线上环境CLOSE_WAIT和TIME_WAIT过高

运维的同学和Team里面的一个同学分别遇到过Nginx在线上环境使用中会遇到TIME_WAIT过高或者CLOSE_WAIT过高的状态 先从原因分析一下为什么,问题就迎刃而解了. 首先是TIME_WAIT: 理解一下TIME_WAIT状态产生的原因,这个问题已经被很多很多的书说烂了,但是为什么很多人还是不能解决,究其原因还是因为 大多数都是学术派,并没有真正的遇到过这样的问题,因为TIME_WAIT大量产生很多都发生在实际应用环境中. TIME_WAIT产生的原因还是因为在通讯过程中服务端主动关闭

关于线上环境CLOSE_WAIT和TIME_WAIT过高

转自:http://www.cnblogs.com/Bozh/p/3752476.html 运维的同学和Team里面的一个同学分别遇到过Nginx在线上环境使用中会遇到TIME_WAIT过高或者CLOSE_WAIT过高的状态 先从原因分析一下为什么,问题就迎刃而解了. 首先是TIME_WAIT: 理解一下TIME_WAIT状态产生的原因,这个问题已经被很多很多的书说烂了,但是为什么很多人还是不能解决,究其原因还是因为 大多数都是学术派,并没有真正的遇到过这样的问题,因为TIME_WAIT大量产生

使用pupput部署线上环境

注:本文侧重于pupput使用git版本控制在线上环境的部署步骤详解. 1:线上puppet加入git版本控制 详细步骤: pptserver_wangsu_bj_192.168.3.68.centos.yypuppet.com [/etc/puppet/multi-environment/yydev/environment] [email protected]/0 # git init ; cd ..; git clone --bar environment /var/puppet/envir

linux服务器如何设置目录权限,让开发只能在测试目录下开发,不在线上目录上开发

当一台服务器上,既有测试环境,也有生成的环境,开发需要在线上测试,如果开发生产环境的权限,那开发容易误操作 需求如下: (1)生产环境的代码,必须有专用的账号登陆进行管理 (2)开发测试环境的代码,开发能够访问,但访问不了生产环境目录 位了实现这个目的,操作如下 (1)将生产的环境的用户组和拥有者都修改为www //修改用户 chown -R www /product-folder //修改组 chgrp -R www /product-folder (2)设置生产环境的权限为775,也就是只有

在线Linux环境-JSLinux

http://bellard.org/jslinux/ 一个不错的在线Linux环境,适合在没有安装linux的系统上体验.测试Linux.没有网络相关的功能. 以下是百度百科的内容: 简介 由程序员Fabrice Bellard写了一段Javascript在Web浏览器中启动Linux.目前,只能使用Firefox 4和Chrome 11运行这个Linux.这不是什么假的模仿Linux的东西,这是实实在在的运行一个Linux. 特点 这个模似器完全由Javascript写成CPU仿真器使用的是

目前线上环境(ubuntu server)终于部署好一个logstash日志收集系统了

断断续续的看了一周logstash的文档,总算在线上ubuntu搭建起来一个logstash环境了.现在分享一下自己的经验 关于logstash 这玩意现在还算是火爆,依托于elasticsearch这棵大树下,logstash的关注度是非常高的,项目目前来说算是活跃.logstash是一个用于日志收集.分析的系统,架构设计非常灵活,几乎可以满足各种规模的需求. logstash的逻辑架构 logstash的逻辑架构其实一点都不复杂,经历收集->过滤->输出三个步骤即可简简单单的筛选与管理日志

简要的线上环境部署概览

谈到线上环境,一般开发同学,不太容易接触到.即使接触到,也只是其中的冰山一角! 所以,其实说起线上环境的部署,咱们好像都有点懂,但是又都不一定完全懂!网上的知识无穷无尽,但往往都是各司一职,对于普通同学,很难窥其全貌! 所以,我今天就来说说,一些普通的线上环境的部署步骤,和一些脚本小技巧吧.只希望通过这篇文章,能够让大家有一个运维的全局! 我将会分几条线来整理咱们的运维思路! 一.从理论上讲,我们应该怎么做? 1. 针对的是什么样的用户群体,体量大量会有多少? 这是一个部署规划的前题.为啥呢?

appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器

前言 在mac上搭建appium踩了不少坑,先是版本低了,启动后无限重启模拟器.后来全部升级最新版本,就稳稳的了. 环境准备: 1.OS版本号10.12 2.xcode版本号8.3.2 3.appium版本号1.6.4(appium-desktop1.1.0) 4.ios模拟器版本号10.3 一.OS10.12 1.这里Mac上的OS系统一定要升级到10.12,低于10.12是无法安装8.3.2的xcode版本的 2.下载地址:https://www.apple.com/macos/sierra