2010-09-06 8 views
2

Je crée un script bash qui devrait créer un utilisateur ftp.Comment obtenir un «uid» unique?

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

Le seul argument fourni pour le script est le nom d'utilisateur. Mais ftpasswd nécessite également uid. Comment puis-je obtenir ce numéro? Y at-il un moyen facile de numériser passwd fichier et obtenir le nombre max, incrémenter et l'utiliser? Peut-être qu'il est possible d'obtenir ce numéro du système?

+0

Je pense que vous voulez utiliser '' useradd' ou adduser'. Aussi 'getent' et' id' sont pratiques. –

Répondre

2

Pour obtenir l'UID d'un utilisateur:

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

Pour ajouter un nouvel utilisateur au système, la meilleure option est d'utiliser useradd ou adduser si vous avez besoin contrôle inefficace.

Si vous avez vraiment besoin juste pour trouver le plus petit UID libre, voici un script qui trouve la plus petite valeur UID libre supérieur à 999 (UIDs 1-999 sont généralement réservés aux utilisateurs du système):

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

Toujours éviter "cat fichier | cmd" par "cmd

+0

@ RaúlSalinas-Monteagudo Voulez-vous coller ce que la meilleure commande est, s'il vous plaît? – ffghfgh

3

Pour obtenir un UID donné un nom d'utilisateur "myuser":

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

Pour obtenir le plus grand UID dans le fichier passwd:

cat /etc/passwd | cut -d":" -f3 | sort -n | tail -1 
+0

J'aime la dernière approche; cependant, souvent/etc/passwd' aura une entrée pour UID 65534 ('nfsnobody'). Cela doit être contourné comme suit: 'grep -v ': 65534:'/etc/passwd | couper -d: -f3 | sort -n | tail -1' – sxc731

4

lieu de la lecture /etc/passwd, vous pouvez aussi le faire d'une manière plus nsswitch conviviale:

getent passwd 

aussi ne pas oublier qu'il n'y a aucune garantie que cette séquence de UIDs sera déjà trié.

1

J'ai changé le chat /etc/passwd pour obtenir le mot de passe pour la réponse de Giuseppe.

#!/bin/bash 
# From Stack Over Flow 
# http://stackoverflow.com/questions/3649760/how-to-get-unique-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

Cette approche est beaucoup plus courte:

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