如何确定正在使用的Linux发行版

27
有时我需要访问运行Linux(或其他类Unix操作系统)的一些服务器,但我不知道如何验证服务器正在使用哪个distribution (有时甚至是服务器的“责任人”都不知道)。
是否有一种简单可靠的方法来发现它,一种在所有服务器上都统一且一致的方法?

3
@Peter:有必要把“distro”改成“distribution”吗? - James Haigh
12个回答

30
cat /etc/*release

大多数发行版都会在 /etc/ 目录下放置一个发行版文件(例如 /etc/redhat-release, /etc/gentoo-release 等),其中通常包含你的发行版版本号。


  • bash: lsb_release: command not found 但是 cat 对我有用
- Brian D

29

2
lsb_release -d给了我一个更好的结果。-i给出了“发行商ID:CentOS”。-d给出了“描述:CentOS 5.2(Final)”。 - nickf

8

很不幸,这是一个比看起来更难的问题。

对于Linux系统,请使用lsb_release命令。

$ lsb_release --all
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 8.04.1
Release:        8.04
Codename:       hardy
$ lsb_release -i
Distributor ID: Ubuntu

这种方法的局限性在于lsb_release仅适用于Linux版本。

对于所有Unix系统,您也可以解析uname命令的输出。

$ uname -a
Linux blue-laptop 2.6.24-21-generic #1 SMP Tue Oct 21 23:43:45 UTC 2008 i686 GNU/Linux

您可以在uname维基百科页面找到一些关于系统和发行版的信息。

1
更具体地说,lsb_release 仅适用于试图遵循 Linux 标准基础规范 的 Linux 系统。 - tripleee

3

你应该问自己是否真的需要知道正在使用哪个发行版(也许是因为你想为这个发行版构建一个特定的软件包)。在许多其他情况下,更好的做法是只需测试并查看您需要的功能是否存在。这可能看起来像更多的工作,因为您必须逐个测试每个功能,但这样,您的软件变得更加灵活。


3
有不同的命令可用于检查正在使用哪个发行版。这里只提到其中的5个。
1. `lsb_release -a`
`lsb_release` 提供特定于发行版的信息,而 `-a` 显示有关发行版的所有信息。您还可以使用 `-d` 仅显示描述。
2. `uname -a`
`uname` 也提供系统信息,而 `-a` 显示所有信息。您可以使用 `man uname` 查看其他选项。
3. `cat /etc/*release`
您还可以使用 `cat` 命令从 `etc` 文件夹中打印出所有特定的发布信息。此命令实际上从 `/etc` 文件夹中读取 `lsb-release` 和 `os-release` 文件。
4. `cat /etc/issue`
此命令从 `/etc` 文件夹中读取 `issue` 文件。
5. `cat /proc/version`
此命令从 `/proc` 文件夹中读取 `version` 文件。`/proc` 文件夹包含有关系统进程的信息。

1

proc文件系统:Linux中包含所有硬件级别信息的目录。因此只需键入

cd /proc/

在那里,你会发现一个存储着关于系统所有任意信息的文本文件黄金矿藏。


2
因此,cat /proc/version 将返回有关版本的信息。 - Henrik
单独输入“cd /proc”没有任何有用的作用。您不必cd到目录中以读取其中的文件,并且通常不需要这样做(尽管在交互式 shell 中,它可以节省您输入长路径的时间;但是脚本通常很少需要cd)。 - tripleee
许多proc中的文件使用C字符串,因此它们并不是严格的纯文本。尝试使用“tr '\000' '\012' <file”将null替换为换行符。 - tripleee

1
我发现 /etc/issue 文件通常包含有关正在使用的发行版的信息。
但是我不知道它在所有发行版中是否都可用。

不幸的是,许多发行版都只有非常简单的 /etc/issue 文件,其中只包含类似于 "This is \n.\O (\s \m \r) \t" 的内容,这并没有提供关于发行版的实际信息。 - Evan Teran
没错,它在Ubuntu系统上运行良好。我使用的是"Ubuntu 16.04.1 LTS \n \l"版本。是的,\n和\l是字面值(不是ASCII 13和10)。 - Peter Mortensen

1
在我的.cshrc文件中,我有以下内容。
setenv DISTRO `sed -e 's/.*(//' -e 's/)).*//' /proc/version`

对于 ksh / Bash 用户,我认为它的翻译是:

export DISTRO=`sed -e 's/.*(//' -e 's/)).*//' /proc/version`

当然,这可能不适用于您最喜欢的发行版。(我曾经遇到过使用 Oracle's Unbreakable Linux类似于Redhat 的问题,但对于我的目的来说已经足够好了。)

更新于2016年8月我已经很久没有以这种方式使用Linux了(2008是很久以前的事了)。看起来现在对我现有的系统不再适用。


0

NeoFetch

...是一个非常专业的BASH脚本,应该包含您可能需要的所有信息。

(免责声明:我与此无关)

用法

neofetch --stdout | grep '^OS: ' | sed -e 's/OS:[[:space:]]\+//'

可能会返回:

Debian GNU/Linux 11 (bullseye) x86_64

但还有更多信息。

安装

选项:

  1. 系统包 neofetch

  2. 如果没有,可以参考官方安装说明进行安装。

  3. 或者使用一个 hacky 的一次性方法(如果你有信心和互联网连接),可以使用以下命令:

    wget 'https://raw.githubusercontent.com/dylanaraps/neofetch/master/neofetch' \
        && bash neofetch --stdout \
        && rm neofetch
    

0
uname -r

应该打印当前正在运行的内核版本(至少对于Linux是这样,不知道*BSD或其他操作系统是否相同)。这与发行版不同,但内核版本通常包括发行版名称,如果它被定制了,比如“2.6.27-gentoo-r1”或类似的内容。

Init在启动时通常会打印一些内容,但在运行时没有什么用处。

否则据我所知并没有普适的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接