如何在不使用lsb-release的情况下获取Debian代号


15

我正在尝试创建一个脚本,该脚本要求我打印debian代号,以便可以将其回显到sources.list文件中。

我试图使该脚本在Debian的任何版本中都能工作,因此我希望设置发行代号的bash变量。这将很容易做到(使用lsb_release -c),但是默认情况下,我们的部署映像不包含lsb_release-并且需要使用此脚本来修复source.list,使用apt-get安装lsb-release将不是一种选择。 。

我发现了许多获取版本号和有关系统的其他信息的方法,但是找不到可靠的位置来获取代号。

任何想法将不胜感激!

(我正在测试的操作系统是Debian Squeeze)


1
如果您在考虑删除时使用Google进行了搜索lsb_release,请查看其源代码,看看是否愿意重新发明所有内容
aexl

Answers:


20

您可以使用/etc/os-release

(
  . /etc/os-release
  printf '%s\n' "$VERSION"
)
7 (wheezy)

10

squeeze不附带/etc/os-release,这是我的“ hack”:

dpkg --status tzdata|grep Provides|cut -f2 -d'-'

哟兄弟 这病了!正是我所需要的。Linux Mint LMDE(Debian版)中的任何其他内容都不会显示Mint所基于的Debian版本。但是您的解决方案可以。谢谢!
GTodorov

5

您可以打印代码以及debian的版本号:

root@debian:/home/mohsen# grep "VERSION=" /etc/os-release |awk -F= {' print $2'}|sed s/\"//g
8 (jessie)

或者,您也可以从数字中隐藏代码名称并进行伪装:

grep "VERSION=" /etc/os-release |awk -F= {' print $2'}|sed s/\"//g |sed s/[0-9]//g | sed s/\)$//g |sed s/\(//g
jessie

或者,更习惯地说:awk -F= '/VERSION=/ {gsub(/"/,""); print $2}' /etc/os-release
jasonwryan 2015年

1
@jasonwryan Evenawk -F"[=\"]+" '/VERSION=/ {print $2}' /etc/os-release
Costas

@Costas我的输出仅为代号。
PersianGulf

3
如果您只想使用代号,它就很简单awk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release
Costas

4

您可以从下载Debian发行版的代号/etc/os-release。您可以尝试将其来源到全新的环境中,而不用尝试解析此文件,以免影响您当前的环境,并echo在该新环境中执行命令。

env -i bash -c '. /etc/os-release; echo $VERSION_CODENAME'

分解:

  • env :在新环境中运行命令。
  • -i 注意:不要从现有环境继承环境变量。
  • bash :运行bash,以便我们有一个外壳程序可将os-release文件作为源程序并运行echo命令。
  • -c:告诉bash我们要执行命令而不是启动交互式shell。
  • . /etc/os-release:将的内容来源os-release到我们的新环境中。os-release包含几行设置环境变量的代码,这将在我们的新环境中设置这些环境变量。
  • ; :分隔此命令并运行下一个命令。
  • echo $VERSION_CODENAME:回显os-release文件设置的代码名称。

1
很好的答案,我从中了解到您可以使用此类文件。我用它这样的echo "$(. /etc/os-release && echo $VERSION_CODENAME"。但我们注意到,有没有$VERSION_CODENAMEstretch。非常可悲的消息。
喜玛拉

2
我像这样修复它,这echo "$(. /etc/os-release && echo ${VERSION_CODENAME-stretch})"对我的任务来说似乎不错,但是看起来很糟糕
Himura,

1
这看起来是最优雅的方法(至少由于没有涉及解析)
aexl

2

对于systemd:

hostnamectl | grep "Operating System"

输出:

  Operating System: Debian GNU/Linux 8 (jessie)

这个对我有用。
AnthonyB

这肯定在Debian Squeeze上不起作用,因为Debian Squeeze没有系统化的软件包。即使使用Debian 8 Jessie(其中systemd成为默认的init系统),也仅在安装了systemd的情况下才安装hostnamectl,因此,如果所涉及的系统使用Debian提供的其他3或4个init系统之一,则此解决方案将不起作用。
Axel Beckert

0

另一个试探法是查看当前正在运行的操作系统的软件包的来源。

简单(可能容易出错)的变体:

fgrep -r /debian/ /etc/apt/sources.list \
    | egrep -v '^ *#' \
    | awk '{print $3}' \
    | egrep -v '[-/]'  \
    | uniq

一种更可靠的方法是从apt-cache policy(没有其他参数)的输出中解析详细信息:

apt-cache policy \
    | fgrep o=Debian, \
    | fgrep ,l=Debian, \
    | fgrep ,c=main, \
    | awk -F '[,=]' '{print $6}'

apt-cache policy列出本地系统上正在使用的所有APT存储库。我们过滤掉那些源于Debian的,仅被标记的Debian(即不标记例如的Debian debug),然后仅查看主归档文件(而不是contribnon-free),然后选择相应的值。

甚至更稳定的方法是不依赖元素顺序并n=在剩余的行中找到值:

apt-cache policy \
    | fgrep o=Debian, \
    | fgrep ,l=Debian, \
    | fgrep ,c=main, \
    | egrep -o 'n=[^, ]*' \
    | awk -F= '{print $2}'

还有另一种可能性是自己解析/var/lib/apt/lists/*Release文件而不是apt-cache这样做:

egrep -l '^Origin: Debian$' /var/lib/apt/lists/*Release \
    | xargs egrep -l '^Label: Debian$' \
    | xargs egrep -L 'Codename: .*-' \
    | xargs fgrep Codename \
    | awk '{print $2}'

0

我需要在sources.list中添加一些URL。为了能够动态放置版本代码名称,我使用了这段代码(取决于代码名称位于括号之间的事实):受@PersianGulf answer的启发。

grep "VERSION=" /etc/os-release |awk -F= {' print tolower($2)'}|sed s/\.*\(//g | sed s/" ".*\"//g


0

扩展@Costas答案后,该命令在16.04 上无效,该命令返回全名“ Xerial Xerus”,但我只想要“ xerial”,因为这就是我试图从不同版本中提取回购的方式。此命令将添加仅返回第一个单词并将其全部小写的形式:

awk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release | awk '{print $1}' | awk '{ print tolower($0) }'

这也适用于“ jessie”


0

仅使用grep

grep -Po 'VERSION="[0-9]+ \(\K[^)]+' /etc/os-release

尝试一下(撰写本文时的输出):

$ docker run --rm debian:stable-slim grep -Po 'VERSION="[0-9]+ \(\K[^)]+' /etc/os-release
stretch

0

这可能是(也可能不是)bcoca在Debian squeeze上写的替代方法-我在Ubuntu 18.04上对其进行了测试:

$ cat /etc/debian_version
buster/sid
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.