AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 3331
Accepted
jldugger
jldugger
Asked: 2009-05-03 15:11:49 +0800 CST2009-05-03 15:11:49 +0800 CST 2009-05-03 15:11:49 +0800 CST

如何找出正在运行的 Linux 版本?

  • 772

有时您的脚本需要在不同的 Linux 上表现不同。如何确定脚本在哪个版本的 Linux 上运行?

linux scripting
  • 14 14 个回答
  • 20835 Views

14 个回答

  • Voted
  1. Mihai Limbăşan
    2009-05-03T15:15:24+08:002009-05-03T15:15:24+08:00

    没有交叉分发的方式。然而:

    • Redhat 和朋友们:测试/etc/redhat-release,检查内容
    • Debian:测试/etc/debian_version,检查内容
    • Mandriva 和朋友:测试/etc/version,检查内容
    • Slackware:测试/etc/slackware-version,检查内容

    等等。一般来说,检查/etc/*-release和/etc/*-version。


    编辑:发现我的一个旧的(1 年以上)bash 脚本,多年来我必须拼凑在一起(它有一个令人印象深刻的 CVS 日志可以追溯到 6 年。)它可能不再按原样正常工作,我可以不必费心寻找已安装的发行版进行测试,但它应该为您提供一个良好的起点。它在 CentOS、Fedora 和 Gentoo 上运行良好。gyaresu在 Debian Lenny 上成功测试了它。

    #!/bin/bash
    
    get_distribution_type()
    {
        local dtype
        # Assume unknown
        dtype="unknown"
    
        # First test against Fedora / RHEL / CentOS / generic Redhat derivative
        if [ -r /etc/rc.d/init.d/functions ]; then
            source /etc/rc.d/init.d/functions
            [ zz`type -t passed 2>/dev/null` == "zzfunction" ] && dtype="redhat"
    
        # Then test against SUSE (must be after Redhat,
        # I've seen rc.status on Ubuntu I think? TODO: Recheck that)
        elif [ -r /etc/rc.status ]; then
            source /etc/rc.status
            [ zz`type -t rc_reset 2>/dev/null` == "zzfunction" ] && dtype="suse"
    
        # Then test against Debian, Ubuntu and friends
        elif [ -r /lib/lsb/init-functions ]; then
            source /lib/lsb/init-functions
            [ zz`type -t log_begin_msg 2>/dev/null` == "zzfunction" ] && dtype="debian"
    
        # Then test against Gentoo
        elif [ -r /etc/init.d/functions.sh ]; then
            source /etc/init.d/functions.sh
            [ zz`type -t ebegin 2>/dev/null` == "zzfunction" ] && dtype="gentoo"
    
        # For Slackware we currently just test if /etc/slackware-version exists
        # and isn't empty (TODO: Find a better way :)
        elif [ -s /etc/slackware-version ]; then
            dtype="slackware"
        fi
        echo $dtype
    }
    

    请注意,这可能只会在 Bash 中正常工作。您可以为其他外壳重写它。

    话虽如此,您可能想要测试功能,而不是发行版。我不再使用它只是因为它成为维护负担。依赖交叉分发工具和解决方案更容易。


    从概念上讲,它的作用是按顺序:

    • 拉入已知的“通用初始化脚本函数”类型的文件。这些是特定于发行版的。如果它不存在,请跳到下一个分发检查。
    • 检查该核心脚本中是否存在特定的、已知存在的、经常使用且不太可能重命名的函数。我们使用typeBash 内置函数来做到这一点。如果该符号是一个函数,则type -t返回。function我们zz将输出添加到 from,type -t 2>/dev/null因为如果未定义名称,则输出字符串将为空,并且我们会收到有关运算符缺少左手的语法错误==。如果我们刚刚检查的名称不是函数,则跳到下一个分布检查,否则我们找到了分布类型。
    • 最后,回显分布类型,以便函数输出可以在 case .. esac 块中轻松使用。

    编辑以防您尝试将其作为直接脚本运行:该脚本应该从其他脚本中获取或包含。如果您按原样运行它,它不会自行输出任何内容。要对其进行测试,请获取它,然后调用该函数,例如:

    source /path/to/this/script.sh
    get_distribution_type
    

    在 bash 提示符下。


    编辑:请注意,此脚本不需要 root 权限。我敦促您不要以 root 身份运行它。不应该伤害任何东西,但没有必要。


    在 CVS 日志中找到相关邮件列表帖子的链接。在解开初始化脚本意大利面条时应该很有用。

    • 38
  2. Best Answer
    womble
    2009-05-03T16:06:43+08:002009-05-03T16:06:43+08:00

    不要试图根据发行版做出关于你能做什么和不能做什么的假设,因为那样会很疯狂(另见“用户代理检测”)。相反,检测是否支持您想要执行的操作,以及您想要使用的任何命令或文​​件位置是如何完成的。

    例如,如果你想安装一个软件包,你可以通过检查 dpkg 或 rpm 的存在来检测你是在一个类 Debian 系统还是一个类 RedHat 系统上(首先检查 dpkg,因为 Debian 机器可以有它们上的 rpm 命令...)。以此为基础来决定要做什么,而不仅仅是根据它是 Debian 还是 RedHat 系统。这样,您将自动支持您没有明确编程的任何衍生发行版。哦,如果您的包需要特定的依赖项,那么也要测试这些并让用户知道他们缺少什么。

    另一个例子是摆弄网络接口。根据是否有 /etc/network/interfaces 文件或 /etc/sysconfig/network-scripts 目录确定要做什么,然后从那里开始。

    是的,这需要更多的工作,但除非你想重犯 Web 开发人员在过去十年或更长时间里犯下的所有错误,否则你会从一开始就以聪明的方式去做。

    • 27
  3. Adam Gibbins
    2009-05-03T15:14:17+08:002009-05-03T15:14:17+08:00

    你可以通过运行找到内核版本uname -a,找到发行版是依赖于发行版的。

    在 Ubuntu 和其他一些操作系统上,您可以运行lsb_release -a或阅读 /etc/lsb_release

    Debian 将版本存储在 /etc/debian_version

    • 17
  4. Mark Amerine Turner
    2009-05-03T15:24:34+08:002009-05-03T15:24:34+08:00

    大多数发行版都有一种确定特定发行版的独特方法。

    例如:

    Redhat (And derivatives): /etc/redhat-release
    
    SUSE: /etc/SUSE-release
    

    有一个标准被称为Linux Standard Base或LSB。它定义应该有一个名为 /etc/lsb-release 的文件或一个名为 lsb_release 的程序,它将回显有关您的 linux 发行版的信息。

    lsb_release -a
    
    • 6
  5. jkeogh
    2012-09-19T18:14:31+08:002012-09-19T18:14:31+08:00
    python -c 'import platform ; print platform.dist()[0]'
    

    代码: http ://hg.python.org/cpython/file/2.7/Lib/platform.py

    • 6
  6. Node
    2009-05-03T15:21:59+08:002009-05-03T15:21:59+08:00

    除了其他答案:如果您只想解析一个文件,大多数发行版通过 /etc/issue 个性化 tty 登录,例如:

    欢迎使用 SUSE Linux Enterprise Server 10 SP2 (i586) - 内核 \r (\l)。

    是的,我知道这是次优的。:)

    • 5
  7. user1804
    2009-05-05T16:52:54+08:002009-05-05T16:52:54+08:00

    facter对于这种发现来说是一个方便的工具,尽管它可能使用了上面详述的一些方法,并且需要 Ruby。

    • 4
  8. user1797
    2009-05-05T17:41:23+08:002009-05-05T17:41:23+08:00

    您需要做的就是uname -a在您最喜欢的 shell 中键入。这将打印出内核名称和版本。

    • 2
  9. prasanna
    2009-06-11T01:12:20+08:002009-06-11T01:12:20+08:00

    您还可以通过以下方式获取版本

    cat /proc/version
    

    o/p:

    Linux 版本 2.6.17-13mdv ([email protected]) (gcc 版本 4.1.2 20070302 (prerelease) (4.1.2-1mdv2007.1)) #1 SMP Fri Mar 23 19:03:31 UTC 2007

    • 2
  10. ibuys
    2009-10-25T22:42:30+08:002009-10-25T22:42:30+08:00

    我发现这cat /etc/*release*几乎总是有效的。

    • 2

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve