Cómo obtener el nombre en código de Debian sin lsb-release

14

Estoy tratando de crear una secuencia de comandos que requiera que imprima el nombre en código de Debian para poder repetirlo en el archivo sources.list.

Estoy tratando de hacer que este script funcione en cualquier versión de Debian, por lo que esperaba establecer una variable bash del nombre en código de la versión. Esto sería simple de hacer (con lsb_release -c), sin embargo, nuestras imágenes de implementación no contienen lsb_release de forma predeterminada, y con este script requerido para arreglar sources.list, instalar lsb-release con apt-get no sería una opción .

He encontrado numerosas formas de obtener el número de versión y otra información sobre el sistema, pero no puedo encontrar un lugar confiable para obtener el nombre en clave.

Cualquier idea sería muy apreciada!

(El sistema operativo con el que estoy probando esto es Debian Squeeze)

Leñoso
fuente
1
Si buscó en Google esto mientras considera la posibilidad de dejarlo lsb_release, consulte su código fuente y vea si está dispuesto a reinventar todo eso
ejemplo, el

Respuestas:

20

Puedes usar /etc/os-release:

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

squeeze no se envía con /etc/os-release, este es mi 'hack':

dpkg --status tzdata|grep Provides|cut -f2 -d'-'
bcoca
fuente
Yooo, hermano. ¡Esto está mal! Exactamente lo que necesitaba. Cualquier otra cosa en Linux Mint LMDE (Edición Debian) no muestra la versión Debian en la que se construyó Mint. Pero tu solución sí. ¡Gracias!
GTodorov
5

Puede imprimir el código junto con el número de versión de debian:

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

O puede desnudar su nombre en clave del número y psensar:

grep "VERSION=" /etc/os-release |awk -F= {' print $2'}|sed s/\"//g |sed s/[0-9]//g | sed s/\)$//g |sed s/\(//g
jessie
Golfo pérsico
fuente
O, más idiomáticamente:awk -F= '/VERSION=/ {gsub(/"/,""); print $2}' /etc/os-release
jasonwryan
1
@jasonwryan Evenawk -F"[=\"]+" '/VERSION=/ {print $2}' /etc/os-release
Costas
@Costas mi salida es solo nombre en clave.
PersianGulf
3
Si desea simplemente el nombre en clave, es mucho más simpleawk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release
Costas el
4

Puede obtener el nombre en clave de su distribución de Debian /etc/os-release. En lugar de intentar analizar este archivo, puede obtenerlo en un entorno nuevo, para no afectar su entorno actual, y ejecutar un echocomando en ese nuevo entorno.

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

Para desglosarlo:

  • env : Ejecuta un comando en un nuevo entorno.
  • -i : No herede las variables de entorno del entorno existente.
  • bash : Ejecute bash para que tengamos un shell para obtener el archivo os-release y para ejecutar el comando echo.
  • -c: Indique bashque queremos ejecutar un comando en lugar de iniciar un shell interactivo.
  • . /etc/os-release: Fuente de los contenidos de os-releasenuestro nuevo entorno. os-releasecontiene algunas líneas que establecen variables de entorno, y esto establecerá esas variables de entorno en nuestro nuevo entorno.
  • ; : Separe este comando y ejecute el siguiente comando.
  • echo $VERSION_CODENAME: Echo el nombre de código establecido por el os-releasearchivo.
Leigh McCulloch
fuente
1
Gran respuesta, aprendí a usar esos archivos. Lo usé así, echo "$(. /etc/os-release && echo $VERSION_CODENAME"pero noté que no hay nada $VERSION_CODENAMEadentro stretch. Muy triste noticia.
Himura
2
Lo arreglé así, lo echo "$(. /etc/os-release && echo ${VERSION_CODENAME-stretch})"que parece estar bien para mi tarea, pero se ve mal
Himura
1
Este parece ser el enfoque más elegante (al menos gracias a que no hay análisis involucrado)
aexl
2

Para systemd:

hostnamectl | grep "Operating System"

salida:

  Operating System: Debian GNU/Linux 8 (jessie)
GAD3R
fuente
Esto funciona para mi.
AnthonyB
Esto seguramente no funciona en Debian Squeeze ya que Debian Squeeze no tenía un paquete systemd. E incluso con Debian 8 Jessie (donde systemd se convirtió en el sistema init predeterminado), hostnamectl solo se instala si systemd está instalado, por lo que esta solución no funcionará si el sistema en cuestión usa uno de los otros 3 o 4 sistemas init que ofrece Debian.
Axel Beckert el
0

Otra heurística es ver de dónde provienen los paquetes para el sistema operativo actualmente en ejecución.

Variante simple (y probablemente propensa a errores):

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

Una forma más confiable es analizar los detalles de la salida de apt-cache policy(sin más parámetros):

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

apt-cache policyenumera todos los repositorios APT en uso en el sistema local. Filtramos los que se originan en Debian, que están etiquetados solo Debian(es decir, no aquellos etiquetados, por ejemplo Debian debug), luego solo miramos el archivo principal (no contribo non-free) y luego seleccionamos el valor correspondiente.

Un enfoque aún más estable sería no confiar en el orden de los elementos y encontrar el n=valor en la línea restante:

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

Otra posibilidad sería analizar los /var/lib/apt/lists/*Releasearchivos usted mismo en lugar de dejar apt-cacheque haga eso:

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
fuente
0

Mi necesidad era agregar alguna URL en sources.list. Y para poder poner dinámicamente el nombre del código de la versión, utilizo este código (confío en el hecho de que el nombre del código está entre paréntesis): inspirado por la respuesta @PersianGulf .

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

JoDev
fuente
0

Ampliando la respuesta de @Costas , ese comando no funcionó para 16.04 donde devolvió el nombre completo "Xerial Xerus", pero solo quería "xerial", ya que así es como el repositorio que estaba tratando de extraer separó las diferentes versiones. Este comando agrega que solo se devolverá la primera palabra y que será todo en minúsculas:

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

Esto también funciona para "Jessie"

Josh Reid
fuente
0

Solo usando grep:

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

Pruébalo (salida al escribir esta publicación):

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

este podría (o no) ser un enfoque alternativo a lo que bcoca escribió en Debian squeeze: lo probé Ubuntu 18.04:

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