Java 企業應用
          不要溫柔的走入那個良夜

           

          程序的目的是在redhat和AIX上同時運行,對于很多指令,使用Redhat完成了,但是AIX上沒有,這時,我們選擇Alias的方式,在AIX的Env中,提供具備這樣功能的指令模塊。

          下面是研究怎么實現redhat iptables的stub.

          Step (1)about port  <=> [inbound ,outbound]

          查看端口占用情況:

          Issue the command:(as 389 it the port you want to seek )
          netstat -Aan | grep 389
          this will return:
          f1000089c27a2358 tcp4 0 0 *.389 *.* LIST EN
          The next step is to take this value that was generated, f1000089c27a2358 and run it against the rmsock command:
          rmsock f100089c27a2358 tcpcb
          this command will return the process that is holding the socket.
          The socket 0xc27a2000 is being held by process 204914 (ndsd).

          image

          Step (2)ipsec

          什么是ipsec?

          ipsec是IEFT提出的network管理標準工具。

          ipsec的指令集:

          Filters can be defined via the SMIT panel at the fastpath ips4_add_filter or via the command line, using the genfilt command. The SMIT method presents a screen similar to the table in the previous section. To create the filter "by hand", the following flags to the genfilt command are used to specify the attributes of the filter rule:

          -v

          The IP version to which this filter applies. Valid values are "4" and "6"
          -n

          The filter ID, or number: The new rule will be added before the number specified with this flag. If not specified, the rule will be added to the end of the filter rules table.
          -a

          The "action" of the rule: valid values are "P" (permit) and "D" (deny)
          -s

          The source address: Specify either a fully qualified domain name (FQDN) or an IP address of the host or network to which this rule will apply. The value "0.0.0.0" specifies all IP addresses.
          -m

          The source subnet mask: This will be used with the source address in determining whether this filter rule matches. The value "0.0.0.0" specifies all subnet masks.
          -d

          The destination address: Specify either the FQDN or the IP address of the interface for which incoming packets should be matched against. The value "0.0.0.0" specifies all IP addresses on the system.
          -M

          The destination subnet mask: This will be used with the destination address in determining whether this filter rule matches. The value "0.0.0.0" specifies all subnet masks.
          -g

          Specifies whether this rule applies to source routed packets. Valid values are "Y" (yes) and "N" (no).
          -c

          Protocol: Specify the protocols which will be matched by this filter rule. Valid values are "udp", "icmp", "tcp", "tcp/ack", and "all".
          -o

          Source port/ICMP operation: This is the comparison operator that will be used in matching the source port of the packet to this rule. Valid values are "lt" (less than), "le" (less than or equal to), "gt" (greater than), "ge" (greater than or equal to), "eq" (equal), "neq" (not equal), or "any".
          -p

          Source port/ICMP type: This value will be compared to the source port of the packet for possible matches.
          -O

          Destination port/ICMP operation: This is the comparison operator that will be used in matching the destination port of the packet to this rule. Valid values are the same as for the "-o" flag.
          -P

          Destination port/ICMP type: This value will be compared to the destination port of the packet for possible matches.
          -r

          Routing/Scope: Specifies whether the rule will apply to forwarded packets (R), packets destined or originated from the local host (L), or both (B).
          -w

          Direction: Specifies whether the rule will apply to incoming packets (I), outgoing packets (O), or both (B).
          -l

          Logging: Specifies that an entry to syslog will be sent for packets that match this rule. Valid values are "Y" (yes) and "N" (no).
          -f

          Fragmentation control: Specifies whether the rule will apply to fragment headers and unfragmented packets (H), fragment headers and fragments only (O), unfragmented packets only (N), or all packets (Y).
          -i

          Interface: specifies the interface on which this filter rule applies. Valid values are the logical names of interfaces (en0, tr0, lo0, etc.) or "all" for all interfaces.

          ipsec四個命令:

          To work with TCP/IP filters you only need a few commands, which is explained here and then used in the next section. If you're familiar with AIX commands you see that these follow the same logic of having descriptive prefixes in their names, like mk, ls, and rm, followed by the filt suffix.

          • lsfilt: List filters rules present in the table. When created, each rule is assigned a number, which can be easily seen using this command.
          • genfilt: Adds a filter rule to the table. This is the one you use to create new filters. If you do not specify a position with the –nparameter, the new rule is added at the end of the table.
          • chfilt: Used to change existing filter rules. You need to provide the rule ID to indicate which rule you want to modify. Rule 1 is the default rule and can't be changed with this command.
          • rmfilt: The rm suffix should sound familiar with any UNIX administrator. You use this command whenever you have to remove a filter rule providing its rule ID.
          • mkfilt: This is a key command that allows us to activate or deactivate the filter rules in the table, enable or disable logging for filters, and change the default rules. For the changes done to the filters table to take effect, you'll have to run this command with some arguments.

           

          Refer:http://www.darklab.net/resources/aix-ipsec-filtering.html

                     http://unix.ittoolbox.com/groups/technical-functional/ibm-aix-l/implementing-ipsec-on-aix-machines-1332621

                     http://www.ibm.com/developerworks/aix/library/au-aixfiltering/index.html

          使用過程:

          (1)啟動/關閉

          # smitty ipsec4

          (2)是否啟動

          # lsdev -l ipsec_v4

           

          (3)做個改變

          # chfilt -v 4 -n 3 -i en1
          Filter rule 3 for IPv4 has been changed successfully.
          #

           

          (4)添加新的Rule

          ## Rules to reject traffic to the Web Application not coming from the Proxy
          # genfilt -v 4 -a D -s 0 -m 0 -d 172.16.10.45 -M 255.255.255.255 -g N 
          -c tcp -O eq -P 80 -r L -w I -l Y -f Y -i all

           

          (5)設置log

          Now, you are going to configure the syslog daemon to log entries coming from the IP filters in a file that you specify.

          ## Backup syslog.conf file before modifying it.
          # cp /etc/syslog.conf /etc/syslog.conf.bak
          ## Append entry for IP filters logs.
          # echo "local4.debug /var/adm/ipsec.log" >> /etc/syslog.conf
          ## Create log file and set permissions (permissions may depend on 
          ## company policies)
          # touch /var/adm/ipsec.log
          # chmod 644 /var/adm/ipsec.log
          ## Refresh the syslog subsystem to activate the new configuration.
          # refresh -s syslogd
          0513-095 The request for subsystem refresh was completed successfully.

           

          (6)配置更新,上面的更新不會立即生效,除非運行下面的命令

           # Start the log functionality of the filter rule module
          # mkfilt -g start
          # # Activates the filter rules
          # mkfilt –u
          Step (3) iptables
          iptables 是linux中防火墻流行的管理工具
          針對本文的作用,僅僅說明一種使用,若要詳盡的了解,需耐心的閱讀一個非常優秀的文章,鏈接如下:
          Refer:http://man.chinaunix.net/network/iptables-tutorial-cn-1.1.19.html
                or http://linux.ccidnet.com/pub/html/tech/iptables/index.htm
           
          我們只是需要使用iptables像外界提供訪問本機資源的端口:

          httpPort=80
          httpsPort=443
          adminPort=8008

           

          那么就使用下面的命令:

          cmd 1 :iptables -A INPUT -p tcp --dport ${port} -j ACCEPT

          cmd 2 :iptables -A INPUT -p tcp -s localhost -j ACCEPT

          cmd 1 .在filter表上添加一條規則,如果socket pack來自TCP且push到${port}端口,就接收。

          cmd 2 .在filter表上添加一條規則,如果源IP地址是本機,就接收。

           

          Step (4)mock iptables

          如果是用IPsec來實現打開端口,允許訪問的話,是這樣:

          genfilt -v 4 -a P -s 0.0.0.0 -m 0.0.0.0 -d 127.0.0.1 -M 0.0.0.0 -g Y -c tcp –o any –p 0  -O eq -P 80 -r B -w B -l N -f Y -i all

          mkfilt -u

           

          所以,就是這樣做一個mock

          #
          # cloud_iptables - simulate iptables
          #
          function aix_iptables
          {
              echo "aix_iptables:[$@]"
              port=""
                while [ $# -ne 0 ]; do
                  case $1 in
                      --dport)
                          port=$2
                          genfilt -v 4 -a P -s 0.0.0.0 -m 0.0.0.0 -d 127.0.0.1 -M 0.0.0.0 -g Y -c tcp –o any –p 0 -O eq -P $port -r B -w B -l N -f Y -i all
                          shift 1
                          ;;
                      -s)
                          sourceip=$2
                          genfilt -v 4 -a P -s $sourceip -m 0.0.0.0 -d 127.0.0.1 -M 0.0.0.0 -g Y -c tcp –o any –p 0 -O any -P 0 -r B -w B -l N -f Y -i all
                          shift 1
                          ;;   
                      *)
                          shift 1
                          ;;
                  esac
              done
          }

          但是,這還沒有結束

          使用iptables時,我們是這樣:

          iptables -A INPUT -p tcp -s localhost -j ACCEPT
          service iptables save

          語句1 用來實現添加一條 rules

          語句2 用來使變更生效

          所以,還需要mock service 方法,這樣,在兩個平臺中,語句1和語句2就都完成了打開一些防火墻端口的功能。  

          function aix_service
          {
              if [ "$1" = "iptables" ]; then
                  mkfilt -u  
              else
                  echo "aix_service $*"
              fi
          }

          對于系統的判斷:

          function on_AIX
          {
              test "`uname`" = "AIX"
          }

          如果是AIX系統的話,就要在AIX上執行aliases了。

          if aliases_on_aix ; then
              shopt -s expand_aliases     # enable expand aliases,keep it on
              alias sudo='aix_sudo'
              alias hostname='aix_hostname'
              alias iptables='aix_iptables'
              alias chkconfig='aix_chkconfig'
              alias service='aix_service'
              alias                     
          fi

          上面是在AIX的bash環境下進行的。

          posted @ 2012-08-11 13:59 cpegtop 閱讀(4261) | 評論 (0)編輯 收藏
           

          http://qlj.sh.cn/python/20100402/python-time/

           

          python 的內嵌time模板翻譯及說明

          一、簡介

          time模塊提供各種操作時間的函數
          說明:一般有兩種表示時間的方式:
          第一種是時間戳的方式(相對于1970.1.1 00:00:00以秒計算的偏移量),時間戳是惟一的
          第二種以數組的形式表示即(struct_time),共有九個元素,分別表示,同一個時間戳的struct_time會因為時區不同而不同
          year (four digits, e.g. 1998)
          month (1-12)
          day (1-31)
          hours (0-23)
          minutes (0-59)
          seconds (0-59)
          weekday (0-6, Monday is 0)
          Julian day (day in the year, 1-366)
          DST (Daylight Savings Time) flag (-1, 0 or 1) 是否是夏令時
          If the DST flag is 0, the time is given in the regular time zone;
          if it is 1, the time is given in the DST time zone;
          if it is -1, mktime() should guess based on the date and time.

          二、函數介紹
          1.asctime()
          asctime([tuple]) -> string
          將一個struct_time(默認為當時時間),轉換成字符串
          Convert a time tuple to a string, e.g. ‘Sat Jun 06 16:26:11 1998′.
          When the time tuple is not present, current time as returned by localtime()
          is used.

          2.clock()
          clock() -> floating point number
          該函數有兩個功能,
          在第一次調用的時候,返回的是程序運行的實際時間;
          以第二次之后的調用,返回的是自第一次調用后,到這次調用的時間間隔

          示例:

          view plaincopy to clipboardprint?
          import time  
          if __name__ == '__main__':  
              time.sleep(1)  
              print "clock1:%s" % time.clock()  
              time.sleep(1)  
              print "clock2:%s" % time.clock()  
              time.sleep(1)  
              print "clock3:%s" % time.clock()

          輸出:
          clock1:3.35238137808e-006
          clock2:1.00004944763
          clock3:2.00012040636
          其中第一個clock輸出的是程序運行時間
          第二、三個clock輸出的都是與第一個clock的時間間隔

          3.sleep(…)
          sleep(seconds)
          線程推遲指定的時間運行,經過測試,單位為秒,但是在幫助文檔中有以下這樣一句話,這關是看不懂
          “The argument may be a floating point number for subsecond precision.”

          4.ctime(…)
          ctime(seconds) -> string
          將一個時間戳(默認為當前時間)轉換成一個時間字符串
          例如:

            time.ctime()

          輸出為:’Sat Mar 28 22:24:24 2009′

          5.gmtime(…)
          gmtime([seconds]) -> (tm_year, tm_mon, tm_day, tm_hour, tm_min,tm_sec, tm_wday, tm_yday, tm_isdst)
          將一個時間戳轉換成一個UTC時區(0時區)的struct_time,如果seconds參數未輸入,則以當前時間為轉換標準

          6.localtime(…)
          localtime([seconds]) -> (tm_year,tm_mon,tm_day,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)
          將一個時間戳轉換成一個當前時區的struct_time,如果seconds參數未輸入,則以當前時間為轉換標準

          7.mktime(…)
          mktime(tuple) -> floating point number
          將一個以struct_time轉換為時間戳

          8.strftime(…)
          strftime(format[, tuple]) -> string
          將指定的struct_time(默認為當前時間),根據指定的格式化字符串輸出
          python中時間日期格式化符號:
          %y 兩位數的年份表示(00-99)
          %Y 四位數的年份表示(000-9999)
          %m 月份(01-12)
          %d 月內中的一天(0-31)
          %H 24小時制小時數(0-23)
          %I 12小時制小時數(01-12)
          %M 分鐘數(00=59)
          %S 秒(00-59)

          %a 本地簡化星期名稱
          %A 本地完整星期名稱
          %b 本地簡化的月份名稱
          %B 本地完整的月份名稱
          %c 本地相應的日期表示和時間表示
          %j 年內的一天(001-366)
          %p 本地A.M.或P.M.的等價符
          %U 一年中的星期數(00-53)星期天為星期的開始
          %w 星期(0-6),星期天為星期的開始
          %W 一年中的星期數(00-53)星期一為星期的開始
          %x 本地相應的日期表示
          %X 本地相應的時間表示
          %Z 當前時區的名稱
          %% %號本身

          9.strptime(…)
          strptime(string, format) -> struct_time
          將時間字符串根據指定的格式化符轉換成數組形式的時間
          例如:
          2009-03-20 11:45:39 對應的格式化字符串為:%Y-%m-%d %H:%M:%S
          Sat Mar 28 22:24:24 2009 對應的格式化字符串為:%a %b %d %H:%M:%S %Y

          10.time(…)
          time() -> floating point number
          返回當前時間的時間戳

          三、疑點
          1.夏令時
          在struct_time中,夏令時好像沒有用,例如
          a = (2009, 6, 28, 23, 8, 34, 5, 87, 1)
          b = (2009, 6, 28, 23, 8, 34, 5, 87, 0)
          a和b分別表示的是夏令時和標準時間,它們之間轉換為時間戳應該相關3600,但是轉換后輸出都為646585714.0

          四、小應用
          1.python獲取當前時間
          time.time() 獲取當前時間戳
          time.localtime() 當前時間的struct_time形式
          time.ctime() 當前時間的字符串形式

          2.python格式化字符串
          格式化成2009-03-20 11:45:39形式

            time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

          格式化成Sat Mar 28 22:24:24 2009形式

            time.strftime("%a %b %d %H:%M:%S %Y", time.localtime())

          3.將格式字符串轉換為時間戳

            a = "Sat Mar 28 22:24:24 2009"
            b = time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y"))

          轉載自csdn

          python 的內嵌time模板翻譯及說明

          一、簡介

          time模塊提供各種操作時間的函數
          說明:一般有兩種表示時間的方式:
          第一種是時間戳的方式(相對于1970.1.1 00:00:00以秒計算的偏移量),時間戳是惟一的
          第二種以數組的形式表示即(struct_time),共有九個元素,分別表示,同一個時間戳的struct_time會因為時區不同而不同
          year (four digits, e.g. 1998)
          month (1-12)
          day (1-31)
          hours (0-23)
          minutes (0-59)
          seconds (0-59)
          weekday (0-6, Monday is 0)
          Julian day (day in the year, 1-366)
          DST (Daylight Savings Time) flag (-1, 0 or 1) 是否是夏令時
          If the DST flag is 0, the time is given in the regular time zone;
          if it is 1, the time is given in the DST time zone;
          if it is -1, mktime() should guess based on the date and time.

          二、函數介紹
          1.asctime()
          asctime([tuple]) -> string
          將一個struct_time(默認為當時時間),轉換成字符串
          Convert a time tuple to a string, e.g. ‘Sat Jun 06 16:26:11 1998′.
          When the time tuple is not present, current time as returned by localtime()
          is used.

          2.clock()
          clock() -> floating point number
          該函數有兩個功能,
          在第一次調用的時候,返回的是程序運行的實際時間;
          以第二次之后的調用,返回的是自第一次調用后,到這次調用的時間間隔

          示例:

          view plaincopy to clipboardprint?
          import time  
          if __name__ == '__main__':  
              time.sleep(1)  
              print "clock1:%s" % time.clock()  
              time.sleep(1)  
              print "clock2:%s" % time.clock()  
              time.sleep(1)  
              print "clock3:%s" % time.clock()

          輸出:
          clock1:3.35238137808e-006
          clock2:1.00004944763
          clock3:2.00012040636
          其中第一個clock輸出的是程序運行時間
          第二、三個clock輸出的都是與第一個clock的時間間隔

          3.sleep(…)
          sleep(seconds)
          線程推遲指定的時間運行,經過測試,單位為秒,但是在幫助文檔中有以下這樣一句話,這關是看不懂
          “The argument may be a floating point number for subsecond precision.”

          4.ctime(…)
          ctime(seconds) -> string
          將一個時間戳(默認為當前時間)轉換成一個時間字符串
          例如:

            time.ctime()

          輸出為:’Sat Mar 28 22:24:24 2009′

          5.gmtime(…)
          gmtime([seconds]) -> (tm_year, tm_mon, tm_day, tm_hour, tm_min,tm_sec, tm_wday, tm_yday, tm_isdst)
          將一個時間戳轉換成一個UTC時區(0時區)的struct_time,如果seconds參數未輸入,則以當前時間為轉換標準

          6.localtime(…)
          localtime([seconds]) -> (tm_year,tm_mon,tm_day,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)
          將一個時間戳轉換成一個當前時區的struct_time,如果seconds參數未輸入,則以當前時間為轉換標準

          7.mktime(…)
          mktime(tuple) -> floating point number
          將一個以struct_time轉換為時間戳

          8.strftime(…)
          strftime(format[, tuple]) -> string
          將指定的struct_time(默認為當前時間),根據指定的格式化字符串輸出
          python中時間日期格式化符號:
          %y 兩位數的年份表示(00-99)
          %Y 四位數的年份表示(000-9999)
          %m 月份(01-12)
          %d 月內中的一天(0-31)
          %H 24小時制小時數(0-23)
          %I 12小時制小時數(01-12)
          %M 分鐘數(00=59)
          %S 秒(00-59)

          %a 本地簡化星期名稱
          %A 本地完整星期名稱
          %b 本地簡化的月份名稱
          %B 本地完整的月份名稱
          %c 本地相應的日期表示和時間表示
          %j 年內的一天(001-366)
          %p 本地A.M.或P.M.的等價符
          %U 一年中的星期數(00-53)星期天為星期的開始
          %w 星期(0-6),星期天為星期的開始
          %W 一年中的星期數(00-53)星期一為星期的開始
          %x 本地相應的日期表示
          %X 本地相應的時間表示
          %Z 當前時區的名稱
          %% %號本身

          9.strptime(…)
          strptime(string, format) -> struct_time
          將時間字符串根據指定的格式化符轉換成數組形式的時間
          例如:
          2009-03-20 11:45:39 對應的格式化字符串為:%Y-%m-%d %H:%M:%S
          Sat Mar 28 22:24:24 2009 對應的格式化字符串為:%a %b %d %H:%M:%S %Y

          10.time(…)
          time() -> floating point number
          返回當前時間的時間戳

          三、疑點
          1.夏令時
          在struct_time中,夏令時好像沒有用,例如
          a = (2009, 6, 28, 23, 8, 34, 5, 87, 1)
          b = (2009, 6, 28, 23, 8, 34, 5, 87, 0)
          a和b分別表示的是夏令時和標準時間,它們之間轉換為時間戳應該相關3600,但是轉換后輸出都為646585714.0

          四、小應用
          1.python獲取當前時間
          time.time() 獲取當前時間戳
          time.localtime() 當前時間的struct_time形式
          time.ctime() 當前時間的字符串形式

          2.python格式化字符串
          格式化成2009-03-20 11:45:39形式

            time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

          格式化成Sat Mar 28 22:24:24 2009形式

            time.strftime("%a %b %d %H:%M:%S %Y", time.localtime())

          3.將格式字符串轉換為時間戳

            a = "Sat Mar 28 22:24:24 2009"
            b = time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y"))

          轉載自csdn

          posted @ 2012-07-30 13:45 cpegtop 閱讀(4884) | 評論 (0)編輯 收藏
           

          From:http://www.juyimeng.com/python-common-time-function.html

          我們先導入必須用到的一個module
          >>> import time
          設置一個時間的格式,下面會用到
          >>>ISOTIMEFORMAT=’%Y-%m-%d %X’
          看一下當前的時間,和其他很多語言相似這是從epoch(1970 年 1 月 1 日 00:00:00)開始到當前的秒數。
          >>> time.time()
          1180759620.859
          上面的看不懂,換個格式來看看
          >>> time.localtime()
          (2007, 6, 2, 12, 47, 7, 5, 153, 0)
          localtime返回tuple格式的時間,有一個和它類似的函數叫gmtime(),2個函數的差別是時區,gmtime()返回的是0時區的值,localtime返回的是當前時區的值。
          >>> time.strftime( ISOTIMEFORMAT, time.localtime() )
          ’2007-06-02 12:54:29′
          用上我們的時間格式定義了,使用strftime對時間做一個轉換,如果取現在的時間,time.localtime() 可以不用。

          >>> time.strftime( ISOTIMEFORMAT, time.localtime( time.time() ) )
          ’2007-06-02 12:54:31′
          >>> time.strftime( ISOTIMEFORMAT, time.gmtime( time.time() ) )
          ’2007-06-02 04:55:02′
          上面展示了gmtime和localtime的區別。
          查看時區用
          >>> time.timezone
          -28800
          上面的值是一個秒值,是當前時區和0時區相差的描述,-28800=-8*3600,即為東八區。

          帖幾個簡單的函數

          def ISOString2Time( s ):
          '''
              convert a ISO format time to second
              from:2006-04-12 16:46:40 to:23123123
              把一個時間轉化為秒
          '''
          return time.strptime( s, ISOTIMEFORMAT )
          def Time2ISOString( s ):
          '''
              convert second to a ISO format time
              from: 23123123 to: 2006-04-12 16:46:40
              把給定的秒轉化為定義的格式
          '''
          return time.strftime( ISOTIMEFORMAT, time.localtime( float( s) ) )
          def dateplustime( d, t ):
          '''
              d=2006-04-12 16:46:40
              t=2小時
             return  2006-04-12 18:46:40
             計算一個日期相差多少秒的日期,time2sec是另外一個函數,可以處理,3天,13分鐘,10小時等字符串,回頭再來寫這個,需要結合正則表達式。
          '''
          return Time2ISOString( time.mktime( ISOString2Time( d ))+time2sec( t ) )
          def dateMinDate( d1, d2 ):
          '''
              minus to iso format date,return seconds
              計算2個時間相差多少秒
          '''
          d1=ISOString2Time( d1 )
          d2=ISOString2Time( d2 )
          return time.mktime( d1 )-time.mktime( d2 )

          posted @ 2012-07-30 13:40 cpegtop 閱讀(178) | 評論 (0)編輯 收藏
           

               首先將需要升級的文件放到一個路徑下面。

               然后指定升級命令,將參數指定到補丁文件的位置和配置文件。

               假設升級文件經過上傳,到了 /opt/package1 中,在package1中,或許是一個單一的解壓后的ifix包,或許是多個zip格式的ifix壓縮包。或許是若干 rpm包。也可能是zip包和rpm包的混合。

               每個ifix文件是zip格式,每個zip文件的根目錄下都有一個配置文件:repository.xml

               而rpm包,則是linux系統上 使用 rpm –Uvh 進行安裝。

               其中,ifix包使用 IBM InstallationManager的指令 imcl進行安裝。

               一個合理的思路就是:

               1.檢測package1下面有無rpm文件,有則將其整理成一個list,交給 rpm –Uvh

               2.檢測package1下面有無 zip文件且zip中必須含有repository.xml文件

               3.如果2中檢測到有符合要求的zip文件,則將其解壓到/opt/package2中,將ifix 路徑傳給 imcl.如果沒有符合要求的zip文件,則檢測當前目錄下,有無repository.xml 有則將package1復制到opt/package2/package1中,交給imcl處理。

          install sh

          #!  /bin/sh
           
          ZIPPATH=/opt/zip
          IFIXTOOL=/home/hailiang/script/ifixtool.sh
          # List Zips 
          listZips() {
            for file in `find $ZIPPATH -type f -name '*.zip'`;do
                    (unzip -t "${file}"|grep repository.xml) &> /dev/null && echo $file
                            done
          }
          # Update IM
          updateIM(){
          zipList=`listZips`
                  echo "Applying iFixs:"$zipList
          ${IFIXTOOL} $zipList
          }
          # Update RPM
          {
           filename=$1
           echo "Apply rpm fix file(s)"         
                   
          rpm -Uvh $filename
          }
           
          # Main
          echo ">> start to install ifix files "
           
          # check if there is any .rpm file under /opt/zip
          rpmCount=`expr $(ls $ZIPPATH/*.rpm 2>/dev/null|wc -l)`
           
          if [ $rpmCount -ne 0 ]; then 
              fixList=`ls $ZIPPATH`
              echo "installing rpm(s):"$fixList
              rpmList=""
              for file in $ZIPPATH/*.rpm;do 
                rpmList=$rpmList" "$file 
              done
              echo "Apply rpm(s):"$rpmList
              rpm -Uvh $rpmList
          fi
           
          # installing ifix and ignore some times.
            echo "ensure permissions are suitable for update"
            chown -hR $username:users /tmp/update
           
           echo "installing ifix" 
           installed=0
           
          #Check whether there is any zip file 
          zipCount=`expr $(listZips|wc -l)`
          if [ $zipCount -eq 0 ]; then
             # Treat is as a single ifix IM repo 
             cd $ZIPPATH
             zip -r fix,zip `find -type f -name repository.xml -exec dirname{} \;`
             cd -
             zipCount=1
          fi   
          fixtotal=$zipCount
          echo $fixtotal needs to be applyed . 
          updateIM
           
          else
            echo " nothing happened."
          fi  
           
          # Remove files 
          rm -rf $ZIPPATH
           
          echo "<< exit"
            
           

              

          tool shell

          #! /bin/sh
           
          # set -x
           
          zipfilelist=""
          for zipfile;do
             if [ -f "$zipfile" ];then 
                 zipfiledir=$(cd `dirname "${zipfile}"`;pwd)
                 zipfilename=$(basename "${zipfile}")
                 zipfilelist="${zipfiledir}/${zipfilename} ${zipfilelist}"
                 fi
                 done
          echo $zipfilelist    
          #unzip ifix
          rm -rf /tmp/im
          mkdir /tmp/im
          cd /tmp/im
           
          for file  in ${zipfilelist};do
              if [ -f "$file" ]; then 
                  filename=$(basename "${file}")
                  unzip -d ${filename%.*} "$file"
                  fi
          done
           
          posted @ 2012-07-17 15:29 cpegtop 閱讀(192) | 評論 (0)編輯 收藏
           

                     LEARN FROM:http://learn.akae.cn/media/ch31s03.html

           

          1.變量

          環境變量可以從父進程傳給子進程,因此Shell進程的環境變量可以從當前Shell進程傳給fork出來的子進程。用printenv命令可以顯示當前Shell進程的環境變量.用set命令可以顯示當前Shell進程中定義的所有變量(包括本地變量和環境變量)和函數.

          本地變量:$ VARNAME=value   注意等號兩邊都不能有空格,否則會被Shell解釋成命令和命令行參數。

          子進程shell變量導出:$ export VARNAME=value 這樣父進程的Shell也可以使用這個變量

          2.通配符

             image

          ls ch[012][0-9].doc

          3.命令代換

          由反引號括起來的也是一條命令,Shell先執行該命令,然后將輸出結果立刻代換到當前命令行中。例如定義一個變量存放date命令的輸出:

          image

          DATE=$(date)

          4.算數代換

          用于算術計算,$(())中的Shell變量取值將轉換成整數

          5.轉義“\”

          6.條件測試

          image

           

          7.控制
              case

          #! /bin/sh
           
          echo "is it moring? Please answer yes or no ."
          read YES_OR_NO
          case "$YES_OR_NO" in 
          yes|Yes|y|YES)
                echo "Good Moring!";;
          [nN]*)
                echo "Good afternoon.";;
          *)
                echo "Sorry, $YES_OR_NO not recognized. Enter yes or no . "
                exit 1;;
          esac 
          exit 0

              for

          #! /bin/sh
           
          for FRUIT in apple banana pear ; do 
              echo "I like $FRUIT"
          done
           

                 if

          #! /bash/sh
           
          echo "is it morning? please answer yes or no ."
          read YES_OR_NO
          if [ "$YES_OR_NO" = "yes" ]; then
             echo "Good Morning."
          elif [ "$YES_OR_NO" = "no" ]; then 
             echo "Good afternoon."
          else 
             echo "Sorry ,$YES_OR_NO not recognized.Enter yes or no."
             exit 1 
          fi
          exit 0

                 While

           

          #! /bin/sh
           
          echo "Enter Password:"
          read TRY
          while [ "$TRY" != "p" ]; do 
              echo "Sorry, Try again"
              read TRY
          done

                Shift

          #! /bin/bash
          echo "the number of params $#" 
          echo "the contents of params $@"
          shift 
          echo "$1" 
          shift 
          echo "$1"
          shift
          echo "$1"
          

          shift 向左偏移 ,$#代表傳進參數的個數 而$@是具體的內容,當執行shift的時候,$#和$@也會相應的改變。

          #! /bin/bash
          echo "the number of params $#"
          echo "the contents of params $@"
          shift
          echo "num:$# contents:$@"
          shift
          echo "num:$# contents:$@"

          image

           

          8.函數

          #! /bin/sh
           
          is_d()
          {
           DIR_NAME=$1
            if ( test -d $DIR_NAME ); then
              return 1
            else 
              return 0
          fi
          }
           
          for DIR in "$@" ; do 
              if is_d "$DIR"
              then :
              else 
                 echo "not a dir"
              fi 
          done

          9.調試

          Shell提供了一些用于調試腳本的選項,如下所示:

          -n

          讀一遍腳本中的命令但不執行,用于檢查腳本中的語法錯誤

          -v

          一邊執行腳本,一邊將執行過的腳本命令打印到標準錯誤輸出

          -x

          提供跟蹤執行信息,將執行的每一條命令和結果依次打印出來

          使用這些選項有三種方法,一是在命令行提供參數

          set -xset +x分別表示啟用和禁用-x參數,這樣可以只對腳本中的某一段進行跟蹤調試。

           

          從今天的一些編碼來看,Shell編程要注意腳本中的空格,在if,while語句中 “[ ]”要留空格,以及變量的定義中,等號兩端不要存有空格。

          posted @ 2012-06-25 18:12 cpegtop 閱讀(228) | 評論 (0)編輯 收藏
          僅列出標題
          共6頁: 上一頁 1 2 3 4 5 6 下一頁 
           
          主站蜘蛛池模板: 沂源县| 巧家县| 襄城县| 青神县| 舟山市| 崇信县| 聊城市| 英德市| 和田市| 家居| 丰县| 神池县| 高雄市| 行唐县| 繁峙县| 同仁县| 石林| 嘉善县| 岢岚县| 洛浦县| 西平县| 栾川县| 铜陵市| 阳曲县| 洛隆县| 海宁市| 柯坪县| 太和县| 嘉义市| 商城县| 南木林县| 曲松县| 庄河市| 都匀市| 大安市| 武宁县| 正安县| 庆城县| 行唐县| 清水河县| 德清县|