Encontre ids disponíveis abaixo de 500 vis dscl

1

Como podemos escrever um script em torno de dscl para fazer um loop sobre os IDs listados atualmente em uso e, em seguida, cuspir o primeiro ID abaixo de 500 que ainda não está em uso?

Atualização 1 (17 de fevereiro de 2013)

Eu encontrei alguns scripts muito úteis no link que eu consegui molhar até o ponto em que consegui primeiro ID disponível maior do que um determinado número, mas eu ainda não tenho uma maneira de criar scripts para parar de olhar além de um certo limite superior como 500.

#!/bin/sh
continue="no"
number_used="dontknow"
fnumber=300
user_id=0
until [ $continue = "yes" ] ; do
  if [ 'dscl . -list /Users UniqueID | awk '{print $2, "\t", $1}' | sort -ug | grep -c "$fnumber"' -gt 0 ] ; then
    number_used=true
  else
    number_used=false
  fi
  if [ $number_used = "true" ] ; then
    fnumber='expr $fnumber + 1'
  else
    user_id="$fnumber"
    continue="yes"
  fi
done;
echo "Next available user_id: $user_id"

Atualização 2 (17 de fevereiro de 2013)

Suponho que eu poderia trabalhar de trás para frente, mas e se cada ID de usuário de 500 para 0 for usado? Ainda preciso definir um limite inferior para sair de uma situação de identificação negativa confusa.

#!/bin/sh
continue="no"
number_used="dontknow"
fnumber_work_backwards_from=500
fnumber=$fnumber_work_backwards_from
user_id=0
until [ $continue = "yes" ] ; do
  if [ 'dscl . -list /Users UniqueID | awk '{print $2, "\t", $1}' | sort -ug | grep -c "$fnumber"' -gt 0 ] ; then
    number_used=true
  else
    number_used=false
  fi
  if [ $number_used = "true" ] ; then
    fnumber='expr $fnumber - 1'
  else
    user_id="$fnumber"
    continue="yes"
  fi
done;
echo "First available user_id which is closest to and lower than $fnumber_work_backwards_from: $user_id"
    
por pulkitsinghal 17.02.2013 / 15:51

2 respostas

0

Isso pode ser feito com Ruby, por exemplo, que é muito mais conciso do que qualquer script Bash que você possa encontrar para isso.

dscl . -list /Users UniqueID | awk '{print $2}' | 
ruby -e 'puts ((0..500).to_a - STDIN.readlines.map(&:to_i)).first'

Simplesmente subtraímos os IDs reais (como uma matriz) de outra matriz que consiste nos números de 0 a 500. Isso nos dá todos os IDs não usados em uma matriz e, a partir disso, tomamos a primeira, pois ela já está classificada.

    
por 17.02.2013 / 16:26
0

Isso deve funcionar para encontrar o que você precisa. A função find_next_userid abaixo pesquisará entre dois números, inclusive, para localizar o primeiro ID do usuário não utilizado. Para o seu caso, use apenas 0 e 499 , mostrados abaixo. A função retorna uma string vazia se não puder encontrar nenhum slot vazio, então você precisa verificar isso antes de usar o valor echo ed (mostrado abaixo também).

Eu percebo que isso não usa dscl, mas isso deve funcionar e ser mais portátil. [Atualização: versão adicionada usando dscl.]

Tecnicamente, estou usando o bash, então observei isso; Eu não tenho certeza se trabalharia em sh ou não.

Testado no OS X 10.9.4.

#!/bin/bash
user_exists()
{
    username=$1

    if id -u $username >/dev/null 2>&1; then
        return 0
    else
        return -1
    fi
}

user_exists_dscl()
{
    username=$1

    user_found='dscl . -search /Users UniqueID $username | awk 'FNR == 2 {print $1}''
    if [ "${user_found}" != "" ] ; then
        return 0
    else
        return -1
    fi
}

find_next_userid()
{
    low=$1
    hi=$2

    for curr in 'seq $low $hi';
    do
        if ! (user_exists $curr) ; then
            echo $curr
            break
        fi
    done

    echo ""
}

FIRST_UNUSED_USERID='find_next_userid 0 499'

if [ "$FIRST_UNUSED_USERID" != "" ]; then
    echo "Do your stuff here!"
else
    echo "No unused userid found!"
fi

Editar: Esqueceu de incluir user_exists() . Atualizado para observar que essa solução não usa dscl, mas ainda funciona. Acho que posso ter uma solução usando dscl em breve.

Editar 2: adicionado user_exists_dscl . Substitua as chamadas para user_exists por user_exists_dscl se realmente precisar usar dscl em vez de id .

    
por 26.10.2014 / 03:34