Shell 脚本小试牛刀(3) -- libc库版本记录
2014-04-23 17:26
260 查看
一个完整的项目应该包括记录完整的环境,所以你的程序中可能需要记录:Linux内核版本、使用系统板本、文件系统版本、gcc版本等等,而这些记录的系统信息在程序维护以及升级时都是极为重要的宝贵资源。
当然这些信息你可以使用一个脚本记录到某一个文档中,或者直接插入数据库中,不管对结果怎么处理,使用shell脚本记录是一个很方便而且是可重用的。
但是使用脚本中一定要注意的问题是脚本的通用性!当然你也很难遇测以后的系统中文件的路径会不会发生变化!我就遇到这样的问题:我们的记录环境信息的脚本中记录 libc 库的版本行出错,打开找到该行,原版本市这么写的:
libc_verion=$(ls
-l /lib/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g')
这段代码在一台老机器上运行是正常的:
root@debian:/tmp$ ls -l /lib/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g'
2.11.3
但是我在我电脑上试运行 “
ls -l /lib/libc.so.6 ”
时,会报错:
long@Debian-PC:~$ ls -l /lib/libc.so.6
bash: ls -l /lib/libc.so.6: No such file or directory
所以出现的问题也很明显,那就是在我的系统上 libc 库的路径发生了变化,那么经过我的不懈努力呢(额,夸张了点哈)发现,在我的Debian 7 下libc 库被挪到了“ /lib/i386-linux-gnu/libc.so.6 ”路径下,于是,我写了如下小脚本替换了原来的查找 libc 库版本的命令行:
进行替换后,无论是在我的32位还是64位系统,亦或旧版本的机器上运行此脚本都是正常的:
在我的32位Debian台式机上运行结果为:
long@Debian-PC:/tmp$./record_libc_version.sh
Your system is : Debian-7.4
Your kernel version is :3.12.1
Your arch is :i686
Your libc library version is :2.13
在我的64位Debian笔记本上运行结果为:
zhouyl@wheezy:~$ /tmp/record_libc_version.sh
Your system is : Debian-7.4
Your kernel version is :3.12.9
Your arch is :x86_64
Your libc library version is :2.13
在旧机器上运行结果:
root@debian:/tmp$ ./record_libc_version.sh
Your system is : Debian-6.0.9
Your kernel version is :3.12.1
Your arch is :i686
Your libc library version is :2.11.3
注: 目前手头没有旧版本的Debian机器,所以没有更旧版本的运行结果,如果你那运行有问题,请在留言处给我回复哦!!谢谢
事实证明,else中使用匹配模式 " ls -l /lib/*-linux-gnu*/libc.so.6 "还是很有用的,我同学手里有一款 PcDuino ,亲测有效:
ubuntu@ubuntu:/tmp$ ./record_libc_version.sh
Your system is : Debian-wheezy/sid
Your kernel version is :3.4.29+
Your arch is :armv7l ---arm 架构的哦!
Your libc library version is :2.15
而,在这一款板子上,Libc库所在位置是:
ubuntu@ubuntu:/tmp$ ls -l /lib/arm-linux-gnueabihf/libc.so.6
lrwxrwxrwx 1 root root 12 Oct 6 2012 /lib/arm-linux-gnueabihf/libc.so.6 -> libc-2.15.so
因此,匹配成功~~ OK,效果不错,了罢此文~~
当然这些信息你可以使用一个脚本记录到某一个文档中,或者直接插入数据库中,不管对结果怎么处理,使用shell脚本记录是一个很方便而且是可重用的。
但是使用脚本中一定要注意的问题是脚本的通用性!当然你也很难遇测以后的系统中文件的路径会不会发生变化!我就遇到这样的问题:我们的记录环境信息的脚本中记录 libc 库的版本行出错,打开找到该行,原版本市这么写的:
libc_verion=$(ls
-l /lib/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g')
这段代码在一台老机器上运行是正常的:
root@debian:/tmp$ ls -l /lib/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g'
2.11.3
但是我在我电脑上试运行 “
ls -l /lib/libc.so.6 ”
时,会报错:
long@Debian-PC:~$ ls -l /lib/libc.so.6
bash: ls -l /lib/libc.so.6: No such file or directory
所以出现的问题也很明显,那就是在我的系统上 libc 库的路径发生了变化,那么经过我的不懈努力呢(额,夸张了点哈)发现,在我的Debian 7 下libc 库被挪到了“ /lib/i386-linux-gnu/libc.so.6 ”路径下,于是,我写了如下小脚本替换了原来的查找 libc 库版本的命令行:
#!/bin/bash # (C) 2014 Yunlong Zhou <reaper888@yeah.net> # Under licence GPL # File : record_libc_version.sh # Introduction: # This script is using for record the libc library version # Useage : # $ ./record_libc_version.sh # Your system is : Debian-7.4 # Your arch is :i686 # Your kernel version is :3.12.1 # Your libc library version is :2.13 echo "Your system is : Debian-"`cat /etc/debian_version` echo "Your kernel version is :"`uname -r | cut -d "-" -f1` echo "Your arch is :"`uname -a | cut -d " " -f14` ls -l /lib/libc.so.6 &>/dev/null if [ $? == 0 ] ;then libc_version=$(ls -l /lib/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g') else uname -a >/tmp/system_version if grep -q "x86_64" /tmp/system_version ; then libc_version=$(ls -l /lib/x86_64-linux-gnu/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g') elif grep -q "i386" /tmp/system_version || grep "i686" /tmp/system_version ; then libc_version=$(ls -l /lib/i386-linux-gnu/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g') else libc_version=$(ls -l /lib/*-linux-gnu*/libc.so.6 | sed -e 's/.*libc-\(.*\).so/\1/g') fi rm /tmp/system_version fi echo "Your libc library version is :"$libc_version
进行替换后,无论是在我的32位还是64位系统,亦或旧版本的机器上运行此脚本都是正常的:
在我的32位Debian台式机上运行结果为:
long@Debian-PC:/tmp$./record_libc_version.sh
Your system is : Debian-7.4
Your kernel version is :3.12.1
Your arch is :i686
Your libc library version is :2.13
在我的64位Debian笔记本上运行结果为:
zhouyl@wheezy:~$ /tmp/record_libc_version.sh
Your system is : Debian-7.4
Your kernel version is :3.12.9
Your arch is :x86_64
Your libc library version is :2.13
在旧机器上运行结果:
root@debian:/tmp$ ./record_libc_version.sh
Your system is : Debian-6.0.9
Your kernel version is :3.12.1
Your arch is :i686
Your libc library version is :2.11.3
注: 目前手头没有旧版本的Debian机器,所以没有更旧版本的运行结果,如果你那运行有问题,请在留言处给我回复哦!!谢谢
事实证明,else中使用匹配模式 " ls -l /lib/*-linux-gnu*/libc.so.6 "还是很有用的,我同学手里有一款 PcDuino ,亲测有效:
ubuntu@ubuntu:/tmp$ ./record_libc_version.sh
Your system is : Debian-wheezy/sid
Your kernel version is :3.4.29+
Your arch is :armv7l ---arm 架构的哦!
Your libc library version is :2.15
而,在这一款板子上,Libc库所在位置是:
ubuntu@ubuntu:/tmp$ ls -l /lib/arm-linux-gnueabihf/libc.so.6
lrwxrwxrwx 1 root root 12 Oct 6 2012 /lib/arm-linux-gnueabihf/libc.so.6 -> libc-2.15.so
因此,匹配成功~~ OK,效果不错,了罢此文~~
相关文章推荐
- Shell 脚本小试牛刀(0) -- 开篇
- Shell脚本学习——[小试牛刀]
- Shell 脚本小试牛刀(番外) -- 捷报
- Shell 脚本小试牛刀(1) -- Debian系统初装后的各种配置
- Shell脚本攻略--小试牛刀
- Shell 脚本小试牛刀(2) -- git仓库的选取以及迁移
- Shell 脚本小试牛刀(4) -- 创建 git 仓库
- Shell 脚本小试牛刀(5) -- 超便捷脚本之快速ssh 登录其他主机
- Shell 脚本小试牛刀(2) -- git仓库的选取以及迁移
- Shell 脚本小试牛刀(番外) -- 捷报
- Shell 脚本小试牛刀(4) -- 创建 git 仓库
- shell脚本攻略学习笔记(一)小试牛刀
- Shell 脚本小试牛刀(5) -- 超便捷脚本之高速ssh 登录其它主机
- Linux shell 脚本攻略shell代码(小试牛刀)
- Shell脚本一枚
- shell脚本测试主机4个常见的网络服务是否开启
- 常用shell脚本片段
- Shell脚本遍历目录
- 读取文件的每一行内容并输出 的shell脚本实现
- shell脚本之echo(五)