lsb-release없이 데비안 코드 명을 얻는 방법


15

데비안 코드 이름을 인쇄하여 sources.list 파일에 반영 할 수있는 스크립트를 만들려고합니다.

이 스크립트를 모든 버전의 데비안에서 작동하게 만들려고했기 때문에 릴리스 코드 이름의 bash 변수를 설정하고 싶었습니다. 이 작업은 간단하지만 (lsb_release -c 사용) 배포 이미지에 기본적으로 lsb_release가 포함되어 있지 않으며,이 스크립트가 source.list를 수정하는 데 필요하므로 apt-get으로 lsb-release를 설치하는 것은 옵션이 아닙니다. .

시스템에 대한 릴리스 번호 및 기타 정보를 얻는 방법은 많이 있지만 코드 명을 얻을 수있는 신뢰할만한 곳을 찾을 수 없습니다.

어떤 아이디어라도 대단히 감사하겠습니다!

(OS로 데비안 스퀴즈로 테스트하고 있습니다)


1
이 고려하면서 낙하를 봤 경우 lsb_release, 체크 아웃 그것의 소스 코드를 당신이 재발견 할 의향이 있는지 모든
aexl

답변:


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'-'

야, 친구 아파요! 정확히 내가 필요한 것. Linux Mint LMDE (Debian Edition)의 다른 항목에는 Mint가 구축 된 Debian 버전이 표시되지 않습니다. 그러나 귀하의 솔루션은 않습니다. 감사!
GTodorov

5

데비안의 버전 번호와 함께 코드를 인쇄 할 수 있습니다 :

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

또는 코드 이름을 숫자와 프랜차이즈에서 노출시킬 수 있습니다

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
@jasonwryan Evenawk -F"[=\"]+" '/VERSION=/ {print $2}' /etc/os-release
Costas

@ 코스타 내 출력은 코드 이름입니다.
페르시아만

3
코드 명 만 원한다면 훨씬 간단합니다awk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release
Costas

4

에서 데비안 배포판의 코드 명을 얻을 수 있습니다 /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. 매우 슬픈 소식입니다.
Himura

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

데비안 스퀴즈에는 시스템 패키지가 없으므로 데비안 스퀴즈에서는 작동하지 않습니다. 그리고 데비안 8 Jessie (systemd가 기본 초기화 시스템이 됨)에서도 hostnamectl은 systemd가 설치된 경우에만 설치되므로 문제의 시스템이 데비안이 제공하는 다른 3 개 또는 4 개 init 시스템 중 하나를 사용하는 경우이 솔루션이 작동하지 않습니다.
Axel

0

또 다른 휴리스틱은 현재 실행중인 OS의 패키지가 어디에서 제공되는지 확인하는 것입니다.

단순하고 오류가 발생하기 쉬운 변형 :

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

sources.list에 URL을 추가해야했습니다. 그리고 버전 코드 이름을 동적으로 넣을 수 있도록이 코드 조각을 사용합니다 (코드 이름이 괄호 사이에 있다는 사실에 의지합니다) : @PersianGulf answer .

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


0

@Costas 답변을 확장하면 해당 명령은 16.04에서 작동하지 않았으며 전체 이름 "Xerial Xerus"를 반환했지만 "xerial"만 원했기 때문에 다른 버전을 분리하려고 시도한 리포지토리입니다. 이 명령은 첫 번째 단어 만 반환되고 모두 소문자가된다는 것을 추가합니다.

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

이것은 "jessie"에서도 작동합니다.


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에 쓴 것에 대한 대체 접근법 일 수도 있고 아닐 수도 있습니다-우분투 18.04를 테스트했습니다.

$ cat /etc/debian_version
buster/sid
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.