Comment obtenir le nom de code Debian sans lsb-release

15

J'essaie de créer un script qui nécessite que j'imprime le nom de code debian afin de pouvoir l'écho dans le fichier sources.list.

J'essaie de faire fonctionner ce script sur n'importe quelle version de Debian, alors j'avais espéré définir une variable bash du nom de code de la version. Ce serait simple à faire (avec lsb_release -c), mais nos images de déploiement ne contiennent pas lsb_release par défaut - et avec ce script étant requis pour corriger les sources.list, installer lsb-release avec apt-get ne serait pas une option .

J'ai trouvé de nombreuses façons d'obtenir le numéro de version et d'autres informations sur le système, mais je ne trouve pas un endroit fiable pour obtenir le nom de code.

Toutes les idées seraient grandement appréciées!

(OS avec lequel je teste ceci est Debian Squeeze)

Boisé
la source
1
Si vous googlé ce tout en considérant la chute lsb_release, consultez le code source de ce et de voir si vous êtes prêt à réinventer tout ce qui
aexl

Réponses:

20

Vous pouvez utiliser /etc/os-release:

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

Squeeze n'est pas livré avec /etc/os-release, c'est mon «hack»:

dpkg --status tzdata|grep Provides|cut -f2 -d'-'
bcoca
la source
Yooo, mon frère. C'est malade! Exactement ce dont j'avais besoin. Tout le reste dans Linux Mint LMDE (édition Debian) n'affiche pas la version Debian sur laquelle Mint a été construit. Mais votre solution le fait. Merci!
GTodorov
5

Vous pouvez imprimer le code avec le numéro de version de debian:

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

OU vous pouvez masquer votre nom de code du numéro et du pranthèse:

grep "VERSION=" /etc/os-release |awk -F= {' print $2'}|sed s/\"//g |sed s/[0-9]//g | sed s/\)$//g |sed s/\(//g
jessie
Golfe Persique
la source
Ou, plus idiomatique:awk -F= '/VERSION=/ {gsub(/"/,""); print $2}' /etc/os-release
jasonwryan
1
@jasonwryan Evenawk -F"[=\"]+" '/VERSION=/ {print $2}' /etc/os-release
Costas
@Costas ma sortie est uniquement le nom de code.
PersianGulf
3
Si vous voulez juste un nom de code, c'est très simpleawk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release
Costas
4

Vous pouvez obtenir le nom de code de votre distribution Debian à partir de /etc/os-release. Au lieu d'essayer d'analyser ce fichier, vous pouvez le source dans un nouvel environnement, afin de ne pas impacter votre environnement actuel, et exécuter une echocommande dans ce nouvel environnement.

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

Pour le décomposer:

  • env : Exécutez une commande dans un nouvel environnement.
  • -i : N'héritez pas des variables d'environnement de l'environnement existant.
  • bash : Exécutez bash afin d'avoir un shell dans lequel le fichier os-release sera source et pour exécuter la commande echo.
  • -c: Dites que bashnous voulons exécuter une commande plutôt que de démarrer un shell interactif.
  • . /etc/os-release: Source du contenu de os-releasedans notre nouvel environnement. os-releasecontient quelques lignes définissant les variables d'environnement, et cela définira ces variables d'environnement dans notre nouvel environnement.
  • ; : Séparez cette commande et exécutez la commande suivante.
  • echo $VERSION_CODENAME: Renvoie le nom de code défini par le os-releasefichier.
Leigh McCulloch
la source
1
Excellente réponse, je vous ai appris à en utiliser de tels fichiers. Je l' ai utilisé comme ça echo "$(. /etc/os-release && echo $VERSION_CODENAME"mais on a remarqué qu'il n'y a pas $VERSION_CODENAMEdans stretch. Très triste nouvelle.
Himura
2
Je l'ai réparé comme ça, ce echo "$(. /etc/os-release && echo ${VERSION_CODENAME-stretch})"qui semble correct pour ma tâche, mais ça a l'air mauvais
Himura
1
Cela ressemble à l'approche la plus élégante (au moins grâce à l'absence d'analyse)
aexl
2

Pour systemd:

hostnamectl | grep "Operating System"

production:

  Operating System: Debian GNU/Linux 8 (jessie)
GAD3R
la source
Ça marche pour moi.
AnthonyB
Cela ne fonctionne sûrement pas sur Debian Squeeze car Debian Squeeze n'avait pas de paquet systemd. Et même avec Debian 8 Jessie (où systemd est devenu le système init par défaut), hostnamectl n'est installé que si systemd est installé, donc cette solution ne fonctionnera pas si le système en question utilise l'un des 3 ou 4 autres systèmes init proposés par Debian.
Axel Beckert
0

Une autre heuristique consiste à voir d'où viennent les packages pour le système d'exploitation en cours d'exécution.

Variante simple (et probablement sujette aux erreurs):

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

Un moyen plus fiable consiste à analyser les détails de la sortie de apt-cache policy(sans autre paramètre):

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

apt-cache policyrépertorie tous les référentiels APT utilisés sur le système local. Nous filtrons ceux qui proviennent de Debian, qui sont étiquetés juste Debian(c'est-à-dire pas ceux étiquetés par exemple Debian debug), puis regardons uniquement l'archive principale (pas contribou non-free) et sélectionnons ensuite la valeur correspondante.

Une approche encore plus stable serait de ne pas se fier à l'ordre des éléments et de trouver la n=valeur dans la ligne restante:

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

Encore une autre possibilité serait d'analyser les /var/lib/apt/lists/*Releasefichiers vous-même au lieu de le apt-cachefaire:

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

Mon besoin était d'ajouter une URL dans sources.list. Et pour pouvoir mettre dynamiquement le nom du code de version, j'utilise ce morceau de code (comptez sur le fait que le nom de code est entre parenthèses): Inspiré par la réponse @PersianGulf .

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

JoDev
la source
0

En développant la réponse @Costas , cette commande n'a pas fonctionné pour 16.04 où elle a renvoyé le nom complet "Xerial Xerus" mais je voulais seulement "xerial" car c'est ainsi que le dépôt que j'essayais de séparer des différentes versions. Cette commande ajoute que seul le premier mot sera retourné et qu'il sera entièrement en minuscules:

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

Cela fonctionne aussi pour "Jessie"

Josh Reid
la source
0

En utilisant uniquement grep:

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

Essayez-le (sortie dès la rédaction de cet article):

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

celui-ci pourrait (ou non) être une approche alternative à ce que bcoca a écrit sur Debian Squeeze - je l'ai testé sur Ubuntu 18.04:

$ cat /etc/debian_version
buster/sid
Alexander Stohr
la source