วิธีรับชื่อเดเบียนที่ไม่มี lsb-release


15

ฉันกำลังพยายามสร้างสคริปต์ที่ต้องการให้ฉันพิมพ์ชื่อรหัสของเดเบียนเพื่อที่ฉันจะได้สะท้อนไปยังไฟล์ source.list

ฉันพยายามทำให้สคริปต์นี้ทำงานกับ Debian ทุกรุ่นดังนั้นฉันหวังว่าจะตั้งค่าตัวแปร bash ของชื่อรหัสการเผยแพร่ นี่จะเป็นเรื่องง่ายที่จะทำ (ด้วย lsb_release -c) อย่างไรก็ตามอิมเมจการปรับใช้ของเราไม่ได้มี lsb_release ตามค่าเริ่มต้น - และสคริปต์นี้จำเป็นต้องแก้ไขแหล่งที่มาการติดตั้ง lsb-release ด้วย apt-get จะไม่เป็นตัวเลือก .

ฉันพบวิธีมากมายในการรับหมายเลขรุ่นและข้อมูลอื่น ๆ เกี่ยวกับระบบ แต่ไม่สามารถหาสถานที่ที่เชื่อถือได้เพื่อรับชื่อรหัส

ความคิดใด ๆ ที่จะได้รับการชื่นชมอย่างมาก!

(ระบบปฏิบัติการฉันกำลังทดสอบนี้ด้วยคือ Debian Squeeze)


1
หากคุณ googled นี้ลดลงขณะที่การพิจารณาlsb_releaseตรวจสอบรหัสที่มาของมันและดูว่าคุณยินดีที่จะบูรณาการทั้งหมดที่
aexl

คำตอบ:



10

squeeze ไม่ได้มาด้วย/etc/os-releaseนี่คือ 'แฮ็ค' ของฉัน:

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

Yooo พี่ชาย นี่มันป่วย! สิ่งที่ฉันต้องการ สิ่งอื่นใดใน Linux Mint LMDE (รุ่นเดเบียน) ไม่แสดงรุ่น Debian ที่ Mint สร้างขึ้น แต่ทางออกของคุณทำ ขอบคุณ!
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

หรือมากกว่า idiomatically:awk -F= '/VERSION=/ {gsub(/"/,""); print $2}' /etc/os-release
jasonwryan

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

@Costas เอาท์พุทของฉันเป็นชื่อรหัสเท่านั้น
PersianGulf

4
หากคุณต้องการเพียงแค่ชื่อรหัสมันง่ายมากawk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release
Costas

5

คุณจะได้รับสมญานามของการกระจาย Debian /etc/os-releaseของคุณจาก แทนที่จะพยายามแยกวิเคราะห์ไฟล์นี้คุณสามารถระบุแหล่งที่มาลงในสภาพแวดล้อมใหม่เพื่อไม่ให้ส่งผลกระทบต่อสภาพแวดล้อมปัจจุบันของคุณและดำเนินการechoคำสั่งในสภาพแวดล้อมใหม่

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

วิธีทำลายมัน:

  • env : เรียกใช้คำสั่งในสภาพแวดล้อมใหม่
  • -i : อย่าสืบทอดตัวแปรสภาพแวดล้อมจากสภาพแวดล้อมที่มีอยู่
  • bash : รัน bash เพื่อให้เรามีเชลล์เพื่อส่งไฟล์ os-release ไปให้และเรียกใช้คำสั่ง echo
  • -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
ดูเหมือนว่าวิธีการที่หรูหราที่สุด (อย่างน้อยก็ต้องขอบคุณการแยกวิเคราะห์)
aexl

2

สำหรับ systemd:

hostnamectl | grep "Operating System"

เอาท์พุท:

  Operating System: Debian GNU/Linux 8 (jessie)

มันใช้งานได้สำหรับฉัน
AnthonyB

สิ่งนี้ไม่สามารถใช้กับ Debian Squeeze ได้เนื่องจาก Debian Squeeze ไม่มีแพ็กเกจ systemd และถึงแม้จะใช้ Debian 8 Jessie (โดยที่ systemd กลายเป็นระบบเริ่มต้นเป็นค่าเริ่มต้น) hostnamectl จะถูกติดตั้งก็ต่อเมื่อมีการติดตั้ง systemd ดังนั้นโซลูชันนี้จะไม่ทำงานหากระบบที่เป็นปัญหาใช้หนึ่งในระบบ Debian 3 หรือ 4 ระบบ
Axel Beckert

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แสดงรายการที่เก็บ APT ทั้งหมดที่ใช้งานบนระบบโลคัล เรากรองสิ่งที่มาจาก Debian ซึ่งมีป้ายกำกับเพียง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 ในรายการต้นทาง และเพื่อให้สามารถที่จะใส่แบบไดนามิกรุ่นชื่อรหัสผมใช้ชิ้นส่วนของรหัสนี้ (พึ่งพาความจริงที่ว่าชื่อรหัสอยู่ระหว่างวงเล็บ): แรงบันดาลใจจาก@PersianGulf คำตอบ

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


0

การขยายคำตอบที่@Costasคำสั่งนั้นไม่ได้ผลสำหรับ 16.04 โดยที่มันส่งคืนชื่อเต็ม "Xerial Xerus" แต่ฉันต้องการเพียงแค่ "xerial" เพราะนั่นเป็นวิธีที่ repo ที่ฉันพยายามดึงออกมาจากเวอร์ชันที่ต่างกัน คำสั่งนี้เสริมว่าเฉพาะคำแรกที่จะถูกส่งกลับและมันจะเป็นตัวพิมพ์เล็กทั้งหมด:

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 บน Debian squeeze - ฉันทดสอบ Ubuntu 18.04:

$ cat /etc/debian_version
buster/sid
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.