Cách nhận tên mã Debian mà không cần phát hành lsb


13

Tôi đang cố gắng tạo một tập lệnh yêu cầu tôi in tên mã debian để tôi có thể lặp lại nó vào tệp nguồn.list.

Tôi đang cố gắng làm cho tập lệnh này hoạt động trên bất kỳ phiên bản Debian nào, vì vậy tôi đã hy vọng đặt biến bash của tên mã phát hành. Điều này sẽ đơn giản để thực hiện (với lsb_release -c), tuy nhiên hình ảnh triển khai của chúng tôi không chứa lsb_release theo mặc định - và với kịch bản này được yêu cầu sửa lỗi nguồn.list, cài đặt lsb-phát hành với apt-get sẽ không phải là một tùy chọn .

Tôi đã tìm thấy nhiều cách để có được số phát hành và thông tin khác về hệ thống, nhưng không thể tìm thấy một nơi đáng tin cậy để lấy tên mã.

Bất kì ý kiến ​​nào đều được đánh giá cao!

(Hệ điều hành tôi đang thử nghiệm này với Debian Squeeze)


1
Nếu bạn đã xử lý vấn đề này trong khi xem xét bỏ lsb_release, hãy xem mã nguồn của nó và xem bạn có sẵn sàng phát minh lại tất cả không
kể từ

Câu trả lời:


20

Bạn có thể sử dụng /etc/os-release:

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

10

bóp không giao hàng với /etc/os-release, đây là 'hack' của tôi:

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

Yoo, anh bạn. Đây là bệnh! Chính xác những gì tôi cần. Bất cứ điều gì khác trong Linux Mint LMDE (Phiên bản Debian) không hiển thị phiên bản Debian mà Mint được xây dựng. Nhưng giải pháp của bạn không. Cảm ơn!
GTodorov

4

Bạn có thể in mã cùng với số phiên bản của debian:

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

HOẶC bạn có thể để trần tên mã của bạn từ số và 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

Hoặc, thành ngữ hơn:awk -F= '/VERSION=/ {gsub(/"/,""); print $2}' /etc/os-release
jasonwryan

1
@jasonwryan Thậm chíawk -F"[=\"]+" '/VERSION=/ {print $2}' /etc/os-release
Costas

@Costas đầu ra của tôi chỉ là tên mã.
Tiếng Ba Tư

3
Nếu bạn chỉ muốn đặt tên mã thì rất đơn giảnawk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release
Costas

4

Bạn có thể lấy tên mã của bản phân phối Debian từ đó /etc/os-release. Thay vì cố gắng phân tích tệp này, bạn có thể nguồn nó vào một môi trường mới, để không ảnh hưởng đến môi trường hiện tại của bạn và thực hiện một echolệnh trong môi trường mới đó.

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

Để phá vỡ nó:

  • env : Chạy một lệnh trong một môi trường mới.
  • -i : Không kế thừa các biến môi trường từ môi trường hiện có.
  • bash : Chạy bash để chúng ta có shell để cung cấp tệp os-release và chạy lệnh echo.
  • -c: Nói bashrằng chúng tôi muốn thực thi một lệnh thay vì bắt đầu một vỏ tương tác.
  • . /etc/os-release: Nguồn nội dung os-releasevào môi trường mới của chúng tôi. os-releasechứa một vài dòng thiết lập các biến môi trường và điều này sẽ đặt các biến môi trường đó trong môi trường mới của chúng ta.
  • ; : Tách lệnh này và chạy lệnh tiếp theo.
  • echo $VERSION_CODENAME: Báo lại tên mã được đặt bởi os-releasetệp.

Câu trả lời tuyệt vời, tôi đã học được bạn sử dụng các tập tin như vậy từ nó. Tôi đã sử dụng nó như thế này echo "$(. /etc/os-release && echo $VERSION_CODENAME"nhưng nhận thấy rằng không có $VERSION_CODENAMEtrong stretch. Tin rất buồn.
Himura

1
Tôi đã sửa nó như thế này echo "$(. /etc/os-release && echo ${VERSION_CODENAME-stretch})"có vẻ ổn cho nhiệm vụ của tôi, nhưng nó có vẻ tệ
Himura

Đây có vẻ là cách tiếp cận thanh lịch nhất (ít nhất là nhờ không có phân tích cú pháp)
aexl

2

Đối với hệ thống:

hostnamectl | grep "Operating System"

đầu ra:

  Operating System: Debian GNU/Linux 8 (jessie)

Nó làm việc cho tôi.
AnthonyB

Điều này chắc chắn không hoạt động trên Debian Squeeze vì Debian Squeeze không có gói systemd. Và ngay cả với Debian 8 Jessie (nơi systemd trở thành hệ thống init mặc định), hostnamectl chỉ được cài đặt nếu systemd được cài đặt, vì vậy giải pháp này sẽ không hoạt động nếu hệ thống được đề cập sử dụng một trong 3 hoặc 4 hệ thống init khác mà Debian cung cấp.
Axel Beckert

0

Một heuristic khác là để xem các gói cho HĐH hiện đang chạy đến từ đâu.

Biến thể đơn giản (và có thể dễ bị lỗi):

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

Một cách đáng tin cậy hơn là phân tích các chi tiết ra khỏi đầu ra của apt-cache policy(không có tham số tiếp theo):

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

apt-cache policyliệt kê tất cả các kho APT được sử dụng trên hệ thống cục bộ. Chúng tôi lọc ra những người mà có nguồn gốc từ Debian, được dán nhãn chỉ Debian(tức là không phải là những ví dụ nhãn Debian debug), sau đó chỉ nhìn vào các kho lưu trữ chính (không contribhay non-free) và sau đó chọn giá trị theo.

Một cách tiếp cận thậm chí ổn định hơn sẽ là không dựa vào thứ tự phần tử và tìm n=giá trị trong dòng còn lại:

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

Tuy nhiên, một khả năng khác là tự phân tích các /var/lib/apt/lists/*Releasetệp thay vì apt-cachethực hiện điều đó:

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

Nhu cầu của tôi là thêm một số URL trong nguồn.list. Và để có thể tự động đặt tên mã phiên bản, tôi sử dụng đoạn mã này (dựa trên thực tế là tên mã nằm giữa dấu ngoặc đơn): Lấy cảm hứng từ câu trả lời @PersianGulf .

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


0

Mở rộng theo câu trả lời của @Costas , lệnh đó đã không hoạt động vào ngày 16.04 khi nó trả lại tên đầy đủ "Xerial Xerus" nhưng tôi chỉ muốn "xerial" vì đó là cách repo mà tôi đang cố gắng tách khỏi các phiên bản khác nhau. Lệnh này cho biết thêm rằng chỉ từ đầu tiên sẽ được trả về và đó sẽ là tất cả chữ thường:

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

Điều này cũng làm việc cho "jessie"


0

Chỉ sử dụng grep:

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

Hãy thử nó (đầu ra khi viết bài này):

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

0

cái này có thể (hoặc có thể không) là một cách tiếp cận thay thế cho những gì bcoca đã viết trên Debian bóp - tôi đã thử nó Ubuntu 18.04:

$ cat /etc/debian_version
buster/sid
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.