Como obter o codinome Debian sem o lsb-release


13

Estou tentando criar um script que exija que eu imprima o nome de código debian para que eu possa fazer eco no arquivo sources.list.

Eu estou tentando fazer esse script funcionar em qualquer versão do Debian, então eu esperava definir uma variável bash do codinome de lançamento. Isso seria simples de fazer (com lsb_release -c), no entanto, nossas imagens de implantação não contêm lsb_release por padrão - e com esse script sendo necessário para corrigir o sources.list, instalar o lsb-release com o apt-get não seria uma opção .

Encontrei várias maneiras de obter o número da versão e outras informações sobre o sistema, mas não consigo encontrar um local confiável para obter o nome do código.

Todas as idéias seriam muito apreciadas!

(SO que estou testando é o Debian Squeeze)


1
Se você pesquisou isso no Google enquanto lsb_release
pensava em desistir

Respostas:


20

Você pode usar /etc/os-release:

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

10

squeeze não é fornecido com /etc/os-release, este é o meu 'hack':

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

Yooo, mano. Isso é doentio! Exatamente o que eu precisava. Qualquer outra coisa no Linux Mint LMDE (Debian Edition) não exibe a versão Debian na qual o Mint foi construído. Mas a sua solução faz. Obrigado!
GTodorov 16/08/19

4

Você pode imprimir o código junto com o número da versão do debian:

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

OU você pode descobrir o seu nome de código a partir do número e da prefixo:

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

Ou, mais awk -F= '/VERSION=/ {gsub(/"/,""); print $2}' /etc/os-release
lingüisticamente

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

@Costas minha saída é apenas codinome.
precisa saber é o seguinte

3
Se você gostaria apenas nome de código é muito simplesawk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release
Costas

4

Você pode obter o codinome da sua distribuição Debian em /etc/os-release. Em vez de tentar analisar esse arquivo, você pode originar um arquivo em um ambiente novo, para não impactar o ambiente atual e executar um echocomando nesse novo ambiente.

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

Para dividir:

  • env : Execute um comando em um novo ambiente.
  • -i : Não herde as variáveis ​​de ambiente do ambiente existente.
  • bash : Execute o bash para que tenhamos um shell para originar o arquivo os-release e executar o comando echo.
  • -c: Diga bashque queremos executar um comando em vez de iniciar um shell interativo.
  • . /etc/os-release: Origem do conteúdo os-releaseem nosso novo ambiente. os-releasecontém algumas linhas definindo variáveis ​​de ambiente, e isso definirá essas variáveis ​​de ambiente em nosso novo ambiente.
  • ; : Separe este comando e execute o próximo comando.
  • echo $VERSION_CODENAME: Reproduz o nome do código definido pelo os-releasearquivo.

Ótima resposta, eu aprendi você a usar esses arquivos. Usei-o como este echo "$(. /etc/os-release && echo $VERSION_CODENAME", mas notou que não há é $VERSION_CODENAMEno stretch. Notícias muito tristes.
Himura

1
Eu fixo-lo assim echo "$(. /etc/os-release && echo ${VERSION_CODENAME-stretch})"que parece ok para a minha tarefa, mas parece ruim
Himura

Esta parece ser a abordagem mais elegante (pelo menos, graças a nenhuma análise envolvida)
aexl 30/01

2

Para systemd:

hostnamectl | grep "Operating System"

resultado:

  Operating System: Debian GNU/Linux 8 (jessie)

Funciona para mim.
precisa saber é o seguinte

Isso certamente não funciona no Debian Squeeze, pois o Debian Squeeze não tinha um pacote systemd. E mesmo com o Debian 8 Jessie (onde systemd se tornou o sistema init padrão), o hostnamectl é instalado apenas se o systemd estiver instalado, portanto, esta solução não funcionará se o sistema em questão usar um dos outros 3 ou 4 sistemas init que o Debian oferece.
precisa

0

Outra heurística é ver de onde vêm os pacotes para o sistema operacional em execução no momento.

Variante simples (e provavelmente propensa a erros):

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

Uma maneira mais confiável é analisar os detalhes da saída de apt-cache policy(sem mais parâmetros):

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

apt-cache policylista todos os repositórios do APT em uso no sistema local. Nós filtramos aqueles que se originam do Debian, que são rotulados apenas Debian(isto é, não aqueles rotulados, por exemplo Debian debug), então apenas olhamos para o arquivo principal (não contribou non-free) e então selecionamos o valor correspondente.

Uma abordagem ainda mais estável seria não confiar na ordem dos elementos e encontrar o n=valor na linha restante:

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

Outra possibilidade seria analisar os /var/lib/apt/lists/*Releasearquivos por conta própria, em vez de permitir 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

Minha necessidade era adicionar um URL em sources.list. E para poder colocar dinamicamente o nome do código da versão, uso esse trecho de código (confie no fato de que o nome do código está entre parênteses): Inspirado na resposta @PersianGulf .

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


0

Expandindo a resposta do @Costas , esse comando não funcionou para 16.04, onde retornou o nome completo "Xerial Xerus", mas eu só queria "xerial", pois era assim que o repositório que eu estava tentando extrair separava as diferentes versões. Este comando adiciona que somente a primeira palavra será retornada e que todas serão minúsculas:

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

Isso funciona para "jessie" também


0

Apenas usando grep:

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

Experimente (saída a partir da redação deste post):

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

0

este pode (ou não) ser uma abordagem alternativa ao que a bcoca escreveu no squeeze do Debian - eu testei o Ubuntu 18.04:

$ cat /etc/debian_version
buster/sid
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.