微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – Shell脚本ssh $SERVER >> EOF

我有一个方便的脚本,可以返回将在7天后过期或已过期的帐户.我想允许它在多个主机上运行而不将脚本放在每个主机上,我添加了for循环和ssh $SERVER>> EOF部分,但它只是运行命令关闭运行脚本的系统.

我相信错误是ssh $SERVER>> EOF但我不确定语法看起来是否正确.

#!/bin/bash

for SERVER in `cat /lists/testlist`
do
  echo $SERVER

  ssh $SERVER >> EOF
    sudo cat /etc/shadow | cut -d: -f1,8 | sed /:$/d > /tmp/expirelist.txt
    totalaccounts=`sudo cat /tmp/expirelist.txt | wc -l`
    for((i=1; i<=$totalaccounts; i++ ))
    do
      tuserval=`sudo head -n $i /tmp/expirelist.txt | tail -n 1`
      username=`sudo echo $tuserval | cut -f1 -d:`
      userexp=`sudo echo $tuserval | cut -f2 -d:`
      userexpireinseconds=$(( $userexp * 86400 ))
      todaystime=`date +"%s"`
      if [[ $userexpireinseconds -ge $todaystime ]] ;
      then
        timeto7days=$(( $todaystime + 604800 ))
        if [[ $userexpireinseconds -le $timeto7days ]];
        then
          echo $username "is going to expire in 7 Days"
        fi
      else
        echo $username "account has expired"
      fi
    done
    sudo rm /tmp/expirelist.txt
  EOF
done

解决方法:

这里的文件由<< EOF(或者,更好地,<<'EOF'以防止此处文档的主体被(本地)壳扩展)并且结束标记必须在列1中. 您正在做的是运行ssh并将标准输出附加到文件EOF(>>是输出重定向;<<是输入重定向).它然后(本地)运行sudo等.它可能无法执行本地文件EOF(不可执行,希望),并且可能也找不到任何其他命令. 我认为你所追求的是这个(我现在用$(…)表示法替换了脚本中的反向标记,并略微优化了服务器列表生成以用于Bash):

#!/bin/bash

for SERVER in $(</lists/testlist)
do
  echo $SERVER

  ssh $SERVER << 'EOF'
    sudo cat /etc/shadow | cut -d: -f1,8 | sed '/:$/d' > /tmp/expirelist.txt
    totalaccounts=$(sudo cat /tmp/expirelist.txt | wc -l)
    for ((i=1; i<=$totalaccounts; i++))
    do
      tuserval=$(sudo head -n $i /tmp/expirelist.txt | tail -n 1)
      username=$(sudo echo $tuserval | cut -f1 -d:)
      userexp=$(sudo echo $tuserval | cut -f2 -d:)
      userexpireinseconds=$(( $userexp * 86400 ))
      todaystime=$(date +"%s")
      if [[ $userexpireinseconds -ge $todaystime ]]
      then
        timeto7days=$(( $todaystime + 604800 ))
        if [[ $userexpireinseconds -le $timeto7days ]]
        then
          echo $username "is going to expire in 7 Days"
        fi
      else
        echo $username "account has expired"
      fi
    done
    sudo rm /tmp/expirelist.txt
EOF
done

非常接近,但差异真的很重要!特别要注意,结束标记EOF在第1列中并且根本没有缩进.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐