Bash скрипт, чтобы увидеть, что пользователь существует и его статус (заблокирован или разблокирован, как passwd -S) - PullRequest
0 голосов
/ 23 апреля 2020

Я новичок здесь.

Я пишу сценарий, который я хочу видеть на нескольких машинах, если пользователь существует и его статус. Например, если я использую passwd -S.

, я начинаю писать следующий скрипт bash. Я застрял на этом этапе.

Я хочу показать статус пользователя, заблокирован или разблокирован. Я не могу закончить sh информацией о статусе пользователя.

#!/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

Может ли кто-нибудь иметь представление о том, как я могу получить такой результат:

«Пользователь root существует и статус разблокирован»

Заранее спасибо.

1 Ответ

0 голосов
/ 23 апреля 2020

Вы можете попробовать это. «Пользователь root существует, и статус разблокирован» мне не ясно.

#!/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 '%b\n' "User $user exist on $server [OK]"
    else
      printf '%b\n' "User $user does not exist on $server [FAILED]"
    fi
  else
    echo "$server is not reachable"
  fi
done {fd}< "$serverfile"

Однако программисты оболочки часто используют термин shell инъекция для случайного использования переменных оболочки через ssh

Вот альтернатива / обходной путь для этого. Использование 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 %q\n' "$user" | ssh "$user@$server" bash >/dev/null; then
      printf '%b\n' "User $user exist on $server [OK]"
    else
      printf '%b\n' "User $user does not exist on $server [FAILED]"
    fi
  else
    echo "$server is not reachable"
  fi
done {fd}< "$serverfile"
  • Используется случайное fd для while read l oop, поскольку ssh потребляет входные данные от stdin, и это будет обрабатывать только первую строку файла сервера.

  • Необходимо добавить больше кода для очистки ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...