web-dev-qa-db-ja.com

lsb-releaseなしでDebianコードネームを取得する方法

私はそれをsources.listファイルにエコーできるように、debianコードネームを出力する必要があるスクリプトを作成しようとしています。

私はこのスクリプトをDebianのどのバージョンでも動作させるようにしているので、リリースコードネームのbash変数を設定したいと思っていました。これは簡単です(lsb_release -cを使用)。ただし、デフォルトではデプロイメントイメージにlsb_releaseは含まれていません。sources.listを修正するためにこのスクリプトが必要なため、apt-getを使用してlsb-releaseをインストールすることはできません。 。

システムに関するリリース番号やその他の情報を取得する方法はたくさんありますが、コードネームを取得するための信頼できる場所が見つかりません。

どんなアイデアでも大歓迎です!

(私がこれをテストしているOSはDebian Squeezeです)

15
Woody

/etc/os-releaseを使用できます。

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

squeezeには/etc/os-releaseが付属していません。これが私の「ハック」です。

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

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
5
PersianGulf

Debianディストリビューションのコード名は/etc/os-releaseから取得できます。このファイルを解析する代わりに、現在の環境に影響を与えないように、新しい環境にファイルを供給し、その新しい環境でechoコマンドを実行できます。

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

分解するには:

  • env:新しい環境でコマンドを実行します。
  • -i:既存の環境から環境変数を継承しません。
  • bash:bashを実行して、os-releaseファイルを読み込むシェルがあり、echoコマンドを実行できるようにします。
  • -c:インタラクティブシェルを起動するのではなく、コマンドを実行することをbashに伝えます。
  • . /etc/os-releaseos-releaseのコンテンツを新しい環境に取り込みます。 os-releaseには、環境変数を設定する数行が含まれています。これにより、これらの環境変数が新しい環境に設定されます。
  • ;:このコマンドを区切り、次のコマンドを実行します。
  • echo $VERSION_CODENAMEos-releaseファイルで設定されたコード名をエコーアウトします。
5
Leigh McCulloch

Systemdの場合:

hostnamectl | grep "Operating System"

出力:

  Operating System: Debian GNU/Linux 8 (jessie)
2
GAD3R

もう1つのヒューリスティックは、現在実行中のOSのパッケージのソースを確認することです。

シンプルな(そしておそらくエラーが発生しやすい)バリアント:

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)の場合、(contribまたはnon-freeではなく)メインアーカイブのみを確認してから、対応する値を選択します。

さらに安定したアプローチは、要素の順序に依存せず、残りの行でn=値を見つけることです。

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

さらにもう1つの可能性は、/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
Axel Beckert

これはbcocaがDebian squeezeに書いたものへの代替アプローチかもしれません(またはそうでないかもしれません)-私はそれをUbuntu 18.04でテストしました:

$ cat /etc/debian_version
buster/sid
0
Alexander Stohr

@ Costas の回答を展開すると、そのコマンドは16.04では機能せず、完全な名前「Xerial Xerus」が返されましたが、「xerial」しか欲しなかったので、そこからプルしようとしていました異なるバージョンを分離しました。このコマンドは、最初のWordのみが返され、すべて小文字になることを追加します。

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

これは「ジェシー」でも機能します

0
Josh Reid

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
Fleshgrinder

私の必要は、sources.listにURLを追加することでした。そして、バージョンコード名を動的に配置できるように、私は次のコードを使用します(コード名が括弧内にあるという事実に依存しています): @ PersianGulfanswer

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

0
JoDev