Lsb-release के बिना डेबियन कोडनेम कैसे प्राप्त करें


15

मैं एक स्क्रिप्ट बनाने की कोशिश कर रहा हूं, जिसके लिए मुझे डेबियन कोडनेम प्रिंट करने की आवश्यकता है ताकि मैं इसे source.list फ़ाइल में गूँज सकूं।

मैं इस स्क्रिप्ट को डेबियन के किसी भी संस्करण में काम करने की कोशिश कर रहा हूं, इसलिए मुझे रिलीज कोडनेम का बैश वेरिएबल सेट करने की उम्मीद थी। यह करना आसान होगा (lsb_release -c के साथ), हालाँकि हमारी परिनियोजन छवियों में डिफ़ॉल्ट रूप से lsb_release नहीं है - और इस स्क्रिप्ट के साथ स्रोतों को ठीक करने के लिए आवश्यक है। सूची, apt-get के साथ lsb-release को स्थापित करना एक विकल्प नहीं होगा। ।

मुझे सिस्टम के बारे में रिलीज़ नंबर और अन्य जानकारी प्राप्त करने के कई तरीके मिल गए हैं, लेकिन कोडनाम प्राप्त करने के लिए एक विश्वसनीय स्थान नहीं मिल सकता है।

किसी भी विचार की बहुत प्रशंसा की जाएगी!

(ओएस मैं इसे डेबियन निचोड़ के साथ परीक्षण कर रहा हूं)


1
यदि आप ड्रॉपिंग पर विचार करते समय इसे देख लेते हैं lsb_release, तो यह स्रोत कोड देखें और देखें कि क्या आप सभी को फिर से
संगठित

जवाबों:


20

आप उपयोग कर सकते हैं /etc/os-release:

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

10

निचोड़ के साथ जहाज नहीं है /etc/os-release, यह मेरी 'हैक' है:

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

यौ, भाई। यह बीमार है! बिल्कुल वही जो मुझे चाहिए था। लिनक्स मिंट एलएमडीई (डेबियन संस्करण) में कुछ भी उस डेबियन संस्करण को प्रदर्शित नहीं करता है जो मिंट पर बनाया गया था। लेकिन आपका समाधान करता है। धन्यवाद!
GTodorov

5

आप कोड को डेबियन के संस्करण संख्या के साथ प्रिंट कर सकते हैं:

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

या आप अपने नंबर का नाम नंबर और pranthese से नंगे कर सकते हैं:

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

या, अधिक मुहावरेदार:awk -F= '/VERSION=/ {gsub(/"/,""); print $2}' /etc/os-release
jasonwryan

1
@ अंजोनव्रीयन शामawk -F"[=\"]+" '/VERSION=/ {print $2}' /etc/os-release
कोस्टास

@ कोस्टास मेरा आउटपुट केवल कोडनेम है।
फ़ारसीगुल्फ़

4
यदि आप सिर्फ कोड-नाम चाहते हैं तो यह बहुत सरल हैawk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release
कोस्टास

5

आप अपने डेबियन वितरण का कोडनेम प्राप्त कर सकते हैं /etc/os-release। इस फ़ाइल को पार्स करने के प्रयास के बजाय, आप इसे एक ताज़ा वातावरण में स्रोत कर सकते हैं, ताकि अपने वर्तमान वातावरण को प्रभावित न करें, और echoउस नए वातावरण में एक कमांड निष्पादित करें ।

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

इसे तोड़ने के लिए:

  • env : एक नए वातावरण में एक कमांड चलाएँ।
  • -i : मौजूदा परिवेश से पर्यावरण चर का वारिस न करें।
  • bash : बैश चलाएं ताकि हमारे पास ओएस-रिलीज़ फ़ाइल को स्रोत में और शेल कमांड को चलाने के लिए एक शेल हो।
  • -c: बताएं bashकि हम एक इंटरैक्टिव शेल शुरू करने के बजाय एक कमांड निष्पादित करना चाहते हैं।
  • . /etc/os-release: os-releaseहमारे नए वातावरण में सामग्री की स्रोत । os-releaseइसमें पर्यावरण चर को स्थापित करने वाली कुछ पंक्तियाँ शामिल हैं, और यह हमारे नए परिवेश में उन पर्यावरण चर को सेट करेगा।
  • ; : इस कमांड को अलग करें और अगले कमांड को रन करें।
  • echo $VERSION_CODENAME: कोड नाम जो os-releaseफ़ाइल द्वारा सेट किया गया था, उसे बाहर निकालें ।

1
महान जवाब, मैंने आपको इस तरह की फ़ाइलों का उपयोग करना सीखा है। मैंने इसे इस तरह इस्तेमाल किया echo "$(. /etc/os-release && echo $VERSION_CODENAME"लेकिन ध्यान दिया कि इसमें कोई भी नहीं $VERSION_CODENAMEहै stretch। बहुत दुखद समाचार।
हिमुरा

2
मैंने इसे इस तरह तय किया echo "$(. /etc/os-release && echo ${VERSION_CODENAME-stretch})"जो मेरे काम के लिए ठीक लगता है, लेकिन यह बुरा लग रहा है
हिमुरा

1
यह सबसे सुंदर दृष्टिकोण (कम से कम शामिल नहीं करने के लिए धन्यवाद) की तरह दिखता है
एसेक्स

2

सिस्टमड के लिए:

hostnamectl | grep "Operating System"

उत्पादन:

  Operating System: Debian GNU/Linux 8 (jessie)

इससे मेरा काम बनता है।
एंथनीबी

यह निश्चित रूप से डेबियन स्क्वीज़ पर काम नहीं करता है क्योंकि डेबियन स्क्वीज़ के पास सिस्टमड पैकेज नहीं था। और यहां तक ​​कि डेबियन 8 जेसी (जहां सिस्टमड डिफॉल्ट इनिट सिस्टम बन गया) के साथ भी, होस्टनामेक्टल केवल तभी स्थापित होता है यदि सिस्टमड स्थापित किया गया है, इसलिए यह समाधान काम नहीं करेगा यदि सिस्टम विचाराधीन अन्य 3 या 4 इनिट सिस्टमों में से एक का उपयोग करता है।
एक्सल बेकर्ट

0

एक अन्य अनुमान यह देखना है कि वर्तमान में चल रहे ओएस के लिए पैकेज कहां से आते हैं।

सरल (और शायद त्रुटि-प्रवण) प्रकार:

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

एक और अधिक विश्वसनीय तरीका है कि apt-cache policy(आगे पैरामीटर के बिना) के आउटपुट से विवरण को पार्स करें :

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

apt-cache policyस्थानीय प्रणाली पर उपयोग में सभी एपीटी रिपॉजिटरी को सूचीबद्ध करता है। हम उन लोगों को फ़िल्टर करते हैं जो डेबियन से उत्पन्न होते हैं, जिन्हें केवल लेबल किया जाता है Debian(जैसे कि लेबल वाले नहीं जैसे Debian debug), फिर केवल मुख्य संग्रह (नहीं contribया non-free) को देखें और फिर उसके अनुसार मूल्य चुनें।

एक और भी अधिक स्थिर दृष्टिकोण तत्व के आदेश पर भरोसा नहीं करना और n=शेष पंक्ति में मूल्य ढूंढना होगा :

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

फिर भी एक और संभावना यह होगी कि /var/lib/apt/lists/*Releaseआप ऐसा करने की बजाय खुद फाइलों को पार्स करें 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

मेरी ज़रूरत थी कि कुछ URL को source.list में जोड़ा जाए। और गतिशील रूप से संस्करण कोड नाम डालने में सक्षम होने के लिए, मैं कोड के इस टुकड़े का उपयोग करता हूं (इस तथ्य पर भरोसा करें कि कोड नाम कोष्ठक के बीच है): @PersianGulf उत्तर से प्रेरित ।

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


0

@ कोस्टस के उत्तर पर विस्तार करते हुए , उस कमांड ने 16.04 के लिए काम नहीं किया, जहां उसने पूरा नाम "ज़ेरियल ज़ेरुस" लौटाया, लेकिन मैं केवल "ज़ेरियल" चाहता था कि कैसे रेपो मैं अलग-अलग संस्करणों से अलग होने की कोशिश कर रहा था। यह आदेश जोड़ता है कि केवल पहला शब्द वापस आ जाएगा, और यह सभी लोअरकेस होगा:

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

यह "जेसी" के लिए भी काम करता है


0

केवल उपयोग करना grep:

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

इसे आज़माएँ (इस पोस्ट को लिखने के रूप में आउटपुट):

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

0

यह एक (या नहीं हो सकता है) एक वैकल्पिक दृष्टिकोण हो सकता है जो डेबियन निचोड़ पर bcoca ने लिखा है - मैंने इसे Ubuntu 18.04 का परीक्षण किया:

$ cat /etc/debian_version
buster/sid
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.