Как получить уникальный `uid`? - PullRequest
3 голосов
/ 06 сентября 2010

Я делаю bash-скрипт, который должен создать пользователя ftp.

ftpasswd --passwd --file=/usr/local/etc/ftpd/passwd --name=$USER --uid=[xxx]
     --home=/media/part1/ftp/users/$USER --shell=/bin/false

Единственный аргумент скрипта - это имя пользователя. Но ftpasswd также требует uid. Как мне получить этот номер? Есть ли простой способ отсканировать файл passwd и получить максимальное число, увеличить его и использовать? Может быть, можно получить этот номер из системы?

Ответы [ 5 ]

5 голосов
/ 09 февраля 2012

Вместо чтения /etc/passwd вы также можете сделать это более удобным для nsswitch способом:

getent passwd

Также не забывайте, что нет никакой гарантии, что эта последовательность UID будетбыть уже отсортированы.

3 голосов
/ 06 сентября 2010

Для получения UID задано имя пользователя "myuser":

 cat /etc/passwd | grep myuser | cut -d":" -f3

Чтобы получить наибольший UID в файле passwd:

 cat /etc/passwd | cut -d":" -f3 | sort -n | tail -1
2 голосов
/ 06 сентября 2010

Чтобы получить UID пользователя:

cat /etc/passwd | grep "^$usernamevariable:" | cut -d":" -f3

Чтобы добавить нового пользователя в систему, лучше всего использовать useradd или adduser, если вам нужен детальный контроль.

Если вам действительно нужно просто найти наименьший бесплатный UID, вот скрипт, который находит наименьшее значение свободного UID больше 999 (UID 1-999 обычно зарезервированы для системных пользователей):

#!/bin/bash

# return 1 if the Uid is already used, else 0
function usedUid()
{
    if [ -z "$1" ]
    then
    return
    fi
    for i in ${lines[@]} ; do 
        if [ $i == $1 ]
        then
        return 1
    fi
    done
return 0
}

i=0

# load all the UIDs from /etc/passwd
lines=( $( cat /etc/passwd | cut -d: -f3 | sort -n ) )

testuid=999

x=1

# search for a free uid greater than 999 (default behaviour of adduser)
while [ $x -eq 1 ] ; do
    testuid=$(( $testuid + 1))
    usedUid $testuid
    x=$?
done

# print the just found free uid
echo $testuid
1 голос
/ 18 августа 2012

Я изменил cat /etc/passwd на getent passwd для ответа Джузеппе.

#!/bin/bash
# From Stack Over Flow
# /3186058/kak-poluchit-unikalnyi-uid
# return 1 if the Uid is already used, else 0
function usedUid()
{
    if [ -z "$1" ]
    then
    return
    fi
    for i in ${lines[@]} ; do
        if [ $i == $1 ]
        then
        return 1
    fi
    done
return 0
}

i=0

# load all the UIDs from /etc/passwd
lines=( $( getent passwd | cut -d: -f3 | sort -n ) )
testuid=999

x=1

# search for a free uid greater than 999 (default behaviour of adduser)
while [ $x -eq 1 ] ; do
    testuid=$(( $testuid + 1))
    usedUid $testuid
    x=$?
done

# print the just found free uid
echo $testuid
0 голосов
/ 01 сентября 2016

Это гораздо более короткий подход:

#!/bin/bash
uids=$( cat /etc/passwd | cut -d: -f3 | sort -n )
uid=999

while true; do
    if ! echo $uids | grep -F -q -w "$uid"; then
        break;
    fi

    uid=$(( $uid + 1))
done

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