Поиск linux пользователей с помощью bash скрипта - PullRequest
0 голосов
/ 19 марта 2020

я новичок ie в bash -скрипту и linux. Я хочу написать скрипт, чтобы получить имя пользователя из терминала и сказать, есть ли это имя пользователя в passwd или нет. Я написал и попробовал ниже сценарий, но он не работает. помогите мне, что я могу сделать.

users = cat /etc/passwd
echo User_Name
cat users | grep User_Name
if [ User_Name in users ];
then
    echo "User_Name FOUND"
else
    echo "User NOT FOUND!"
fi

как я могу определить переменную для чтения строки из termnial.

Ответы [ 5 ]

2 голосов
/ 19 марта 2020

Вот мой взгляд на этот вопрос. Использование getent для поиска пользователя в файле /etc/passwd

Если вы просто хотите проверить, существует ли пользователь.

getent passwd "$username"

Это должно напечатать имя (и всю информацию в Поле Gecos ) пользователя, если оно существует, и возвращается с нулевым статусом 0, что означает истину. В противном случае не ноль, см. Руководство для значения другого статуса.


Теперь, когда мы знаем эту информацию, мы можем использовать if-statement

if getent passwd "$username"; then
  echo "$username found."
else
  echo "$username not found." >&2
fi

Перенаправьте вывод на /dev/null, если это не желаемый результат, или если вы только после состояния выхода / возврата теста.

if getent passwd "$username" >/dev/null; then
  echo "$username found."
else
  echo "$username not found." >&2
fi

Чтобы добавить это к полному Разорванный сценарий.

#!/bin/sh

check_user() {
  printf '%s' "Enter user name: "
  read -r user_name
  case $user_name in
    '') printf '%s\n' "You have not entered anything!" >&2  ##: If empty input.
     return 1;;
  esac
  if getent passwd "$user_name" >/dev/null; then ##: getent has no -q option unfortunately.
    printf '%s\n' "$user_name FOUND"
    return 0
  else
    printf '%s\n' "$user_name NOT FOUND!" >&2
    return 1
  fi
}

##: Continue the loop until a match in `/etc/passwd` was given.
until check_user; do
  printf 'Please try again!\n' >&2  ##: Send message to stderr and loop again.
done

Вместо перенаправления на /dev/null вы можете сохранить вывод getent в переменной, используя Подстановка команд и использовать это значение плюс Расширение параметра .

check_user() {
  printf '%s' "Enter user name: "
  read -r user_name
  case $user_name in
    '') printf '%s\n' "You have not entered anything!" >&2
     return 1;;
  esac
  if user=$(getent passwd "$user_name"); then
    printf '%s\n' "${user%%:*} FOUND"  ##: Print only the username using P.E.
    return 0
  else
    printf '%s\n' "${user:-"$user_name"} NOT FOUND" >&2  ##: If the value of "$user" is empty (No match found by getent)
    return 1
  fi
}

until check_user; do
  printf 'Please try again!\n' >&2
done
2 голосов
/ 19 марта 2020

Ваш скрипт может выглядеть так:

#!/usr/bin/env bash

while read -rp "Enter user name: " user_name
do
    if [ -z "$user_name" ]
    then
        echo "Enter a non-empty username"    
        continue
    fi

    if grep -q "^$user_name:" /etc/passwd
    then
        echo "$user_name FOUND"
        exit 0
    else
        echo "$user_name NOT FOUND!" >&2
        exit 1
    fi
done
0 голосов
/ 20 марта 2020

Мы используем read для получения ввода от пользователя на терминале. В приведенном ниже решении мы используем POSIX id (присутствует на BSD, а также Linux), чтобы определить, существует ли пользователь.

#!/bin/bash
set -o errexit -o pipefail -o nounset


function interactive_check_if_user_exists {
    local username output

    read -p 'Username to check: ' -r username

    if output="$(id -u "$username" 2>&1)"
    then
        echo "Found \`$username\` (uid: $output)" >&2
    else
        local code=$?
        if [[ $code -eq 1 ]]
        then
            echo "User \`$username\` is not present on this system." >&2
        else
            echo "Unexpected error occurred: $output" >&2
            return "$code"
        fi
    fi
}

interactive_check_if_user_exists
0 голосов
/ 19 марта 2020

Чтобы напечатать и прочитать аргумент из терминала, вы должны использовать echo , затем использовать read commane и затем вызвать его со знаком доллара, и, наконец, скрипт знает, чего вы хотите. например:

echo "Enter UserName: "
read User_Name

Вот правильная форма вашего кода:

echo "Enter the Username: "
read User_Name
cut -f 1 -d: /etc/passwd | grep -q $User_Name
if [ $? -eq 0 ];
then
    echo "User $User_Name FOUND"
else
    echo "User NOT FOUND!"
fi

Советы:

cut -f 1 -d  #cut the first column of the passwd list
grep -q # find username and do  not  write  anything  to  standard   output in terminal.

if [ $? -eq 0 ] #in linux terminal when we want to know whether the previous command is executed correctly we use $? and the output must be 0. and - eq means equal to 0. and when we use that, it means if previos command (grep the username) executed correctly and the username was found, then run next step and print it found.
0 голосов
/ 19 марта 2020

Чтобы прочитать значение как пользовательский ввод, вы можете использовать команду «read».

read User_Name


echo "User is ${User_Name}"

Для удобства большинство сценариев используют ALLCAPS в именах переменных для сценариев оболочки.

Также рассмотрите возможность передачи этого значения в качестве параметра в ваш скрипт. Он может быть прочитан как «$ 1» для одного параметра.

Подсказка1: вам не нужно хранить весь файл в памяти только для этой проверки.

Подсказка2: чтобы узнать, является ли пользователь присутствующий в файле passwd, вы должны проверить только первый столбец этого файла и попытаться найти совпадение.

Подсказка 3: если вы хотите использовать команду grep, она вернет успех при обнаружении совпадения и сбой при нет совпадения.

Приведенный ниже код также будет работать для задачи

#!/bin/bash
read WHO; 
grep "^${WHO}:" /etc/passwd 2>/dev/null >/dev/null && echo "found" || echo "not found"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...