主机信息
正如我们可以确定用户信息一样,程序也可以确定其运行的计算机的信息。uname命令提供了这些信息。uname同时也作为一个系统调用来在一个C程序中提供同样的信息,我们可以使用man 2 uname来查看详细的信息。
许 多情况都需要主机信息。我们也许希望依据在网络中一个程序所运行的机器的名字来自定义其行为,也就是说,是一个学生的机器还是一个管理员的机器。为了授权 的目的,我们也许希望限制一个程序只在一台机器上运行。所有这些都意味着我们需要一个方法来确定程序所运行的机器的信息。
如果系统安装了网络组件,那么我们可以非常容易的通过gethostname函数来得到其网络名:
#include <unistd.h>
int gethostname(char *name, size_t namelen);
gethostname函数将机器的网络名写入name所指的字符串中。假定这个字符串的长度至少为namelen字符长。如果成功,gethostname函数会返回0,否则会返回-1。
我们可以由uname系统调用得到关于主机的更为详细的信息:
#include <sys/utsname.h>
int uname(struct utsname *name);
uname函数将主机信息写入由name参数所指向的结构。utsname结构定义在sys/ustname.h中,大多数至少包含下列成员:
成员 描述
char sysname[] 操作系统名
char nodename[] 主机名
char release[] 系统发行级别
char version[] 系统版本号
char machine[] 硬件类型
如果成功,uname函数会返回一个非负数,否则返回-1,同时设置errno来指示错误。
试验--主机信息
下面是一个程序,hostget.c,来得到主机信息:
#include <sys/utsname.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
char computer[256];
struct utsname uts;
if(gethostname(computer, 255) != 0 || uname(&uts) < 0) {
fprintf(stderr, “Could not get host information/n”);
exit(1);
}
printf(“Computer host name is %s/n”, computer);
printf(“System is %s on %s hardware/n”, uts.sysname, uts.machine);
printf(“Nodename is %s/n”, uts.nodename);
printf(“Version is %s, %s/n”, uts.release, uts.version);
exit(0);
}
程序会产生如下的Linux特定的输出。如果我们的机器处在网络中,我们就会发现一个包含网络的扩展主机名:
$ ./hostget
Computer host name is beast
System is Linux on i686 hardware
Nodename is beast
Version is 2.4.19-4GB, #1 Wed Nov 27 00:56:40 UTC 2002
工作原理
这个程序会调用gethostname函数来得到主机的网络名。在前面的例子中,其得到的名字为tilde。更为详细的信息是由unmae函数调用得到的。注意,函数uname所返回的字符串是依赖于实现的;在这个例子中,版本号包含所编译的内核的数据。
由gethostid函数可以得到一个唯一的主机号:
#include <unistd.h>
long gethostid(void);
gethostid函数会返回一个唯一的主机号。授权管理通常使用这个函数来确保软件程序只可以运行一个具有合法授权的机器上。在Sun工作站上,他会返回一个机器在制造时在不可变内存中设置的一个数,所以,对于系统硬件,这是唯一的。
其他的系统,例如Linux,会返回一个基于机器网络地址的值,通常对于授权是足够安全的。
uname 是Linux命令
用途
显示当前操作系统名称。
语法
uname [ -a | -x | -S Name ] [ -F ] [ -f ] [ -l ] [ -L ] [ -m ] [ -M ] [ -n ] [ -p ] [ -r ] [ -s ] [ -T Name ] [ -u ] [ -v ]
描述
uname 命令将正在使用的操作系统名写到标准输出中。
机器 ID 号码包括以下数字格式的 12 个字符 xxyyyyyymmss。xx 位置指示系统且始终为 00。yyyyyy 位置包含整个系统的唯一标识号。mm 位置代表型号标识。ss 位置为子型号并且始终为 00。型号标识描述 CPU 平板标识,而不是描述整个系统的型号。
有时可使用 uname -m 命令决定使用什么型号。以下列表并非全面。参考硬件供应商提供的文档以获取 E0-FF 范围内的值。并且注意并非所有的机器类型都有机器 ID。许多新机器都共享 4C 的公共机器 ID。系统型号十六进制代码(mm)为:
机器 机器 机器
类型 型号 标识
7006 410 42
7007 N40 F0
7008 M20 43
7008 M20A 43
7009 C10 48
7011 220 41
7011 230 47
7011 250 46
7012 320 31
7012 320H 35
7012 340 37
7012 350 38 或 77
7012 355 77
7012 360 76
7012 365 76
7012 370 75
7012 375 75
7012 380 58
7012 390 57
7012 G30 A6
7012 G40 A7
7013 520 30
7013 520H 34
7013 530 10
7013 530H 18
7013 540 14 或 11
7013 550 1C
7013 550L 77
7013 560 5C
7013 570 67
7013 580 66
7013 58H 71
7013 590 70
7013 590H 72
7013 J30 A0
7013 J40 A1
7015 930 20 或 02
7015 950 2E
7015 970 63
7015 970B 63
7015 980 64
7015 980B 64
7015 990 80
7015 R10 67
7015 R20 72
7015 R24 81
7015 R30 A3
7015 R40 A4
7016 730 10
7018 740 30
7018 770 67
7024 E20 C0
7025 F30 C4
7030 3AT 58
7030 3BT 57
7043 140 4C
7043 240 4C
7248 43P 4C
当安装了新的操作系统软件级别时, uname 命令返回的机器标识符值可能改变。这一改变影响使用该值访问许可程序的应用程序。需要查看标识符,输入 uname -m 命令。
如果应用程序受到影响,联系合适的支持组织。
标志
-a 显示 -m、 -n、 -r、 -s 和 -v 标志指定的所有信息。不能与 -x 或 -SName 标志连用。如果 -x 标志和 -a 标志一起指定,-x 标志会覆盖它。
-F 显示由十六进制字符构成的系统标识字符串。此标识字符串对特定系统上的所有分区都是相同的。
-f 除分区号还用于此字符串的计算之外,与 F 标志类似。产生的标识字符串对特定系统上的每个分区都是唯一的。
-l 显示 LAN 网络号码。
-L 显示 LPAR 号码和 LPAR 名称。如果 LPAR 不存在,“-1”显示为 LPAR 号码,NULL 为 LPAR 名称
-m 显示硬件运行系统的机器 ID 号。
注:
-m 标志不能为 LPAR 环境中的分区生成唯一的机器标识。
-M 显示系统型号名称。如果型号名称属性不存在,显示空字符串
-n 显示节点名称。可能是用以标识系统且为 UUCP 通信网络所知的名称。
-p 显示系统处理器的体系结构。
-r 显示操作系统的发行版号。
-s 显示系统名。标志缺省为开。
-S Name 设置节点名。可以是系统 UUCP 通信网络名。
-T Name 设置系统名。可以是系统 UUCP 通信网络名。
-u 显示系统 ID 号码。如果这一属性未被定义,输出与 uname -m显示的输出一致。
-v 显示操作系统版本。
-x 显示 -a 标志指定的信息和 -l 标志指定的 LAN 网络号。