Tìm id có sẵn thấp hơn 500 vis dscl


1

Làm thế nào chúng ta có thể viết một tập lệnh xung quanh dscl để lặp qua các ID hiện được liệt kê đang sử dụng và sau đó nhổ ra id đầu tiên dưới 500 chưa được sử dụng?

Cập nhật số 1 (ngày 17 tháng 2 năm 2013)

Tôi đã tìm thấy một số tập lệnh rất hữu ích trên http://wiki.awkwardtv.org/wiki/Manage_usftimeand_groups_scripts mà tôi có thể hạ thấp đến mức tôi có thể nhận được ID có sẵn đầu tiên cao hơn số lượng nhất định nhưng tôi vẫn không có một cách viết kịch bản để ngừng tìm kiếm vượt quá giới hạn trên nhất định như 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"

Cập nhật số 2 (ngày 17 tháng 2 năm 2013)

Tôi cho rằng tôi có thể làm việc ngược nhưng vẫn thế nào nếu mọi userid từ 500 đến 0 được lấy? Tôi vẫn cần đặt một mức thấp hơn để thoát khỏi tình huống ID tiêu cực lộn xộn.

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

Bạn có thấy câu trả lời của tôi khi bạn cập nhật câu hỏi không? (Tôi đã xóa nó, có thể nó không xuất hiện)
slhck

Câu trả lời:


0

Điều này có thể được thực hiện với Ruby, ví dụ, ngắn gọn hơn nhiều so với bất kỳ tập lệnh Bash nào bạn có thể tìm thấy cho việc này.

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

Chúng tôi chỉ cần trừ ID thực tế (dưới dạng một mảng) từ một mảng khác bao gồm các số từ 0 đến 500. Điều này cung cấp cho chúng tôi tất cả các ID không được sử dụng trong một mảng và từ đó chúng tôi lấy đầu tiên, vì nó đã được sắp xếp trước.


Không phải là ngôn ngữ tôi có thể sử dụng trong cơ sở hạ tầng của mình nhưng bạn đã trả lời Q :)
pulkitsinghal

Ồ, tôi không biết điều đó, xin lỗi. OS X đi kèm với Ruby, hoặc bạn không thể sử dụng nó vì một số lý do khác? Lưu ý rằng việc thực hiện theo cách tiếp cận dựa trên tập hợp thường dễ dàng hơn so với suy nghĩ về vấn đề miền cấp độ thấp, vì vậy có thể nói :)
slhck

0

Điều này sẽ làm việc để tìm thấy những gì bạn cần. Hàm find_next_useridbên dưới sẽ tìm kiếm giữa hai số, bao gồm, để tìm userid không sử dụng đầu tiên. Đối với trường hợp của bạn, chỉ cần sử dụng 0499, được hiển thị dưới đây. Hàm trả về một chuỗi trống nếu nó không thể tìm thấy bất kỳ vị trí trống nào, vì vậy bạn cần kiểm tra điều đó trước khi sử dụng echogiá trị ed (cũng được hiển thị bên dưới).

Tôi nhận ra điều này không sử dụng dscl, nhưng điều này sẽ hoạt động và dễ mang theo hơn. [Cập nhật: Đã thêm phiên bản bằng dscl.]

Về mặt kỹ thuật, tôi đang sử dụng bash, vì vậy tôi đã lưu ý rằng; Tôi không chắc sẽ làm việc trong sh hay không.

Đã thử nghiệm trên 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

Chỉnh sửa: Quên bao gồm user_exists(). Cập nhật để lưu ý rằng giải pháp này không sử dụng dscl nhưng vẫn hoạt động. Tôi nghĩ rằng tôi có thể có một giải pháp sử dụng dscl trong thời gian ngắn.

Chỉnh sửa 2: Đã thêm user_exists_dscl. Thay thế cuộc gọi user_existsbằng user_exists_dsclnếu bạn thực sự cần sử dụng dsclthay vì id.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.