0

测试一些新脚本我现在在 ps_redirect.sh 中遇到了这个问题

如果我使用 tmsh 在 CLI 发出命令,我可以看到我得到了想要的结果,即使 irule 当前处于使用状态。在找到匹配项 {2n;p} 后,我必须使用 sed 来操纵结果,如下所示

[root@bigip4k01:Active:In Sync] Scripts # tmsh list /ltm virtual /PSoft1/fn89prd_lexingtonky_ssl |sed -n '/Finance_Redirect/{2n;p}'
        Finance_Redirect
[root@bigip4k01:Active:In Sync] Scripts #

但是,当使用打开或关闭选项从 shell 脚本执行它作为提示对此输入进行操作的一部分时,我无法使用分隔符正确解析它 | (pipe) 命令后跟 sed,如下所示:

[root@bigip4k01:Active:In Sync] Scripts # ./ps_redirect.sh open hr9prd,fn89prd,hr9job,hr9pwd honor auto active
hello
logger: invalid option -- 'n'
usage: logger [-is] [-f file] [-p pri] [-t tag] [-u socket] [ message ... ]
Executing: tmsh list /ltm virtual /PSoft1/fn89prd_lexingtonky_ssl |sed -i -n '/fn89prd_rootlogin_ssl secure_clickjack splunk_http/{2n;p}'
Syntax Error: unexpected argument "|"
logger: invalid option -- 'n'
usage: logger [-is] [-f file] [-p pri] [-t tag] [-u socket] [ message ... ]
Executing: tmsh list /ltm virtual /PSoft1/hr9prd_lexingtonky_ssl |sed -i -n '/hr9prd_rootlogin_ssl secure_clickjack splunk_http/{2n;p}'
Syntax Error: unexpected argument "|"
logger: invalid option -- 'n'
usage: logger [-is] [-f file] [-p pri] [-t tag] [-u socket] [ message ... ]
Executing: tmsh list /ltm virtual /PSoft1/hr9prd_pwd_lexingtonky_ssl |sed -i -n '/hr9prd_pwd_roottologin_ssl secure_clickjack splunk_http/{2n;p}'
Syntax Error: unexpected argument "|"
logger: invalid option -- 'n'
usage: logger [-is] [-f file] [-p pri] [-t tag] [-u socket] [ message ... ]
Executing: tmsh list /ltm virtual /PSoft1/jobs_lexingtonky_ssl |sed -i -n '/jobs_https_rule secure_clickjack splunk_http/{2n;p}'
Syntax Error: unexpected argument "|"
Executing: tmsh run /cm config-sync to-group Production
[root@bigip4k01:Active:In Sync] Scripts #


[root@bigip4k01:Active:In Sync] Scripts # ./ps_redirect.sh close hr9prd,fn89prd,hr9job,hr9pwd honor auto active
hello
logger: invalid option -- 'n'
usage: logger [-is] [-f file] [-p pri] [-t tag] [-u socket] [ message ... ]
Executing: tmsh list /ltm virtual /PSoft1/fn89prd_lexingtonky_ssl |sed -i -n '/Finance_Redirect/{2n;p}'
Syntax Error: unexpected argument "|"
logger: invalid option -- 'n'
usage: logger [-is] [-f file] [-p pri] [-t tag] [-u socket] [ message ... ]
Executing: tmsh list /ltm virtual /PSoft1/hr9prd_lexingtonky_ssl |sed -i -n '/HCM_Redirect secure_clickjack splunk_http/{2n;p}'
Syntax Error: unexpected argument "|"
logger: invalid option -- 'n'
usage: logger [-is] [-f file] [-p pri] [-t tag] [-u socket] [ message ... ]
Executing: tmsh list /ltm virtual /PSoft1/hr9prd_pwd_lexingtonky_ssl |sed -i -n '/HCM_Redirect secure_clickjack splunk_http/{2n;p}'
Syntax Error: unexpected argument "|"
logger: invalid option -- 'n'
usage: logger [-is] [-f file] [-p pri] [-t tag] [-u socket] [ message ... ]
Executing: tmsh list /ltm virtual /PSoft1/jobs_lexingtonky_ssl |sed -i -n '/HCM_Redirect secure_clickjack splunk_http/{2n;p}'
Syntax Error: unexpected argument "|"
Executing: tmsh run /cm config-sync to-group Production

关于如何解析 | 的任何想法 (管道)后跟 sed?也许某处需要双引号或单引号?如果您知道如何解析 | 请告诉我 (管道)请正确后跟 sed。

再一次感谢你。

#!/bin/bash
# 2014/04/18 abh
#    added forgot password 
#
# 2015/07/18
#    changed redirects for fn89prd to reflect ssl changes to vip
#
#        1         2         3         4         5         6         7
# 2014/04/18
#    added extra i-rules for hr9
#23456789-123456789-123456789-123456789-123456789-123456789-123456789-12
#-----------------------------------------------------------------------
# USAGE help
#-----------------------------------------------------------------------
USAGE="\

Usage: ${0} 
            <direct:       close|open|test> 
            <system:       fn89prd|hr9prd|hr9job|epm9prd|hr9pwd|all|-> 
            <Maint_Window: honor|force> 
            <Peer Update:  preserve|auto|overwrite|manditory>
            <Status:       Active|Standby|Ignore>

use \"ps_redirect.sh help\" use for more documentation"
#-----------------------------------------------------------------------
# FULL help
#-----------------------------------------------------------------------
DOCUMENTATION="\
ps_redirect.sh  Version 1.1 (08-23-2011)

Usage: ${0} <direction> <system> <maint window> <peer update>

   direction    - redirect or remove a redirect
                  'close' - redirect
                  'open' - remove redirection
                  'test' - runs program but commands/logs are sent to 
                           the for inspection
   system       - the system name(s) to change rules for:
                  'fn89prd', 'hr9prd', 'hr9job', 'epm9prd', 'hr9pwd'
                  'all' for all defined systems 
                  use ',' to seperate multiple options
                  use '-' for none sync operation
   maint window - when 'honor' is used, then the script will not make
                  any changes unless it is maintenance week; use 'force' to
                  run and make change irrespective to maintenance window

   peer update  - if 'preserve' then no attempt is made to update the peer.
                  if 'auto' is used then a warning is raised if the peer has
                  changes and the peer is not overwritten.
                  if 'overwrite' is used then the current config will 
                  overwrite peer regardless of it's sync state.
                  if 'manditory' then the peer must be in sync for the local 
                  change to occur and the config is pushed to the peer

   Status       - Active or Standby; the system must be in this status.
                  If Ignore specified then the check is not performed and
                  the change will occur regardless of current status.

                     "

#-----------------------------------------------------------------------
# Processes a command by running or echo  
#-----------------------------------------------------------------------
process_cmd()
{
   my_msg=$1
   #If we are testing, issue to the screen
   if [ "$DIRECT_OPT" = "TEST" ]; then
      echo "CMD: "$my_msg
   else
   echo Executing: $my_msg
   $my_msg
   fi
}
#-----------------------------------------------------------------------
# process a logger entry by either logging or echo
#-----------------------------------------------------------------------
process_log()
{
   my_msg=$1
   #If we are testing, issue to the screen
   if [ "$DIRECT_OPT" = "TEST" ]; then
      echo "LOG: "logger" lgr_bip_usr "$my_msg
   else
      #echo Logging: $my_msg
      logger "lgr_bip_usr psoft"$my_msg
   fi
}
#-----------------------------------------------------------------------
# process an irule update, if test mode, then both the open and close 
# are processed to screen
#-----------------------------------------------------------------------
doRule()
{

#   MY_CMD1="b shell write partition "$PARTITION_NAME
#   process_log "Command: ""$MY_CMD1"
#   process_cmd "$MY_CMD1"
#
   sys_found=0
   if [ "$DIRECT_OPT" = "OPEN" ]; then
      sys_found=1
   fi
   if [ "$DIRECT_OPT" = "TEST" ]; then
      sys_found=1
   fi
   if [ "$sys_found" = "1" ]; then
      MY_CMD1="tmsh list /ltm virtual /"$PARTITION_NAME"/"$VIRTUAL_NAME" |sed -i -n '/"$OPEN_RULE"/{2n;p}'" 
      process_log "Command: ""$MY_CMD1"
      process_cmd "$MY_CMD1"
   fi
   sys_found=0
   if [ "$DIRECT_OPT" = "CLOSE" ]; then
      sys_found=1
   fi
   if [ "$DIRECT_OPT" = "TEST" ]; then
      sys_found=1
   fi
   if [ "$sys_found" = "1" ]; then
      MY_CMD1="tmsh list /ltm virtual /"$PARTITION_NAME"/"$VIRTUAL_NAME" |sed -i -n '/"$CLOSE_RULE"/{2n;p}'"
      process_log "Command: ""$MY_CMD1"
      process_cmd "$MY_CMD1"
      fi
}

#-----------------------------------------------------------------------
# MAIN
#-----------------------------------------------------------------------
if [ -f /root/.bashrc ]; then
        . /root/.bashrc
fi

prog_dir=`dirname $0`
run_dir=${PWD}

#typeset -u DIRECT_OPT
#typeset -u XESYSTEMS1
#typeset -u MAINT_WIN_OPT
#typeset -u PEER_UPD_OPT

#If user asks for extended help
if [ $# -eq 1 ]; then
    DIRECT_OPT=`echo $1 | tr '[a-z]' '[A-Z]'`
    if [ "$DIRECT_OPT" = "HELP" ]; then
       echo "$DOCUMENTATION"
       exit 1
    fi
fi

#Must have 4 parms
if [ $# -ne 5 ]; then
    echo "ERROR: Not enough parameters given."
    echo "$USAGE"
    exit 1
fi

#Make sure parm 1 is valid
#DIRECT_OPT=$1
DIRECT_OPT=`echo $1 | tr '[a-z]' '[A-Z]'`

DIRECT_VALID=No
if [ "$DIRECT_OPT" = "OPEN" ]; then
   DIRECT_VALID=Yes
fi
if [ "$DIRECT_OPT" = "CLOSE" ]; then
   DIRECT_VALID=Yes
fi
if [ "$DIRECT_OPT" = "TEST" ]; then
   DIRECT_VALID=Yes
fi
if [ "$DIRECT_VALID" = "No" ]; then
   echo "ERROR: Invalid Direction option."
   echo "$USAGE"
   exit 1
fi
#if test, say special message
if [ "$DIRECT_OPT" = "TEST" ]; then
   echo "TEST MODE: No commands or Logs will be issued."
fi

#parse and validate the system name parm
XESYSTEMS1=`echo $2 | tr '[a-z]' '[A-Z]'`
sys_opt_fn89prd=0
sys_opt_hr9prd=0
sys_opt_hr9job=0
sys_opt_epm9prd=0
sys_opt_epmupg=0
sys_opt_hr9pwd=0

#set -A A_SYSTEM $( echo "$XESYSTEMS1" | sed 's/,/ /g' )
A_SYSTEM=( `echo "$XESYSTEMS1" | tr ',' ' '`)
NUM_VARS=${#A_SYSTEM[@]}
i=0
while [ $i -lt $NUM_VARS ]
   do 
      sys_found=0
      if [ "${A_SYSTEM[i]}" = "ALL" ]; then
         sys_opt_fn89prd=1
         sys_opt_hr9prd=1
         sys_opt_hr9job=1
         sys_opt_epm9prd=1
         sys_opt_hr9pwd=1
         sys_found=1
      fi
      if [ "${A_SYSTEM[i]}" = "FN89PRD" ]; then
         sys_opt_fn89prd=1
         sys_found=1
      fi
      if [ "${A_SYSTEM[i]}" = "HR9PRD" ]; then
         sys_opt_hr9prd=1
         sys_found=1
      fi
      if [ "${A_SYSTEM[i]}" = "HR9PWD" ]; then
         sys_opt_hr9pwd=1
         sys_found=1
      fi
      if [ "${A_SYSTEM[i]}" = "HR9JOB" ]; then
         sys_opt_hr9job=1
         sys_found=1
      fi
      if [ "${A_SYSTEM[i]}" = "EPMUPG" ]; then
         sys_opt_epmupg=1
         sys_found=1
      fi
         if [ "${A_SYSTEM[i]}" = "EPM9PRD" ]; then
            sys_opt_epm9prd=1
            sys_found=1
         fi
      if [ "${A_SYSTEM[i]}" = "-" ]; then
         sys_found=1
      fi
      if [ "$sys_found" = "0" ]; then
         echo "ERROR: Invalid System Name."
         echo "$USAGE"
         exit 1
      fi
      i=`expr $i + 1`
   done

#parse and validate the maint window parm
MAINT_WIN_OPT=`echo $3 | tr '[a-z]' '[A-Z]'`
sys_found=0
if [ "$MAINT_WIN_OPT" = "HONOR" ]; then
   sys_found=1
fi
if [ "$MAINT_WIN_OPT" = "FORCE" ]; then
   sys_found=1
fi
if [ "$sys_found" = "0" ]; then
   echo "ERROR: Invalid Maintenance Window option."
   echo "$USAGE"
   exit 1
fi

#if we are honoring maint window and not a good time, then end here
if [ "$MAINT_WIN_OPT" = "HONOR" ]; then
   WK=`date +%W`
   ON_WK=`expr $WK % 2`
   if [ "$ON_WK" = "1" ]; then
      #We'll just write this to the screen
      echo "Cannot perform operation(s) at this time with HONOR option set."
      exit 1
   fi
fi

#parse and validate the peer update flag
PEER_UPD_OPT=`echo $4 | tr '[a-z]' '[A-Z]'`
PEER_UPD_PRESERVE=0
PEER_UPD_AUTO=0
PEER_UPD_OVERWRITE=0
PEER_UPD_MANDITORY=0
sys_found=0
if [ "$PEER_UPD_OPT" = "PRESERVE" ]; then
   PEER_UPD_PRESERVE=1
   sys_found=1
fi
if [ "$PEER_UPD_OPT" = "AUTO" ]; then
   PEER_UPD_AUTO=1
   sys_found=1
fi
if [ "$PEER_UPD_OPT" = "OVERWRITE" ]; then
   PEER_UPD_OVERWRITE=1
   sys_found=1
fi
if [ "$PEER_UPD_OPT" = "MANDITORY" ]; then
   PEER_UPD_MANDITORY=1
   sys_found=1
fi
if [ "$sys_found" = "0" ]; then
   echo "ERROR: Invalid Peer Update option."
   echo "$USAGE"
   exit 1
fi

STATUS_OPT=`echo $5 | tr '[a-z]' '[A-Z]'`

STATUS_VALID=No
if [ "$STATUS_OPT" = "ACTIVE" ]; then
   STATUS_VALID=Yes
fi
if [ "$STATUS_OPT" = "STANDBY" ]; then
   STATUS_VALID=Yes
fi
if [ "$STATUS_OPT" = "IGNORE" ]; then
   STATUS_VALID=Yes
fi
if [ "$STATUS_VALID" = "No" ]; then
   echo "ERROR: Invalid Status option."
   echo "$USAGE"
   exit 1
fi

#check the node status and validate we know what we see
#ACTIVE_STATUS="Active"
#ACTIVE_STATUS="Standby"
#ACTIVE_STATUS=`/bin/ps1`
ACTIVE_STATUS=` echo $(getPromptStatus) | tr '[a-z]' '[A-Z]'`

sys_found=0
if [ "$STATUS_OPT" = "IGNORE" ]; then
   sys_found=1
else
   if [ "$STATUS_OPT" = "$ACTIVE_STATUS" ]; then
      sys_found=1
   else
      echo "ERROR: System is not the specified mode."
      exit 1
   fi
fi

#if [ "$ACTIVE_STATUS" = "Active" ]; then
#   sys_found=1
#fi
#if [ "$ACTIVE_STATUS" = "Standby" ]; then
#   echo "ERROR: System is not the active Node."
#   exit 1
#   sys_found=1
#fi
#if [ "$sys_found" = "0" ]; then
#   echo "ERROR: Unknown Node Active Status."
#   exit 1
#fi

#check the sync status and validate we know what we see
sync_code1="-1"
RECOMM_ACTION=""
SYNC_SUMMARY="All devices in the device group are in sync"
SYNC_COLOR="green"
#SYNC_STATUS="    Status 0 - Synchronized"
#HOSTNAME="tmsh list /sys global-settings hostname | grep hostname | awk '{print $2}'"
#RECOMM_ACTION="    Status 0 - Synchronized"
#RECOMM_ACTION="    Status 1 - Local config modified, recommend configsync to peer"
#RECOMM_ACTION="    Status 2 - Peer config modified, recommend configsync from peer"
#RECOMM_ACTION="    Status 3 - Config modified on both systems, manual intervention required"
#Marlon's replacement as below SYNC_STATUS=`b config sync show|grep Status`
#SYNC_STATUS=`b config sync show|grep Status`
#RECOMM_ACTION=`tmsh show /cm sync-status | grep "Recommended"`
RECOMM_ACTION=`tmsh show /cm sync-status | /bin/grep "Recommended"| /bin/awk '{print $2 $3 $4 $5 $6 $7 $8 }'`
SYNC_SUMMARY=`tmsh show /cm sync-status | grep "Summary"`
SYNC_COLOR=`tmsh show /cm failover-status | /bin/grep "Color" | /bin/awk '{print $2}'`

#echo "\n"
#echo $RECOMM_ACTION
#if [  "$RECOMM_ACTION" = "Recommendedaction:Synchronizeprimaryadc.f5.comtogroupProduction" ]; then
#echo "condition1 OK" 
#fi
#if [ "$RECOMM_ACTION" = "          - Recommended action: Synchronize primaryadc.f5.com to group Production"  ]; then
#echo OK
#     sync_code1="1"
#fi
#echo "\n"
#echo $SYNC_COLOR
#if [ "$SYNC_COLOR" = "green"  ]; then
#echo OK
#     sync_code1="1"
#fi
#echo "This is supposed to be the Recommendation" $RECOMM_ACTION
#echo "This is supposed to be the color" $SYNC_COLOR
if [ "$SYNC_SUMMARY" = "Summary  All devices in the device group are in sync" ]; then
      sync_code1="0"
fi
if [  "$SYNC_COLOR" = "green" ] && [ "$RECOMM_ACTION" = "Recommendedaction:Synchronizeprimaryadc.f5.comtogroupProduction" ]; then
      sync_code1="1"
fi
if [  "$SYNC_COLOR" = "green" ] && [ "$RECOMM_ACTION" = "Recommendedaction:Synchronizesecondaryadc.f5.comtogroupProduction" ]; then
      sync_code1="2"
fi
if [  "$SYNC_COLOR" = "gray" ] && [ "$RECOMM_ACTION" = "Recommendedaction:Synchronizeprimaryadc.f5.comtogroupProduction" ]; then
      sync_code1="2"
fi
if [  "$SYNC_COLOR" = "gray" ] && [ "$RECOMM_ACTION" = "Recommendedaction:Synchronizesecondaryadc.f5.comtogroupProduction" ]; then
      sync_code1="1"
fi
if [ "$SYNC_SUMMARY" = "Summary  There is a possible change conflict between primaryadc.f5.com and secondaryadc.f5.com." ]; then
      sync_code1="3"
fi
if [ "$sync_code1" = "-1" ]; then
   echo "ERROR: Unknown Sync Status."
   exit 1
fi

#if manditory and not (sync'd or local only updates) then an error to log and stop
if [ "$PEER_UPD_MANDITORY" = "1" ]; then
   sys_found=1
   if [ "$sync_code1" = "0" ]; then
      sys_found=0
   fi
   if [ "$sync_code1" = "1" ]; then
      sys_found=0
   fi
   if [ "$sys_found" = "1" ]; then
      process_log "ERROR: Manditory conditions not met as peer is out of sync"
      exit 1
   fi
fi

#if preserve and 3, log a warning?; continue; no push
PUSH_SYNC_FLAG=1
if [ "$PEER_UPD_PRESERVE" = "1" ]; then
   PUSH_SYNC_FLAG=0
   if [ "$sync_code1" = "3" ]; then
      process_log "WARNING: Peer and Self both have config changes "
   fi
fi

#if auto and (peer modified or both modified), log a warning, do not push
if [ "$PEER_UPD_AUTO" = "1" ]; then
   sys_found=0
   if [ "$sync_code1" = "2" ]; then
      sys_found=1
   fi
   if [ "$sync_code1" = "3" ]; then
     sys_found=1
   fi
   if [ "$sys_found" = "1" ]; then
      PUSH_SYNC_FLAG=0
      process_log "WARNING:  Peer cannot be updated.  Sync skipped. "
   fi
fi

#if overwrite and (peer modified or both modified), log a warning, push
if [ "$PEER_UPD_OVERWRITE" = "1" ]; then
   sys_found=0
   if [ "$sync_code1" = "2" ]; then
      sys_found=1
   fi
   if [ "$sync_code1" = "3" ]; then
     sys_found=1
   fi
   if [ "$sys_found" = "1" ]; then
      PUSH_SYNC_FLAG=0
      process_log "WARNING: Peer has changes that will be overwritten. "
   fi
fi

#process each virtual machine type and issue the commands as requested
#if [ "$sys_opt_fn89prd" = "1" ]; then
#   VIRTUAL_NAME=finance.lfucg.com
#   OPEN_RULE=root2login_finance.lfucg.com
#   CLOSE_RULE=Finance_Redirect
#   PARTITION_NAME=PSoft1
#   doRule
#fi
if [ "$sys_opt_fn89prd" = "1" ]; then
   VIRTUAL_NAME=fn89prd_lexingtonky_ssl
   OPEN_RULE='fn89prd_rootlogin_ssl secure_clickjack splunk_http'
   CLOSE_RULE=Finance_Redirect
   PARTITION_NAME=PSoft1
   echo hello
   doRule
fi

if [ "$sys_opt_hr9prd" = "1" ]; then
   VIRTUAL_NAME=hr9prd_lexingtonky_ssl
   OPEN_RULE='hr9prd_rootlogin_ssl secure_clickjack splunk_http'
   CLOSE_RULE='HCM_Redirect secure_clickjack splunk_http'
   PARTITION_NAME=PSoft1
   doRule

fi

if [ "$sys_opt_hr9pwd" = "1" ]; then
   VIRTUAL_NAME=hr9prd_pwd_lexingtonky_ssl
   OPEN_RULE='hr9prd_pwd_roottologin_ssl secure_clickjack splunk_http'
   CLOSE_RULE='HCM_Redirect secure_clickjack splunk_http'
   PARTITION_NAME=PSoft1
   doRule
fi

if [ "$sys_opt_epm9prd" = "1" ]; then
   VIRTUAL_NAME=epm.lexingtonky.gov
   OPEN_RULE=epm9prd_rootlogin
   CLOSE_RULE=EPM_Redirect
   PARTITION_NAME=PSoft1
   doRule

fi
if [ "$sys_opt_hr9job" = "1" ]; then
   VIRTUAL_NAME=jobs_lexingtonky_ssl
   OPEN_RULE='jobs_https_rule secure_clickjack splunk_http'
   CLOSE_RULE='HCM_Redirect secure_clickjack splunk_http'
   PARTITION_NAME=PSoft1
   doRule
fi

if [ "$sys_opt_epmupg" = "1" ]; then
   VIRTUAL_NAME=tstepmwa2
   OPEN_RULE=tstepmwa2_http_root 
   CLOSE_RULE=HCM_Redirect
   PARTITION_NAME=PSoft2
   doRule
fi

#if we need to push our config, do that now
if [ "$PUSH_SYNC_FLAG" = "1" ]; then
   MY_CMD1="tmsh run /cm config-sync to-group Production"
   process_log "Command: ""$MY_CMD1"
   process_cmd "$MY_CMD1"
fi

马龙

4

0 回答 0