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)

Woody
fonte
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)
cuonglm
fonte
10

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

dpkg --status tzdata|grep Provides|cut -f2 -d'-'
bcoca
fonte
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
PersianGulf
fonte
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.
Leigh McCulloch
fonte
Ó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)
GAD3R
fonte
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}'
Axel Beckert
fonte
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

JoDev
fonte
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

Josh Reid
fonte
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
Triturador de Carne
fonte
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
Alexander Stohr
fonte