Shell 脚本 ssh $SERVER >> EOF
Shell Script ssh $SERVER >> EOF
我这里有一个方便的脚本,可以 return 将在 7 天后过期或已经过期的帐户。我想允许它在多个主机上 运行 而不是将脚本放在每个单独的主机上,我添加了 for loop
和 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'
以防止此处文档的主体被(本地)shell 扩展)和结束标记必须在第 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 列并且根本没有缩进。
我这里有一个方便的脚本,可以 return 将在 7 天后过期或已经过期的帐户。我想允许它在多个主机上 运行 而不是将脚本放在每个单独的主机上,我添加了 for loop
和 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'
以防止此处文档的主体被(本地)shell 扩展)和结束标记必须在第 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 列并且根本没有缩进。