我是新来的。
我正在编写一个脚本,如果用户存在及其状态,我希望在多台机器上看到这个脚本。就像我使用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
的输入,并且它将只处理服务器文件的第一行。需要添加更多的代码来净化输入。