今天突然在一台测试机器上使用cp命令出现了segmentation fault的错误,因为这台机器很多人使用,而且是一台开发的测试机器,我无法排查具体问题,只能针对这个出现的问题解决,但是我从网上查了一下,说是非法内存操作,比如数组越界,例如申请b[5],却访问到b[5]或者b[6],这也会很多情况,可能是循环操作时循环变量控制有问题,可能是字符串拷贝时长度发生溢出,指针指向了非法内存。
对于这个错误,我们输入如下命令:
# alias
alias cp='cp -i'
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias mv='mv -i'
alias rm='rm -i'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
可以这样解决unalias cp,但是好像不管用。我最后从一个相同的机器上拷贝一个cp文件放到/bin/目录下,就解决了。
一开始我以为这个是因为我们开发人员修改程序造成系统的问题,也就从别的机器拷贝过来文件,但是机器重新启动后,文件又出错了,
我后来查看那了一下日志文件,出现大量的信息:
Dec 8 06:34:22 localhost sshd(pam_unix)[6217]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.0.0.2 user=root
Dec 8 06:34:24 localhost sshd(pam_unix)[6219]: check pass; user unknown
Dec 8 06:34:24 localhost sshd(pam_unix)[6219]: authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.0.0.2
Dec 8 10:14:28 localhost sshd(pam_unix)[6239]: session opened for user root by (uid=0)
Dec 8 10:15:47 localhost sshd(pam_unix)[6284]: session opened for user root by (uid=0)
Dec 8 10:17:24 localhost sshd(pam_unix)[6239]: session closed for user root
有人在扫描我的机器,还有通过10.0.0.2 这个地址登录,正常情况下,上班时间,这个地址是不可能来登录的,这个地址可疑,我更换了系统密码,然后在root下看到了脚本文件,正好自己拿下来研究一下,然后把这些文件都删除了,看看那些命令不能正常使用,然后使用which命令找到这个命令的路径,从正常的机器上拷贝过来就可以了。对于脚本文件先不发放了,我先研究研究,看能不能完善一下,呵呵.
不过问题远没有完,过了一会,grep命令也不能使用了,直接出现错误segmentation fault ,重新启动机器。
启动的时候就报下面的错误:
init:version 2.84 booting ok
welcome to /etc/rc.d/rc.sysinit: line 46 : 799 segmentation fault
LC_ALL=C grep -q "red hat" /etc/redhat-release
red hat linux
press ’i’ to enter interactive startup
mounting proc filesystem: failed
/etc/rc.d/rc.sysinit: line 90: 44 segmentation fault LC_ALL=C grep -q/initrd/proc/mounts
configuring kernel parameters: error:/ proc must be mounter to mount /proc at boot you need an /etc/fstab line like :
/proc /proc proc defaults
in the meantime, mount /proc /proc -t proc failed
setting clock ....... ok
loading default keymap(us) ok
setting hostname ok
/etc/rc.d/rc.sysinit: line 182: 68 segmentation fault LC_ALL=C grep -iq "nousb" /proc//cmdline 2>;/dev/null
/etc/rc.d/rc.sysinit :line 182: 69 segmentation fault LC_ALL=C grep -q "usb" /proc/device 2 >;/dev/null
然后就停在这里不动了.没有办法,只能进入到rescue模式下面:
用第一张光盘启动,在boot后面输入:linux rescue
在问您是否配置网络的时,选择NO.下一步的时候选择Continue
/bin/sh-3.00#chroot /mnt/sysimage
/sh-3.00#cat /etc/rc.d/rc.sysinit (看了一下没有什么不对的,假如您不会看的话。能够直接从另外一台机器机器copy过来覆盖掉原来的)
我再把/etc/fstab目录下面的proc这一行注释掉了。其实这一行注释掉了话。系统自己能重建这个目录,再重启,可是问题依旧。后来参考网上的帖子说有可能改了/sbin和/bin目录下面的命令。我也觉得奇怪,我运行grep命令的时候总是报错。再比较了一下这个命令和正常机器上的命令大小,发现这个命令大了很多了。没有办法,我只好从另外正常的机器上cp /sbin和/bin目录,覆盖他原来的/sbin和/bin目录下面的命令。注意,这里不要整个目录覆盖,最少是从目录下面
/sh-3.00#mount /dev/sde1 /mnt/usb (假如您开始chroot了,请先exit出来,要不您mount的时候mount不上)
/sh-3.00#cp /mnt/usb/sbin/* /mnt/sysimage/sbin
/sh-3.00#cp /mnt/usb/bin/* /mnt/sysimage/bin
/sh-3.00#cp /mnt/usb/{rc,rc.local,rc.sysinit} /mnt/sysimage/etc/rc.d (把rc、rc.local、rc.sysinit也同时cp到/etc/rc.d/下面)
以上是我从网上搜索到的,说用usb挂载的方式来做,但是我的服务器进入修复模式是不能挂载usb的,我就想过用网络方式,在配置网络这一步时,我们选择yes,然后配置网络地址,我们进入后,直接启动ssh,
sh-3.00#service sshd start
这样我直接可以用scp来进行文件拷贝了。
/bin/sh-3.00#chroot /mnt/sysimage
/sh-3.00#ssh xxx.xxx.xxx.xxx #我们进入内网中另外一台系统相同的服务器。
~#tar -czvf /usr/{bin.tar.gz,sbin.tar.gz} /usr/bin,sbin
~#scp bin.tar.gz
~#scp /etc/rc.d/{rc,rc.local,rc.sysinit}
~#exit #我们退出好的这台机器。
然后在被黑的机器上,解压,把文件覆盖到相同的目录下
然后重启机器就可以了。
阅读(1694) | 评论(0) | 转发(0) |