lsb-release없이 데비안 코드 명을 얻는 방법 스크립트가 source.list를

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

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

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

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

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



답변

당신은 사용할 수 있습니다 /etc/os-release:

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


답변

스퀴즈는와 함께 제공되지 않습니다 /etc/os-release. 이것은 내 ‘핵’입니다.

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


답변

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

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


답변

에서 데비안 배포판의 코드 명을 얻을 수 있습니다 /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파일 에서 설정 한 코드 이름을 에코 합니다.

답변

systemd의 경우 :

hostnamectl | grep "Operating System"

산출:

  Operating System: Debian GNU/Linux 8 (jessie)


답변

또 다른 휴리스틱은 현재 실행중인 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}'


답변

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

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