GNU/Linux >> Znalost Linux >  >> Linux

Jak velké (v bitech) je Unixové UID?

Řešení 1:

Budete se muset podívat do <limits.h> (nebo jeden ze souborů, které obsahuje, např. sys/syslimits.h na OS X) pro #define z UID_MAX .

Nejnovější operační systémy (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) zvládnou až dvě miliardy (2^31-2 ), takže bych to předpokládal a vytvořil řešení pro obskurnější systémy, které to nedělají.

Řešení 2:

glibc poskytuje definice pro všechny tyto typy systémů.

Můžete zkontrolovat /usr/include/bits/typesizes.h :

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

Dále se podíváte do /usr/include/bits/types.h :

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

To vám umožní zjistit typ C. Protože potřebujete velikost v bajtech, nejlepší možností je analyzovat název definice typu podle specifikace v 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

Takže, tady je jeden řádek:

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

Zde U znamená unsigned (může to být také S pro signed ) a 32 je velikost (vyhledejte si ji ve výše uvedeném seznamu; myslím, že většinou můžete předpokládat, že je to již velikost v bajtech, ale pokud chcete, aby byl váš skript plně přenosný, může být lepší udělat case zapněte tuto hodnotu).

Řešení 3:

V tomto odkazu je položena otázka a respondent pomocí metody pokusu a omylu určí, že dotyčný systém používá podepsané dlouhé int, ponechává 31 bitů pro uložení hodnoty, s maximem 2 147 483 647.

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

Řešení 4:

To je zajímavá otázka. Byl bych překvapen, kdyby existovala standardní přenosná metoda, jak to zjistit.

Nemám po ruce linuxový box, ale id příkaz na FreeBSD 8.0 se vrátí na nulu:

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

Jsem si jistý, že se jedná o nedefinované chování, ale vsadil bych se, že většina verzí id buď zalomí na nulu pomocí 65'536 (pokud je 16bitové UID) a 4'294'967'296 nebo dojde k chybě, pokud jste překročili limit systému.


Linux
  1. Výuka Unix Sed:Jak provádět více příkazů Sed

  2. Jak bezpečně změnit UID nebo GID v Linuxu

  3. Jak zobrazit seznam otevřených portů na serveru Linux/Unix

  1. Jak velký je Pipe Buffer?

  2. Jak počítat řádky v souboru v UNIX/Linux

  3. Jak zálohovat Gitlab ve velkém měřítku?

  1. Jak upozornit na dokončení dlouhého úkolu přes Ssh?

  2. Linux – Jak zobrazit uvítací zprávu v Unixu?

  3. Jak připojit USB disk v UNIX nebo Linux