使用此文档中功能 [英] Using Functions inside here document

查看:123
本文介绍了使用此文档中功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我也有它里面的一些功能它主体用来执行脚本。现在,我想在3远程UNIX机器上运行此脚本。这是做到这一点的最巧妙的方法?
最重要的是,我不写的远程连接第二个脚本。一切都应该是这一个脚本中。

我试过使用ssh,这是不是因为大职能工作定界符!

code -

 #!/斌/庆典#年月日相关功能
# 功能
#查找没有。在一年的天
yeardays()
{
#参数检查
如果[X $ 1 = X]
然后
        今年读
其他
        一年= $ 1
科幻
#检查闰年
如果[`$ expr的一年%400` = 0]
然后
        366回声
        出口
科幻如果[`$ expr的一年%100` = 0]
然后
        365回声
        出口
科幻如果[`$ expr的一年%4` = 0]
然后
        366回声
        出口
科幻365回声
}#查找没有。在一个月中的天
monthdays()
{
#参数检查
如果[X $ 1 = X]
然后
     阅读YYYYMMDD格式YMD#年
ELIF [X $ 2 = X]
然后
      YMD = $ 1
其他
      YMD =`expr的\\($ 1 \\ * 10000 \\)+ \\($ 2 \\ * 100 \\)+ 1`
科幻年=`$ EXPR YMD / 10000`;
一个月=`expr的\\($ YMD%10000 \\)/ 100`;案例$月
      1 | 3 | 5 | 7 | 8 | 10 | 12)回31;出口 ;;
      4 | 6 | 9 | 11)回30;出口 ;;
      *);;
ESAC#除了2月份,这取决于当年是否是闰年
#使用yeardays获得的天数在当年和返回值
#相应。
DAYSINYEAR =`$ yeardays year`案例$ DAYSINYEAR在
   365)回声28;出口 ;;
   366)回声29;出口 ;;
ESAC
}ymd2yd()#从年月日(阳历),以YYYYDDD(朱利安)转换
{
#参数检查
如果[X $ 1 = X]
然后
        阅读日期
其他
        日期= $ 1
科幻年=`$ expr的日期/ 10000`
一个月=`expr的\\($日期%10000 \\)/ 100`
天=`$ expr的日期%100`数= 1
而[`$ EXPR计数\\< $ month` = 1]

        daysInMonth =`$ monthdays每年$ count`
        天=`$ EXPR天+ $ daysInMonth`
        数=`$ expr的计数+ 1`
DONE朱利安=`expr的\\($一年\\ * 1000 \\)+ $ days`
回声$朱利安
}yd2ymd()#转换YYYYDDD(朱利安)到年月日(阳历)
{
#参数检查
如果[X $ 1 = X]
然后
        阅读日期
其他
        日期= $ 1
科幻年=`$ expr的日期/ 1000`
天=`$ expr的日期%1000`一个月= 1
而[`$ EXPR天\\> 0` = 1]

        daysInMonth =`$ monthdays每年$ month`
        天=`$ expr的天 - $ daysInMonth`
        一个月=`$ EXPR月+ 1`
DONE天=`$ expr的天\\ + $ daysInMonth`
一个月=`$ EXPR每月\\ - 1`格里=`expr的\\($一年\\ * 10000 \\)+ \\(每月$ \\ * 100 \\)+ $ days`
回声$阳历
}ydadd()#加/减天YYYYDDD格式
{
#参数检查
如果[X $ 2 = X]
然后
        差异= $ 1
        读码#阅读YYYYDDD格式日期
其他
        YD = $ 1
        差异= $ 16
科幻天=`$ expr的YD%1000`
年=`$ expr的YD / 1000`天=`$ EXPR天+ $ difference`
DAYSINYEAR =`$ yeardays year`而[`$ EXPR天\\> $ daysInYear` = 1]

        天=`$ expr的天 - $ daysInYear`
        年=`$ expr的一年+ 1`
        DAYSINYEAR =`$ yeardays year`
DONE而[`$ EXPR天\\< 1` = 1]

        年=`$ expr的一年 - 1`
        DAYSINYEAR =`$ yeardays year`
        天=`$ EXPR天+ $ daysInYear`
DONEYD =`expr的\\($一年\\ * 1000 \\)+ $#days`最后日期YYYYDDD格式
回声$码
}ymdadd()#加/减天YYYYMMDD格式
{
如果[X $ 2 = X]
然后
        差异= $ 1
        阅读YMD#读取YYYYMMDD格式的日期
其他
        YMD = $ 1
        差异= $ 16
科幻回声$ YMD | ymd2yd | ydadd $差| yd2ymd#转换为年月日YYYYDDD,执行日期运算,然后恢复到YYYYMMDD格式
}daysLeft()#计算YYYYMMDD格式两个日期之间的天
{
#参数检查
如果[X $ 1 = X]
然后
        阅读ymd1#YYYYMMDD格式第一次约会
        阅读ymd2#YYYYMMDD格式第二次约会
ELIF [X $ 2 = X]
然后
        ymd1 = $ 1
        阅读ymd2
其他
        ymd1 = $ 1
        ymd2 = $ 16
科幻YEAR1 =`$ EXPR ymd1 / 10000`
MONTH1 =`expr的\\($ ymd1%10000 \\)/ 100`
DAY1 =`$ EXPR%ymd1 100`YEAR2 =`$ EXPR ymd2 / 10000`
MONTH2 =`expr的\\($ ymd2%10000 \\)/ 100`
DAY2 =`$ EXPR%ymd2 100`daysm1 =`$ monthdays YEAR1 $ month1`
天=`$ EXPR daysm1 - $ day1`
MONTH1 =`$ EXPR MONTH1 + 1`而[`$ EXPR MONTH1 \\< = 12'= 1]

        daysm1 =`$ monthdays YEAR1 $ month1`
        天=`$ EXPR天+ $ daysm1`
        MONTH1 =`$ EXPR MONTH1 + 1`
DONEX = 1
而[`EXPR $ X \\< $ month2` = 1]

        daysm2 =`$ monthdays YEAR2 $ x`
        天=`$ EXPR天+ $ daysm2`
        X =`$ expr的X + 1`
DONE天=`$ EXPR天+ $ day2`
回声$天
}# 主体
#连接到不同的服务器
声明-a SERVER =('server1的'服务器2''服务器3')
remoteuser表= ABC
serverNumbers = $ {#服务器[@]}
数= 0
而[`$ EXPR计数\\< $ serverNumbers` = 1]

    #连接到服务器
    SSH -T -q $ @ remoteuser表$ {SERVER [计数]}<< - END_TEXT
    VALUE =`猫/home/cognos/cognos/c8/configuration/cogstartup.xml |用grep -i XSD:长期|头-1 |切-d>中-f2 | SED的/ [:/< | CRN:值] * // g'`
    VALUE_BACKUP = $ VALUE
    让价值 - = 30'
    让我们VALUE * = 86400'
    RESULT1 =`perl的-e'@stats = STAT(/家庭/ COGNOS / COGNOS / C8 /配置/ signkeypair);打印((时间 - $统计[9])LT;$ VALUE);'`
    RESULT2 =`perl的-e'@stats = STAT(/家庭/ COGNOS / COGNOS / C8 /配置/ encryptkeypair);打印((时间 - $统计[9])LT;$ VALUE);'`
    RESULT3 =`perl的-e'@stats = STAT(/家庭/ COGNOS / COGNOS / C8 /配置/ caSerial);打印((时间 - $统计[9])LT;$ VALUE);'`
    而[$ RESULT1-o$ RESULT2-o$ RESULT3]
    做
            回声发送邮件。
            #计算天了
            CURRENT_DATE =`日期+%Y-%M-%D| SED的/ - // g'`
            CREATION_DATE =`LS -logE /家庭/ COGNOS / COGNOS / C8 /配置/ |用grep -i signkeypair | AWK'{打印$ 4}'| SED的/ - // g'`
            EXPIRY_DATE =`$ ymdadd CREATION_DATE $ VALUE_BACKUP`
            DAYS_LEFT =`$ daysLeft $ CURRENT_DATE EXPIRY_DATE`
            #从主机名标识的环境 - DEV / UAT / PRD
            LOCALHOST =`hostname`
            ENVIRONMENT_TYPE =`回声$ LOCALHOST | perl的-ne'〜米/.*([A-ZA-Z] {3})[0-9] * $ /;打印$ 1;'| TR[A-Z]''[A-Z]'`
            #识别过程 - FormPF / GoReporting
            如果(回声$ LOCALHOST | grep的-i CFP>的/ dev / null的),那么
                   PROCESS =FormPF
            其他
                   PROCESS =GoReporting
            科幻
            #添加细节,以邮件正文
            回声关键是在`LS -log /家庭/ COGNOS / COGNOS / C8 /配置/创建| grep的-i signkeypair | awk的'{打印$ 4 $ 5,$ 6}'`,并设置后,$ VALUE_BACKUP天后过期。 > mail.txt
            回声关键在$ DAYS_LEFT天后到期! >> mail.txt
            回声>> mail.txt
            回声服务器是 - >> mail.txt
            主机>> mail.txt
            回声>> mail.txt
            回声&GT文件夹/文件 - 的状态;> mail.txt
            回声>> mail.txt
            LS -log /家庭/ COGNOS / COGNOS / C8 /配置/ |用grep -i signkeypair | AWK'{$打印4,第5,$ 6,$ 7}'>> mail.txt
            LS -log /家庭/ COGNOS / COGNOS / C8 /配置/ | grep的-i encryptkeypair | AWK'{$打印4,第5,$ 6,$ 7}'>> mail.txt
            LS -log /家庭/ COGNOS / COGNOS / C8 /配置/ | grep的-i caSerial | AWK'{$打印4,第5,$ 6,$ 7}'>> mail.txt
        回声>> mail.txt
        回声无功键,请重启周末服务器下面的选项:>> mail.txt
        回声>> mail.txt
        回声/home/cognos/etc/restartAllServers.sh -cdsk>> mail.txt
            #发送邮件警告!
            SUBJECT =!!($ ENVIRONMENT_TYPE)$ PROCESS($ LOCALHOST)COGNOS CSK(通用对称密钥)到期!
            EMAIL =xyz@abc.com
            猫mail.txt | mailx的-s​​$ SUBJECT$电子邮件
        RM mail.txt
            打破
    DONE
    登出
    END_TEXT
    数=`$ expr的计数+ 1`
DONE
退出0


解决方案

移动功能定界符内。这可能需要一些改变code结构,但它会工作。

  SSH app01.datacentre.private<<排爆
hostdatefunc(){
回声\\ $(主机名)\\ $(日期)
}
hostdatefunc
EOD

您会得到远程服务器上的主机名和日期,不是你的。作品。愚蠢的例子,但概念证明。

I have a script which has a few functions inside it which the main body uses to execute. Now, I want to run this script on 3 remote unix machines. Which is the neatest way to do this ? Most importantly, I don't to write a second script for remote connection. Everything should be inside this one script.

I've tried heredoc with ssh, which is not working because of the big functions !

Code -

#!/bin/bash

# Year Month Day Related functions
# FUNCTIONS
# Find no. of days in a year
yeardays()
{
# argument check
if [ X$1 = X ]
then
        read year
else
        year=$1
fi
# Check for leap years
if [ `expr $year % 400` = 0 ]
then
        echo 366
        exit
fi

if [ `expr $year % 100` = 0 ]
then
        echo 365
        exit
fi

if [ `expr $year % 4` = 0 ]
then
        echo 366
        exit
fi

echo 365
}

# Find no. of days in a Month
monthdays()
{
# argument check
if  [ X$1 = X ]
then
     read ymd   # year in yyyymmdd format
elif [ X$2 = X ]
then
      ymd=$1
else
      ymd=`expr \( $1 \* 10000 \) + \( $2 \* 100 \) + 1`
fi

year=`expr $ymd / 10000` ;
month=`expr \( $ymd % 10000 \) / 100` ;

case $month in
      1|3|5|7|8|10|12) echo 31 ; exit ;;
      4|6|9|11) echo 30 ; exit ;;
      *) ;;
esac

# except for month 2, which depends on whether the year is a leap year
# Use yeardays to get the number of days in the year and return a value
# accordingly.
daysInYear=`yeardays $year`

case $daysInYear in
   365) echo 28 ; exit ;;
   366) echo 29 ; exit ;;
esac
}

ymd2yd()    # convert from YYYYMMDD(gregorian) to YYYYDDD(julian)
{
# argument check
if [ X$1 = X ]
then
        read date
else
        date=$1
fi

year=`expr $date / 10000`
month=`expr \( $date % 10000 \) / 100`
days=`expr $date % 100`

count=1
while [ `expr $count \< $month` = 1 ]
do
        daysInMonth=`monthdays $year $count`
        days=`expr $days + $daysInMonth`
        count=`expr $count + 1`
done

julian=`expr \( $year \* 1000 \) + $days`
echo $julian
}

yd2ymd()    # convert from YYYYDDD(julian) to YYYYMMDD(gregorian)
{
# argument check
if [ X$1 = X ]
then
        read date
else
        date=$1
fi

year=`expr $date / 1000`
days=`expr $date % 1000`

month=1
while [ `expr $days \> 0` = 1 ]
do
        daysInMonth=`monthdays $year $month`
        days=`expr $days - $daysInMonth`
        month=`expr $month + 1`
done

days=`expr $days \+ $daysInMonth`
month=`expr $month \- 1`

gregorian=`expr \( $year \* 10000 \) + \( $month \* 100 \) + $days`
echo $gregorian
}

ydadd()     # Add/Subtract days to YYYYDDD format
{
# argument check
if [ X$2 = X ]
then
        difference=$1
        read yd     # Read the YYYYDDD format date
else
        yd=$1
        difference=$2
fi

days=`expr $yd % 1000`
year=`expr $yd / 1000`

days=`expr $days + $difference`
daysInYear=`yeardays $year`

while [ `expr $days \> $daysInYear` = 1 ]
do
        days=`expr $days - $daysInYear`
        year=`expr $year + 1`
        daysInYear=`yeardays $year`
done

while [ `expr $days \< 1` = 1 ]
do
        year=`expr $year - 1`
        daysInYear=`yeardays $year`
        days=`expr $days + $daysInYear`
done

yd=`expr \( $year \* 1000 \) + $days`       # Final date in YYYYDDD format
echo $yd
}

ymdadd()    # Add/Subtract days to YYYYMMDD format
{
if [ X$2 = X ]
then
        difference=$1
        read ymd    # Read YYYYMMDD format date
else
        ymd=$1
        difference=$2
fi

echo $ymd | ymd2yd | ydadd $difference | yd2ymd # Convert YYYYMMDD to YYYYDDD, perform date arithmetic, then revert to YYYYMMDD format
}

daysLeft()  # Calculate days between two dates in YYYYMMDD format
{
# argument check
if [ X$1 = X ]
then
        read ymd1   # First date in YYYYMMDD format
        read ymd2   # Second date in YYYYMMDD format
elif [ X$2 = X ]
then
        ymd1=$1
        read ymd2
else
        ymd1=$1
        ymd2=$2
fi

year1=`expr $ymd1 / 10000`
month1=`expr \( $ymd1 % 10000 \) / 100`
day1=`expr $ymd1 % 100`

year2=`expr $ymd2 / 10000`
month2=`expr \( $ymd2 % 10000 \) / 100`
day2=`expr $ymd2 % 100`

daysm1=`monthdays $year1 $month1`
days=`expr $daysm1 - $day1`
month1=`expr $month1 + 1`

while [ `expr $month1 \<= 12` = 1 ]
do
        daysm1=`monthdays $year1 $month1`
        days=`expr $days + $daysm1`
        month1=`expr $month1 + 1`
done

x=1
while [ `expr $x \< $month2` = 1 ]
do
        daysm2=`monthdays $year2 $x`
        days=`expr $days + $daysm2`
        x=`expr $x + 1`
done

days=`expr $days + $day2`
echo $days
}

# MAIN BODY
# Connect to different Servers
declare -a SERVER=('server1' 'server2' 'server3')
remoteUser=abc
serverNumbers=${#SERVER[@]}
count=0
while [ `expr $count \< $serverNumbers` = 1 ]
do
    # Connect to  server
    ssh -T -q $remoteUser@${SERVER[count]} <<-"END_TEXT"
    VALUE=`cat /home/cognos/cognos/c8/configuration/cogstartup.xml | grep -i xsd:long | head -1 | cut -d">" -f2 | sed 's/[:/<|crn:value]*//g'`
    VALUE_BACKUP=$VALUE
    let 'VALUE -= 30'       
    let 'VALUE *= 86400'
    RESULT1=`perl -e '@stats = stat("/home/cognos/cognos/c8/configuration/signkeypair"); print ((time - $stats[9]) < "$VALUE");'`
    RESULT2=`perl -e '@stats = stat("/home/cognos/cognos/c8/configuration/encryptkeypair"); print ((time - $stats[9]) < "$VALUE");'`
    RESULT3=`perl -e '@stats = stat("/home/cognos/cognos/c8/configuration/caSerial"); print ((time - $stats[9]) < "$VALUE");'`
    while [ "$RESULT1" -o "$RESULT2" -o "$RESULT3" ]
    do
            echo "Sending mail."
            # Calculate days left
            CURRENT_DATE=`date +"%Y-%m-%d" | sed 's/-//g'`
            CREATION_DATE=`ls -logE /home/cognos/cognos/c8/configuration/ | grep -i signkeypair | awk '{print $4}' | sed 's/-//g'`
            EXPIRY_DATE=`ymdadd $CREATION_DATE $VALUE_BACKUP`
            DAYS_LEFT=`daysLeft $CURRENT_DATE $EXPIRY_DATE`
            # Identify environment from hostname - DEV/UAT/PRD
            LOCALHOST=`hostname`
            ENVIRONMENT_TYPE=`echo $LOCALHOST | perl -ne '~m/.*([a-zA-Z]{3})[0-9]*$/; print $1;'|tr '[a-z]' '[A-Z]'`
            # Identify process - FormPF/GoReporting
            if (echo $LOCALHOST | grep -i cfp >/dev/null) then
                   PROCESS="FormPF"
            else
                   PROCESS="GoReporting"
            fi
            # Add details to mail body
            echo "The key was created on `ls -log /home/cognos/cognos/c8/configuration/ | grep -i signkeypair | awk '{print $4,$5,$6}'`, and was set to expire after $VALUE_BACKUP days." > mail.txt
            echo "Key expires in $DAYS_LEFT days !!" >> mail.txt
            echo " " >> mail.txt
            echo "The server is-" >> mail.txt
            hostname >> mail.txt
            echo " " >> mail.txt
            echo "Status of folders/files-" >> mail.txt
            echo " " >> mail.txt
            ls -log /home/cognos/cognos/c8/configuration/ | grep -i signkeypair | awk '{print $4,$5,$6,$7}' >> mail.txt
            ls -log /home/cognos/cognos/c8/configuration/ | grep -i encryptkeypair | awk '{print $4,$5,$6,$7}' >> mail.txt
            ls -log /home/cognos/cognos/c8/configuration/ | grep -i caSerial | awk '{print $4,$5,$6,$7}' >> mail.txt
        echo " " >> mail.txt
        echo "To reactive key, please restart the server at weekend with below options:" >> mail.txt
        echo " " >> mail.txt
        echo "/home/cognos/etc/restartAllServers.sh -cdsk" >> mail.txt
            # Send warning mail !!
            SUBJECT="!! ($ENVIRONMENT_TYPE) $PROCESS ($LOCALHOST) Cognos CSK(Common Symmetric Key) Expiry !!"
            EMAIL="xyz@abc.com"
            cat mail.txt | mailx -s "$SUBJECT" "$EMAIL"
        rm mail.txt
            break
    done
    logout
    END_TEXT
    count=`expr $count + 1`
done
exit 0

解决方案

Move the functions inside the heredoc. It may require some changes to the code structure but it will work.

ssh app01.datacentre.private <<EOD
hostdatefunc () {
echo \$(hostname) \$(date)
}
hostdatefunc
EOD

You'll get the hostname and date on the remote server, not yours. Works. Stupid example, but proof of concept.

这篇关于使用此文档中功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆