Come ottenere il nome in codice Debian senza lsb-release


14

Sto provando a creare uno script che mi richiede di stampare il nome in codice debian in modo da poterlo inserire nel file sources.list.

Sto cercando di far funzionare questo script su qualsiasi versione di Debian, quindi avevo sperato di impostare una variabile bash del nome in codice della versione. Questo sarebbe semplice da fare (con lsb_release -c), tuttavia le nostre immagini di distribuzione non contengono lsb_release per impostazione predefinita - e con questo script richiesto per correggere il sources.list, l'installazione di lsb-release con apt-get non sarebbe un'opzione .

Ho trovato numerosi modi per ottenere il numero di rilascio e altre informazioni sul sistema, ma non riesco a trovare un posto affidabile per ottenere il nome in codice.

Qualsiasi idea sarebbe molto apprezzata!

(Il sistema operativo con cui sto testando è Debian Squeeze)


1
Se hai cercato su Google questo mentre consideravi la caduta lsb_release, controlla il suo codice sorgente e vedi se sei disposto a reinventare tutto ciò
aexl

Risposte:


20

Puoi usare /etc/os-release:

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

10

spremere non viene fornito con /etc/os-release, questo è il mio 'hack':

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

Yooo, fratello. Questo è malato! Esattamente quello di cui avevo bisogno. Qualsiasi altra cosa in Linux Mint LMDE (Debian Edition) non mostra la versione Debian su cui è stata costruita Mint. Ma la tua soluzione lo fa. Grazie!
GTodorov

5

Puoi stampare il codice insieme al numero di versione di debian:

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

O puoi scoprire il tuo nome in codice dal numero e pranthese:

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

O, più idiomaticamente:awk -F= '/VERSION=/ {gsub(/"/,""); print $2}' /etc/os-release
jasonwryan il

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

@Costas il mio output è solo nome in codice.
Golfo Persico,

3
Se desideri solo il nome in codice è molto sempliceawk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release
Costas,

4

È possibile ottenere il nome in codice della propria distribuzione Debian da /etc/os-release. Invece di tentare di analizzare questo file, è possibile crearlo in un nuovo ambiente, in modo da non influire sull'ambiente corrente ed eseguire un echocomando in quel nuovo ambiente.

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

Per scomporlo:

  • env : Esegue un comando in un nuovo ambiente.
  • -i : Non ereditare le variabili di ambiente dall'ambiente esistente.
  • bash : Esegui bash in modo da disporre di una shell per il sorgente del file os-release e per eseguire il comando echo.
  • -c: Indica bashche vogliamo eseguire un comando anziché avviare una shell interattiva.
  • . /etc/os-release: Fonte del contenuto del os-releasenostro nuovo ambiente. os-releasecontiene alcune righe che impostano le variabili di ambiente e questo imposterà tali variabili di ambiente nel nostro nuovo ambiente.
  • ; : Separare questo comando ed eseguire il comando successivo.
  • echo $VERSION_CODENAME: Rimuove il nome in codice impostato dal os-releasefile.

1
Ottima risposta, ho imparato a usare tali file da esso. L'ho usato in questo modo echo "$(. /etc/os-release && echo $VERSION_CODENAME", ma ho notato che non c'è $VERSION_CODENAMEin stretch. Notizie molto tristi.
Himura,

2
L'ho risolto in questo modo, echo "$(. /etc/os-release && echo ${VERSION_CODENAME-stretch})"che sembra ok per il mio compito, ma sembra male
Himura

1
Questo sembra l'approccio più elegante (almeno grazie all'assenza di analisi)
aexl

2

Per systemd:

hostnamectl | grep "Operating System"

produzione:

  Operating System: Debian GNU/Linux 8 (jessie)

Per me funziona.
Anthony B

Questo sicuramente non funziona su Debian Squeeze poiché Debian Squeeze non aveva un pacchetto systemd. E anche con Debian 8 Jessie (dove systemd è diventato il sistema init predefinito), hostnamectl è installato solo se systemd è installato, quindi questa soluzione non funzionerà se il sistema in questione utilizza uno degli altri sistemi 3 o 4 init offerti da Debian.
Axel Beckert,

0

Un'altra euristica è vedere da dove provengono i pacchetti per il sistema operativo attualmente in esecuzione.

Variante semplice (e probabilmente soggetta a errori):

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

Un modo più affidabile è analizzare i dettagli dall'output di apt-cache policy(senza ulteriori parametri):

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

apt-cache policyelenca tutti i repository APT in uso sul sistema locale. Filtriamo quelli che provengono da Debian, che sono etichettati solo Debian(cioè non quelli etichettati ad esempio Debian debug), quindi guardiamo solo l'archivio principale (non contribo non-free) e quindi selezioniamo il valore corrispondente.

Un approccio ancora più stabile sarebbe quello di non fare affidamento sull'ordine degli elementi e trovare il n=valore nella riga rimanente:

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

Un'altra possibilità sarebbe quella di analizzare i /var/lib/apt/lists/*Releasefile da soli invece di lasciarlo apt-cachefare:

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

La mia necessità era quella di aggiungere alcuni URL in sources.list. E per essere in grado di inserire dinamicamente il nome del codice della versione, uso questo pezzo di codice (baso sul fatto che il nome del codice è tra parentesi): ispirato dalla risposta @PersianGulf .

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


0

Espandendosi sulla risposta di @Costas , quel comando non ha funzionato per il 16.04 dove ha restituito il nome completo "Xerial Xerus", ma volevo solo "xerial" in quanto è così che il repository che stavo cercando di estrarre separava le diverse versioni. Questo comando aggiunge che verrà restituita solo la prima parola e che sarà tutta in minuscolo:

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

Questo funziona anche per "Jessie"


0

Utilizzando solo grep:

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

Provalo (output a partire dalla scrittura di questo post):

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

0

questo potrebbe (o potrebbe non essere) un approccio alternativo a ciò che bcoca ha scritto su Debian Squeeze - l'ho provato Ubuntu 18.04:

$ cat /etc/debian_version
buster/sid
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.