免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Shell_HAT
打印 上一主题 下一主题

[其他] shell技术讨论--实际工作中的应用(获奖名单已公布-2014-4-21) [复制链接]

论坛徽章:
0
51 [报告]
发表于 2014-03-31 19:02 |只看该作者
seesea2517 发表于 2014-03-21 17:13
说好的顶帖呢?

话题一,你当初为什么选择了学习shell?


这才是传说中的大神啊

论坛徽章:
0
52 [报告]
发表于 2014-04-01 08:29 |只看该作者
话题一,你当初为什么选择了学习shell?
因為找工作,想往運維方面發展.
话题二,在你的实际工作中,用shell实现了哪些功能?请给出详细的背景介绍、完整的源代码和注释,这将是我们评选的重要标准之一,如有隐私信息请做无害化处理
可以減少時間,人力.其實最大的好處可以看看源碼或是配制,看看軟件等是什麼結構是怎樣運行的.這樣對LINUX更好的了解學習.

论坛徽章:
0
53 [报告]
发表于 2014-04-01 09:54 |只看该作者
Shell遵从经典UNIX哲学:把复杂的问题分解成简单的小问题,然后再把各部分功能组合起来解决复杂问题。
我可以用shell脚本来监控服务器整体的性能,简化每日繁琐的工作步骤,数据的备份,日志的搜集整理......

使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层次,能够轻易处理
文件与目录之类的对象。缺点是:它们的效率通常不如编译型语言。不过权衡之下,通
常使用脚本编程还是值得的:花一个小时写成的简单脚本,同样的功能用C或C++来编
写实现,可能需要两天,而且一般来说,脚本执行的速度已经够快了,快到足以让人忽
略它性能上的问题。

因为Shell似乎是各UNIX系统之间通用的功能,并且经过了POSIX的标准化。因此,
Shell脚本只要“用心写”一次,即可应用到很多系统上。之所以要使用Shell脚本是基
于:

简单性
    Shell是一个高级语言,通过它,你可以简洁地表达复杂的操作。

可移植性
    使用POSIX所定义的功能,可以做到脚本无须修改就可在不同的系统上执行。

开发容易
    可以在短时间内完成一个功能强大又好用的脚本。


图形界面对很多任务的确是很有帮助,不过,它并不适合于所有的任务。我曾经有很长一段时间,感觉到今天的很多计算机不是由电子元器件组成的。取而代之的是,它们好像是由鼠标驱动的。
计算机被认为是把人类从体力劳动中解放出来的工具,不过,你做过多少次这样的任务----你完全确信计算机是可以完成的?你通常是很沉闷的用鼠标完成的-----点击,然后,还是点击

当你是小孩的时候,你是通过图形化的方式来使用计算机的。当你长大的时候,你就学会了用写和读的方式(来使用计算机)



论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-02-06 06:20:00
54 [报告]
发表于 2014-04-01 15:30 |只看该作者
Shell_HAT

论坛徽章:
1
未羊
日期:2014-06-16 09:14:34
55 [报告]
发表于 2014-04-02 10:47 |只看该作者
本帖最后由 jimmy14k 于 2014-04-02 11:22 编辑

话题一,你当初为什么选择了学习shell?

    在2013年以前,我都没接触过linux,以前公司都用windows,不过我用windows写过很多批处理,比如批量录音转换(wav2mp3,呼叫中心录的wav太占空间,所以要转换)、文件名的重定义等等。
    2013年后,换了公司,才开始接触linux,公司服务器太多,而且很多项目故障要等客户反馈,才处理,效率太低,所以才开始学linux shell和python

话题二,在你的实际工作中,用shell实现了哪些功能?请给出详细的背景介绍、完整的源代码和注释,这将是我们评选的重要标准之一,如有隐私信息请做无害化处理。
    到现在为止,linux shell和python我还是半瓢水,主要用shell来检测程序运行的状态,还有java程序日志的监控,如果是常见的错误,根据开发同事的需求,进行自动处理,如果是非常见的错误,邮件通知自己。
    python主要是用来处理数据库的,根据经纬度,从谷歌的xml获取位置信息,然后更新到数据库。
    因为接触linux时间不长,我很多shell发问贴,都是工作中需要解决的关键问题,但是自己没能掌握,比如取2小时内日志中存在ERROR字符串的行,困惑我N久,最后CU发贴才解决。在awk、sed这两部分,掌握的不够。

jimmy_xml_google.py
  1. import urllib2
  2. import xml.dom.minidom




  3. def getxmlinfo(lon,lat):
  4.     url="http://maps.google.com/maps/api/geocode/xml?latlng=%s,%s&language=zh-CN&sensor=true" % (lat,lon)
  5.     resp=urllib2.urlopen(url)
  6.     rtn=resp.read()
  7.     resp.close()
  8.     dom = xml.dom.minidom.parseString(rtn)
  9.     r = dom.getElementsByTagName("formatted_address")
  10.     r = r[0].childNodes[0].nodeValue
  11.     return r

  12.    

  13.      
  14.    
  15.    
  16. if __name__ == '__main__':
  17.     getxmlinfo(110.23990,32.20596)
复制代码
  1. #coding=utf-8
  2. import MySQLdb
  3. import jimmy_xml_google
  4. from datetime import date
  5. import sys
  6. default_encoding = 'utf-8'
  7. if sys.getdefaultencoding() != default_encoding:
  8.     reload(sys)
  9.     sys.setdefaultencoding(default_encoding)
  10. def upd_info():
  11.     dbs=['z_subscves0','z_subscves1','z_subscves2','z_subscves3','z_subscves4','z_subscves5']
  12.     #ym = date.today().strftime("%Y%m")
  13.     ym = 201303
  14.     i=0
  15.     while i<len(dbs):
  16.         conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='xxx',db=dbs[i],charset='utf8')
  17.         cur = conn.cursor()
  18.         cur.execute('set names utf8')
  19.         #cur.execute("select count(*) from tbl_location_%s where (LOC_INFO = '未计算' or LOC_INFO = '' or LOC_INFO is NULL) and TERMINAL_TIME >= curdate()" % (ym))
  20.         cur.execute("select count(*) from tbl_location_%s where (LOC_INFO = '未计算' or LOC_INFO = '' or LOC_INFO is NULL)" % (ym))
  21.         rs = cur.fetchall()
  22.         if len(rs)>0:
  23.             rtn = rs[0][0]
  24.         print ('%s:%s' % (dbs[i],rtn))
  25.         #query_wjs = "select LOCATION_PK,TERMINAL_SIM,LON,LAT from TBL_LOCATION_LAST WHERE (LOC_INFO = '未计算' or LOC_INFO = '' or LOC_INFO is NULL) and TERMINAL_TIME >= curdate()"
  26.         cur.execute("select LOCATION_PK,TERMINAL_SIM,LON,LAT from TBL_LOCATION_%s WHERE (LOC_INFO = '未计算' or LOC_INFO = '' or LOC_INFO is NULL)" % (ym))
  27.         rs_wjs = cur.fetchall()
  28.         if len(rs_wjs)>0:
  29.             for rtn_wjs in rs_wjs:
  30.                 rsp = jimmy_xml_google.getxmlinfo(rtn_wjs[2],rtn_wjs[3])
  31.                 print rtn_wjs[0],rtn_wjs[1],rtn_wjs[2],rtn_wjs[3],rsp
  32.                 cur.execute('set names utf8')
  33.                 cur.execute("update TBL_LOCATION_%s SET LOC_INFO = '%s' WHERE LOCATION_PK = '%s' and TERMINAL_SIM = '%s' and (LOC_INFO = '未计算' or LOC_INFO = '' or LOC_INFO is NULL)" % (ym,rsp.encode('utf-8'),rtn_wjs[0],rtn_wjs[1]))

  34.         
  35.         cur.close()
  36.         conn.close()
  37.         i=i+1

  38.      
  39.    
  40.    
  41. if __name__ == '__main__':
  42.     upd_info()
复制代码

论坛徽章:
0
56 [报告]
发表于 2014-04-02 10:55 |只看该作者
学习SHELL是因为相对于其它语言简单。也能快速的处理工作中需求。

用SHELL脚本分析日志并提取。其它的倒感觉没干过啥了。

论坛徽章:
0
57 [报告]
发表于 2014-04-02 11:07 |只看该作者
一,你当初为什么选择了学习shell?
运维自动化,简化繁复的工作,方便维护。
二,在你的实际工作中,用shell实现了哪些功能?请给出详细的背景介绍、完整的源代码和注释,这将是我们评选的重要标准之一,如有隐私信息请做无害化处理。
整合平时繁重的工作,

论坛徽章:
0
58 [报告]
发表于 2014-04-02 11:29 |只看该作者
话题一,你当初为什么选择了学习shell?
方便日常工作.
有些时候就是工作要求, 比如用cron实现一些脚本, 肯定要用它了.

话题二,在你的实际工作中,用shell实现了哪些功能?请给出详细的背景介绍、完整的源代码和注释,这将是我们评选的重要标准之一,如有隐私信息请做无害化处理。
这个就是一个三地文件通过sftp同步文件, 代码真心不能上了.
各种严格要求,看到了会被fire的.

论坛徽章:
5
金牛座
日期:2013-10-14 14:40:422015年亚洲杯之伊朗
日期:2015-03-26 10:37:012015亚冠之浦和红钻
日期:2015-10-12 17:47:4115-16赛季CBA联赛之山东
日期:2016-01-20 16:43:1215-16赛季CBA联赛之辽宁
日期:2016-03-29 16:43:59
59 [报告]
发表于 2014-04-02 16:21 |只看该作者
话题一,你当初为什么选择了学习shell?
      喜欢命令行,感觉比较酷(前提是能做图形界面做不了的事情)。最开始win下的dos,后来学习了linux,那就必须shell,功能强大,自动化,避免重复劳动

话题二,在你的实际工作中,用shell实现了哪些功能?请给出详细的背景介绍、完整的源代码和注释,这将是我们评选的重要标准之一,如有隐私信息请做无害化处理。
      主要做系统维护的,实际工作中用脚本的也不多,自己喜欢罢了
1、批量ping  
#./ping.sh ip.txt(ip列表)
#vi ping.sh
#!/bin/bash
         for machine in $(cat ip.txt|grep -v '^#' |grep -v '^$')
         do
                 ping -c 2 -w2 $machine > /dev/null 2>&1
                 [ $? -eq 0 ] && echo "$ip is alive"  || echo "$ip is not alive"

         done
1、经常做网卡绑定,干脆就写个脚本了,也备忘(SLES10和SLES11测试通过)
SP3_11:~ # ./ifcfg-bond0_utf8.sh  (根据实际情况重启网络没写入脚本,执行后重启网络)
Input Virtual Ip: 192.168.10.14     #网卡绑定后的ip
Input Netmask:     #子网掩码(不赋值就默认255.255.255.0)
Input Lladdr:         #如果需要改mac地址在这里赋值,不需要就回车
Input Card Number:    #几块网卡绑定,默认两块 ,回车
Input mode balance-rr(0) or active-backup(1):     #绑定模式输入0或1来选择
Input slave0:     #网卡号, 两块网卡的话,默认eth0和eth1
Input slave1:     


#!/bin/bash
read -p "Input Virtual Ip: " IP
read -p "Input Netmask: " NMASK
: ${NMASK:="255.255.255.0"}
read -p "Input Lladdr: " LL
read -p "Input Card Number:  " NUMBER
: ${NUMBER:=2}

##mode=0:表示load balancing (round-robin)为负载均衡方式,两块网卡都在工作。
##mode=1:表示fault-tolerance (active-backup)提供冗余功能,工作方式是主备的工作方式,其中一块网卡在工作(若eth0断掉),则自动切换到另一个块网卡(eth1做备份)。
read -p "Input mode balance-rr(0) or active-backup(1): " MODE
: ${MODE:=1}

for (( i=0;i<$NUMBER;i++ ))
   do
      read -p "Input slave$i: " SLAVE[$i]
done
: ${SLAVE[0]:=eth0}
: ${SLAVE[1]:=eth1}


##收集mac地址(sles10网卡配置文件名为ifcfg-eth-id-mac格式)
ETHS="`echo ${SLAVE[*]} |sed 's/ /\\\|/g'`"
HWADDRS=(`ifconfig -a|sed -n '/'$ETHS'/{s/.*HWaddr //;s/.*/\L&\n\U&/p}'`)


##原网卡配置文件备份
for j in ${SLAVE[*]}
   do
   [ -f /etc/sysconfig/network/ifcfg-$j ] && mv /etc/sysconfig/network/ifcfg-$j /etc/sysconfig/network/`date +%Y%m%d%H%M%S`.ifcfg-$j
done
for k in ${HWADDRS[*]}
   do
   [ -f /etc/sysconfig/network/ifcfg-eth-id-$k ] && mv /etc/sysconfig/network/ifcfg-eth-id-$k /etc/sysconfig/network/`date +%Y%m%d%H%M%S`.ifcfg-eth-id-$k
done


##生成绑定文件ifcfg-bond0
[ -f /etc/sysconfig/network/ifcfg-bond0 ] && echo "ifcfg-bond0 already exists .." && exit 1

[ $LL ] && echo "LLADDR='$LL'">>/etc/sysconfig/network/ifcfg-bond0
echo "BOOTPROTO='static'
STARTMODE='onboot'
BONDING_MASTER='yes'
IPADDR='$IP'
NETMASK='$NMASK'" >>/etc/sysconfig/network/ifcfg-bond0

case $MODE in
0|balance-rr)
   echo "BONDING_MODULE_OPTS='mode=0 miimon=200'">>/etc/sysconfig/network/ifcfg-bond0
   ;;
1|active-backup)
   echo "BONDING_MODULE_OPTS='mode=1 miimon=200 primary=${SLAVE[0]}'">>/etc/sysconfig/network/ifcfg-bond0
   ;;
*)
   echo "mode error......."
   ;;
esac
for (( n=0;n<${#SLAVE[*]};n++ ))
   do
   echo "BONDING_SLAVE$n='${SLAVE[$n]}'">>/etc/sysconfig/network/ifcfg-bond0
done
echo "####################################"
cat /etc/sysconfig/network/ifcfg-bond0
echo "####################################"
ls /etc/sysconfig/network/




3、上面是工作能用的,这就是自己玩的了,这个情况有些狗血啊,有个朋友买了好多彩票(1500张)让我给他比对下中奖没,晕死
彩票比对脚本:
SP3_11:~/shell # ./cp_bd.sh list.txt(号码列表)
32 03 26 23 17 02 13 2  no    #多了两列,倒数第二列是红球一样的个数,倒数第一列是最后一个篮球的是否一样
23 09 05 20 17 08 06 1  no
21 31 25 09 24 29 03 0  yes
...
...
#!/bin/bash
id=(06 13 17 18 28 32 03)   #这个是中奖号码我就直接写脚本里了
declare -i total=0
cat $1 |while read LINE
do
   T=($LINE)
   for i in ${id[@]:0:6}
      do
         for j in ${T[@]:0:6}
            do
               if [ $i -eq $j ];then
                    ((total++))
               fi
            done
      done
echo -n $LINE" "$total " "
if [[ ${id[6]} == ${T[6]} ]];then
     echo "yes"
     else echo "no"
fi
total=0
done

写后我想我也买一点吧,就写了个自动生成彩票号脚本:
SP3_11:~/shell # ./cp.sh 10(生成多少组号码)
29      08      31      24      13      16      11
22      27      20      05      16      30      02
32      30      19      25      03      23      07
...
...
#!/bin/bash
for((n=0;n<$1;n++))
do
return=else
num[1]=$(($RANDOM%34))
while [ ${num[1]} -eq 0 ]
do
num[1]=$(($RANDOM%34))
done
for (( i=2;i<7;i++ ))
do
   while [ $return != "ok" ]
   do
       num[i]=$(($RANDOM%34))
       while [ ${num[i]} -eq 0 ]
            do
               num[i]=$(($RANDOM%34))
            done
       for (( k=1;k<=i-1;k++ ))
          do
             if [ ${num[i]} == ${num[k]} ]; then
             return=else
             break
             else
             return=ok
             fi
           done
     done
     return=else
done

printf "%02d\t" ${num[@]}

lan=$(($RANDOM%17))
   while [ $lan -eq 0 ]
       do
          lan=$(($RANDOM%17))
       done
printf "%02d\n" $lan

done

论坛徽章:
1
丑牛
日期:2014-04-04 17:35:24
60 [报告]
发表于 2014-04-03 14:05 |只看该作者
话题一,你当初为什么选择了学习shell?
工作需要,其实我是学习perl的,不过shell也常用的到。

话题二,在你的实际工作中,用shell实现了哪些功能?请给出详细的背景介绍、完整的源代码和注释。

【背景】
公司需要翻==墙的路由,怎么弄?
用ssh+privoxy实现就好。代理主机安装privoxy,监听本网段的主机的请求,端口设置为8118,同时将来自8118端口转给本机的sock5端口1080处理,socks能翻==墙吗?
对的,就是使用ssh翻的。。。
下面是一些关键代码,环境我就不弄出来了。

【function】
1.能够让ssh始终在线
2.如果ssh由于某些因素连接不上,它可以自动重连。

ssh使用代理有提示用户输入这一交互环节的,解决这个需要用到工具expect。
#expect这个工具是一同事告诉我的,它可以在提示用户输入的那个时刻,在脚本中把定义好的值扔给等待的提示,这样就不需要交互了。
# yum -y install expect

【代码】
下面2个脚本放在同一个目录,开启代理只需要执行 startssh.sh 即可。
#./startssh.sh &
(没找到可以代码排版的东东

————————————————————————
#!/bin/bash
# File:startssh.sh
# usage for shop connect about ssh
# if connect fail ,then restart

con=`ps aux | grep 1080 | grep ssh | awk '{print $2}'`
#chomp $con
if [ $con ];
then
        echo "ssh seem started already! \n ID: $con";
else
        /root/sshs1
        /root/startssh.sh
        echo "process no exists!!\n\n\n"
fi
————————————————————————


————————————————————————
#!/usr/bin/expect -D 1
# File: sshs1

set timeout 300
#start local ssh agent
#if ip bleow not useful ,try below
#IP list

set password your_password

spawn ssh -CNfg -D 0.0.0.0:1080 -l user_name ssh_host
expect {
        "*assword:"
        {
                set timeout  300
                send "$password\n"
        }
}
expect EOF
————————————————————————
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP