Cara mendapatkan nama kode Debian tanpa lsb-release

14

Saya mencoba membuat skrip yang mengharuskan saya untuk mencetak nama kode debian sehingga saya dapat menggemakannya ke file sources.list.

Saya mencoba membuat skrip ini berfungsi di semua versi Debian, jadi saya berharap untuk mengatur variabel bash dari codename rilis. Ini akan mudah dilakukan (dengan lsb_release -c), namun gambar penerapan kami tidak mengandung lsb_release secara default - dan dengan skrip ini diperlukan untuk memperbaiki sources.list, menginstal lsb-release dengan apt-get tidak akan menjadi pilihan .

Saya telah menemukan banyak cara untuk mendapatkan nomor rilis dan info lain tentang sistem, tetapi tidak dapat menemukan tempat yang dapat diandalkan untuk mendapatkan nama kode.

Setiap ide akan sangat dihargai!

(OS Saya sedang menguji dengan ini adalah Debian Squeeze)

Woody
sumber
1
Jika Anda mencari ini di Google sambil mempertimbangkan untuk menjatuhkan lsb_release, lihat kode sumbernya dan lihat apakah Anda bersedia untuk menemukan kembali semua itu
aexl

Jawaban:

20

Anda bisa menggunakan /etc/os-release:

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

pemerasan tidak disertakan /etc/os-release, ini adalah 'retasan' saya:

dpkg --status tzdata|grep Provides|cut -f2 -d'-'
bcoca
sumber
Yooo, kawan. Ini sakit! Apa yang saya butuhkan. Hal lain di Linux Mint LMDE (Edisi Debian) tidak menampilkan versi Debian yang dibuat oleh Mint. Tapi solusi Anda bisa. Terima kasih!
GTodorov
5

Anda dapat mencetak kode bersama dengan nomor versi debian:

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

ATAU Anda dapat mencantumkan nama kode dari nomor dan bahasa pranth:

grep "VERSION=" /etc/os-release |awk -F= {' print $2'}|sed s/\"//g |sed s/[0-9]//g | sed s/\)$//g |sed s/\(//g
jessie
Teluk Persia
sumber
Atau, secara lebih idiomatis:awk -F= '/VERSION=/ {gsub(/"/,""); print $2}' /etc/os-release
jasonwryan
1
@jasonwryan Evenawk -F"[=\"]+" '/VERSION=/ {print $2}' /etc/os-release
Costas
@Costas output saya hanya nama kode.
PersianGulf
3
Jika Anda hanya ingin nama kode itu sangat sederhanaawk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release
Costas
4

Anda bisa mendapatkan kode nama distribusi Debian Anda /etc/os-release. Alih-alih mencoba mem-parsing file ini, Anda dapat sumbernya ke lingkungan yang baru, agar tidak berdampak pada lingkungan Anda saat ini, dan jalankan echoperintah di lingkungan baru itu.

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

Untuk memecahnya:

  • env : Jalankan perintah di lingkungan baru.
  • -i : Jangan mewarisi variabel lingkungan dari lingkungan yang ada.
  • bash : Jalankan bash sehingga kami memiliki shell untuk sumber file os-release ke, dan untuk menjalankan perintah gema.
  • -c: Katakan bashkami ingin menjalankan perintah daripada memulai shell interaktif.
  • . /etc/os-release: Sumber konten os-releaseke lingkungan baru kami. os-releaseberisi beberapa baris pengaturan variabel lingkungan, dan ini akan mengatur variabel lingkungan tersebut di lingkungan baru kami.
  • ; : Pisahkan perintah ini dan jalankan perintah berikutnya.
  • echo $VERSION_CODENAME: Keluarkan nama kode yang ditentukan oleh os-releasefile.
Leigh McCulloch
sumber
1
Jawaban yang bagus, saya belajar Anda menggunakan file seperti itu dari itu. Aku menggunakannya seperti ini echo "$(. /etc/os-release && echo $VERSION_CODENAME"tapi melihat bahwa tidak ada $VERSION_CODENAMEdi stretch. Berita yang sangat menyedihkan.
Himura
2
Saya memperbaikinya seperti ini echo "$(. /etc/os-release && echo ${VERSION_CODENAME-stretch})"yang sepertinya tidak apa-apa untuk tugas saya, tetapi terlihat buruk
Himura
1
Ini terlihat seperti pendekatan yang paling elegan (setidaknya karena tidak ada penguraian)
aexl
2

Untuk systemd:

hostnamectl | grep "Operating System"

keluaran:

  Operating System: Debian GNU/Linux 8 (jessie)
GAD3R
sumber
Ini bekerja untuk saya.
AnthonyB
Ini pasti tidak berfungsi pada Debian Squeeze karena Debian Squeeze tidak memiliki paket systemd. Dan bahkan dengan Debian 8 Jessie (di mana systemd menjadi sistem init default), hostnamectl hanya diinstal jika systemd diinstal, jadi solusi ini tidak akan berfungsi jika sistem tersebut menggunakan salah satu dari 3 atau 4 sistem init lain yang ditawarkan Debian.
Axel Beckert
0

Heuristik lain adalah melihat dari mana paket-paket untuk OS yang saat ini berjalan berasal.

Varian sederhana (dan mungkin rawan kesalahan):

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

Cara yang lebih andal adalah mem-parsing detail dari output apt-cache policy(tanpa parameter lebih lanjut):

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

apt-cache policymendaftar semua repositori APT yang digunakan pada sistem lokal. Kami memfilter yang berasal dari Debian, yang hanya diberi label Debian(mis. Bukan yang berlabel mis. Debian debug), Kemudian hanya melihat arsip utama (bukan contribatau non-free) dan kemudian memilih nilai yang sesuai.

Pendekatan yang bahkan lebih stabil adalah dengan tidak bergantung pada urutan elemen dan menemukan n=nilai di baris yang tersisa:

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

Namun kemungkinan lain adalah mengurai /var/lib/apt/lists/*Releasefile sendiri daripada membiarkannya 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
sumber
0

Kebutuhan saya adalah menambahkan beberapa URL di sources.list. Dan untuk dapat secara dinamis memasukkan nama kode versi, saya menggunakan potongan kode ini (bergantung pada fakta bahwa nama kode berada di antara tanda kurung): Terinspirasi oleh jawaban @PersianGulf .

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

JoDev
sumber
0

Memperluas jawaban @Costas , perintah itu tidak bekerja untuk 16,04 di mana ia mengembalikan nama lengkap "Xerial Xerus" tetapi saya hanya ingin "xerial" karena itulah cara repo yang saya coba tarik dari memisahkan versi yang berbeda. Perintah ini menambahkan bahwa hanya kata pertama yang akan dikembalikan, dan semuanya akan menjadi huruf kecil:

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

Ini bekerja untuk "jessie" juga

Josh Reid
sumber
0

Hanya menggunakan grep:

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

Cobalah (output pada saat menulis posting ini):

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

yang ini mungkin (atau mungkin tidak) menjadi pendekatan alternatif untuk apa yang ditulis bcoca di Debian squeeze - saya mengujinya Ubuntu 18.04:

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