Я хочу создать скрипт, чтобы проверить, существует ли пользователь. Я использую логику ниже:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
Таким образом, если пользователь существует, то у нас есть успех, иначе пользователь не существует. Я поставил выше команду в скрипте bash, как показано ниже:
#!/bin/bash
getent passwd $1 > /dev/null 2&>1
if [ $? -eq 0 ]; then
echo "yes the user exists"
else
echo "No, the user does not exist"
fi
Теперь мой сценарий всегда говорит, что пользователь существует независимо от того, что:
# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
Почему вышеуказанное условие всегда оценивается как ИСТИНА и говорит, что пользователь существует?
Куда я иду не так?
ОБНОВИТЬ:
Прочитав все ответы, я обнаружил проблему в своем сценарии. Проблема была в том, как я перенаправлял getent
вывод. Таким образом, я удалил все вещи перенаправления и сделал getent
строку такой:
getent passwd $user > /dev/null
Теперь мой скрипт работает нормально.
$?
вы получите код возвратаtest
команды. Смотрите ответ ниже.getent
и вашимif
оператором? Это может привести$?
к проверке состояния выходаecho
, а не вашего вызоваgetent
.2>&1
вместо2&>1
.$1
он не установлен, оператор if вернет true. Из моего тестирования, решение было бы обернуть$1
в двойных кавычках:getent passwd "$1" > /dev/null 2&>1
.Ответы:
Вы также можете проверить пользователя по
id
команде.id -u name
дает вам идентификатор этого пользователя. если пользователь не существует, вы получаете команду, возвращающую значение ($?
)1
источник
validuser(){ [[ -n $(id -u "$1" 2>/dev/null) ]] && echo 1 || echo 0; }
. Это в значительной степени возвращает 1, если пользователь существует, или 0, если его нет.Почему бы вам просто не использовать
Он вернет 1 (поскольку у пользователя есть макс. 1 запись), если пользователь существует, и 0, если его нет.
источник
getent passwd | grep -c '^username:'
:
после имени пользователя защищает от сопоставления подстроки путем сопоставления с разделителем полей, поэтому описанный вами эффект не произойдет.Нет необходимости явно проверять код выхода. Пытаться
Если это не сработает, значит, что-то не так с вами
getent
, или у вас определено больше пользователей, чем вы думаете.источник
Это то, что я сделал в
Freeswitch
сценарии запуска bash:источник
Я предлагаю использовать команду id, так как она проверяет правильность существования пользователя в отношении записи файла passwd, которая не обязательна, означает то же самое:
Примечание: 0 - это root uid.
источник
Я использовал это таким образом:
источник
Безусловно самое простое решение:
>/dev/null 2>&1
Может быть сокращен до&>/dev/null
в Bash.источник
Скрипт, чтобы проверить, существует ли пользователь Linux или нет
Скрипт Чтобы проверить, существует ли пользователь или нет
источник
cat
?grep $USER_NAME /etc/passwd >/dev/null 2>&1
Поздний ответ, но
finger
также показывает больше информации о пользователеисточник
На самом деле я не могу воспроизвести проблему. Сценарий, как написано в вопросе, работает нормально, за исключением случая, когда $ 1 пусто.
Однако в скрипте есть проблема, связанная с перенаправлением
stderr
. Хотя эти две формы&>
и>&
существуют, в вашем случае вы хотите использовать>&
. Вы уже перенаправленыstdout
, поэтому форма&>
не работает. Вы можете легко проверить это следующим образом:Вы увидите файл с именем
1
в текущем каталоге. Вы хотите использовать2>&1
вместо этого, или используйте это:Это также перенаправляет
stdout
иstderr
к/dev/null
.Предупреждение Перенаправление
stderr
на/dev/null
не может быть такой хорошей идеей. Когда что-то пойдет не так, вы не поймете, почему.источник
информация о пользователе хранится в / etc / passwd, поэтому вы можете использовать "grep 'usename' / etc / passwd", чтобы проверить, существует ли имя пользователя. тем временем вы можете использовать команду оболочки «id», она напечатает идентификатор пользователя и идентификатор группы, если пользователя не существует, она напечатает сообщение «нет такого пользователя».
источник
Авторизуйтесь на сервере. grep "username" / etc / passwd Это покажет детали пользователя, если они есть.
источник
if grep -q "^username:" /etc/passwd; then ...
Используя sed:
источник
В зависимости от реализации вашей оболочки (например, Busybox или взрослый)
[
оператор может запустить процесс, изменив$?
.Пытаться
источник
$?
дает мне тот же результат. Это версия Bash:GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
if test "$RES" == "0"; then ...
$?
будет расширен до[
запуска, так что это не проблема.if getent passwd $1 > /dev/null 2&>1; then echo "yes the user exists" else echo "No, the user does not exist" fi
Ниже приведен скрипт для проверки распространения ОС и создания пользователя, если он не существует, и ничего не делать, если пользователь существует.
источник
Создать системного пользователя,
some_user
если он не существуетисточник
Мне нравится это хорошее решение в одну строку
и в сценарии:
использовать:
источник