GNU/Linux >> Belajar Linux >  >> Linux

Seberapa besar (dalam bit) UID Unix?

Solusi 1:

Anda harus melihat <limits.h> (atau salah satu file yang disertakan, mis., sys/syslimits.h pada OS X) untuk #define dari UID_MAX .

Sistem operasi terbaru (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) dapat menangani hingga dua miliar (2^31-2 ), jadi saya akan berasumsi itu dan membuat solusi untuk sistem yang lebih tidak jelas yang tidak.

Solusi 2:

glibc memberikan definisi untuk semua tipe sistem tersebut.

Anda dapat memeriksa /usr/include/bits/typesizes.h :

% grep UID_T /usr/include/bits/typesizes.h
#define __UID_T_TYPE            __U32_TYPE

Selanjutnya Anda melihat /usr/include/bits/types.h :

% grep '#define __U32_TYPE' /usr/include/bits/types.h
#define __U32_TYPE              unsigned int

Ini memungkinkan Anda mengetahui tipe C. Karena Anda memerlukan ukuran dalam byte, pilihan terbaik Anda adalah mem-parsing nama typedef sesuai dengan spesifikasi di types.h :

We define __S<SIZE>_TYPE and __U<SIZE>_TYPE for the signed and unsigned
variants of each of the following integer types on this machine.

 16      -- "natural" 16-bit type (always short)
 32      -- "natural" 32-bit type (always int)
 64      -- "natural" 64-bit type (long or long long)
 LONG32      -- 32-bit type, traditionally long
 QUAD        -- 64-bit type, always long long
 WORD        -- natural type of __WORDSIZE bits (int or long)
 LONGWORD    -- type of __WORDSIZE bits, traditionally long

Jadi, ini satu kalimat:

% grep '#define __UID_T_TYPE' /usr/include/bits/typesizes.h | cut -f 3 | sed -r 's/__([US])([^_]*)_.*/\1 \2/'
U 32

Di sini U berarti unsigned (bisa juga S untuk signed ) dan 32 adalah ukurannya (lihat di daftar di atas; saya pikir, sebagian besar waktu Anda dapat berasumsi bahwa itu sudah berukuran dalam byte, tetapi jika Anda ingin skrip Anda sepenuhnya portabel, mungkin lebih baik melakukannya case aktifkan nilai ini).

Solusi 3:

Di tautan ini pertanyaan diajukan dan responden menggunakan metode coba-coba untuk menentukan sistem yang dimaksud menggunakan long int yang ditandatangani, menyisakan 31 bit untuk menyimpan nilai, dengan maksimal 2.147.483.647.

# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:

Solusi 4:

Itu pertanyaan yang menarik. Saya akan terkejut jika ada metode standar dan portabel untuk menentukan ini.

Saya tidak memiliki kotak Linux, tetapi id perintah pada FreeBSD 8.0 membungkus kembali ke nol:

# id 4294967296
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)

Saya yakin ini adalah perilaku yang tidak ditentukan, tetapi saya berani bertaruh bahwa sebagian besar versi id akan membungkus menjadi nol dengan 65'536 (jika UID 16-bit) dan 4'294'967'296 atau kesalahan jika Anda melampaui batas sistem.


Linux
  1. Cara Memasang Drive Disk USB di UNIX atau Linux

  2. UNIX / Linux :Cara menghapus pengguna setara root (Pengguna Non-Root dengan UID 0)

  3. UNIX / Linux :Cara mengunci atau menonaktifkan akun pengguna

  1. Seberapa Besar Buffer Pipa?

  2. Cara kerja SSH Tanpa Kata Sandi di Linux / UNIX

  3. Cara mendapatkan nama pengguna dari uid

  1. Bagaimana Cara Memperingatkan Penyelesaian Tugas Panjang Melalui Ssh?

  2. Linux – Bagaimana Menampilkan Pesan Selamat Datang Di Unix??

  3. Tutorial Unix Sed:Cara Mengeksekusi Beberapa Perintah Sed