Bash脚本,查看用户是否存在及其状态(像passwd-S一样锁定或解锁)



我是新来的。

我正在编写一个脚本,如果用户存在及其状态,我希望在多台机器上看到这个脚本。就像我使用passwd-S一样。

我开始编写下面的bash脚本。我被卡住了。

我想显示用户的状态,锁定或解锁。我无法完成用户的状态信息

#!/bin/bash
if [ $# -lt 2 ]; then
echo "usage: $0 <username> <serverfile>"
exit 1
fi
USER=$1
SERVERFILE=$2

for SERVER in `cat ${SERVERFILE}`
do
if [ -n "`ping -c1 ${SERVER} 2> /dev/null | grep icmp_seq`" ]; then
ISUSER=`ssh -i /home/centos/key.pem user@${SERVER} getent passwd ${USER}`
if [ $? -eq 0 ];
then
echo -e "User ${USER} exist on ${SERVER} [OK]"
else
echo  -e "User ${USER} does not exist on ${SERVER} [FAILED]"
fi
else
echo "${SERVER} is not reachable"
fi
done

有人能想到我如何才能得到这样的结果吗:

"用户根存在且状态已解锁">

提前谢谢。

你可以试试这个。"用户根存在,状态已解锁">我不清楚。

#!/usr/bin/env bash
user=$1
serverfile=$2
while read -ru "$fd" server; do
if ping -c1 $server > /dev/null 2>&1; then
if isuser=$(ssh "$user@$server" "getent passwd $user"); then
printf '%bn' "User $user exist on $server [OK]"
else
printf '%bn' "User $user does not exist on $server [FAILED]"
fi
else
echo "$server is not reachable"
fi
done {fd}< "$serverfile"

然而,shell程序员经常引用术语shell注入来通过ssh随机使用shell变量

这是一个替代方案。使用printf '%q'

#!/usr/bin/env bash
user=$1
serverfile=$2
while read -ru "$fd" server; do
if ping -c1 "$server" > /dev/null 2>&1; then
if printf 'getent passwd %qn' "$user" | ssh "$user@$server" bash >/dev/null; then
printf '%bn' "User $user exist on $server [OK]"
else
printf '%bn' "User $user does not exist on $server [FAILED]"
fi
else
echo "$server is not reachable"
fi
done {fd}< "$serverfile"
  • 它对while read循环使用随机fd,因为ssh接受来自stdin的输入,并且它将只处理服务器文件的第一行。

  • 需要添加更多的代码来净化输入。

最新更新