리눅스에서`fakeroot` 명령이 필요한 이유 패키지는 다음과 같은 것을 가능하게합니다

왜 우리에게 fakeroot명령이 필요한가? 단순히 sudo또는 su명령을 사용할 수 없습니까 ?

매뉴얼 페이지는 말합니다 :

fakeroot- 파일 조작을 위한 루트 권한을 가진 환경에서 명령을 실행합니다

About.com의 말 :

가짜 루트 환경을 제공합니다. 이 패키지는 다음과 같은 것을 가능하게합니다 : dpkg-buildpackage -rfakeroot즉, 패키지 빌드를 위해 루트가 될 필요가 없습니다. 이것은 설정하면됩니다 LD_PRELOADlibfakeroot.so래퍼를 제공하는, getuid, chown, chmod, mknod, stat, …,하여 가짜 루트 환경을 조성. 이 중 하나라도 이해하지 못하면 필요하지 않습니다 fakeroot!

내 질문은, 어떤 특별한 목적이 간단 su하거나 sudo그렇지 않은 것을 해결 합니까? 예를 들어, 우분투에서 설치된 모든 패키지를 다시 포장하기 위해 다음 명령을 제공합니다.

$ fakeroot -u dpkg-repack `dpkg --get-selections | grep install | cut -f1`

위와 같은 명령을 fakeroot 대신 sudo 또는 su로 수행 할 수 있습니까?

$ sudo dpkg-repack `dpkg --get-selections | grep install | cut -f1`

편집하다:

달리는:

$ sudo dpkg-repack `dpkg --get-selections | grep install | cut -f1`

이 오류가 발생합니다.

제어 디렉토리에 잘못된 권한 700이 있습니다 (> = 0755 및 <= 0775 여야 함)

이유가 무엇입니까?



답변

원격 서버에서 작업하는 개발자 / 패키지 관리자 등을 상상해보십시오. 그 일을하려고하지만 당신은 패키지의 내용을 업데이트하고 재 구축, 다운로드 kernel.org에서 커널을 사용자 정의하고 구축하려는 등, 당신은 몇 가지 단계가해야하는 것을 알게 될 root권리 ( UIDGID0) 다른 이유로 (보안, 간과 된 권한 등). 그러나 root원격 컴퓨터에서 작업하고 있기 때문에 권한 을 얻을 수 없습니다 (다른 많은 사용자와 같은 문제가 발생 함). 이것이 정확히하는 것입니다 fakeroot: 그것들은 그것들을 요구하는 환경에 효과 UID적이고 GID0을 가장 합니다.

실제로 당신은 진짜 결코 root(반대의 권한을 su하고 sudo당신이 언급).


답변

fakeroot와 실제 sudo / su의 차이점을 명확하게 보려면 다음을 수행하십시오.

$ fakeroot
# echo "Wow I have root access" > root.tst
# ls -l root.tst
-rw-rw-r-- 1 root root   23 Oct 25 12:13 root.tst
# ls -l /root
ls: cannot open directory /root: Permission denied
# exit
$ ls -l root.tst
-rw-rw-r-- 1 ubuntu ubuntu 23 Oct 25 12:13 root.tst

가짜 루트 셸 내에있는 한 루트 권한이 필요한 경우 실제로 루트 권한이 필요한 작업을 수행하지 않는 한 루트 모양입니다. 그리고 이것은 포장 기계가 모든 기계에 적합한 포장을 만들기 위해 정확히 필요한 것입니다.

사실, 패키징에 fakeroot를 사용할 때 달성하고자하는 것은 fakeroot에서 실행되는 도구를 만들어 루트가 소유 한 파일을 보는 것입니다. 더 이상 아무것도 없습니다. 실제로 su 또는 sudo는 올바른 파일 소유권을 얻는 데 작동하지 않습니다.


답변

대답은 이해하기 어려우며 이해하기 위해 약간의 생각 이 필요 했기 때문에 ( 이 의견 으로 이해하게되었습니다) 희망적으로 더 나은 설명 을 드리겠습니다 .

1. fakeroot에서 일어나는 일

자신의 사용자에게 일어나는 일 외에는 아무것도 없습니다. 더 이상 아무것도 없습니다. 만약 당신이 fakeroot(당신이 호출 될 때 당신과 같은 새로운 쉘을 제공 sudo한다면), 당신이 허가를 필요로하는 것을하고, 종료하는 것은 절대 아무 일도 일어나지 않을 것입니다.

당신이 그것에 대해 생각하면, 그것은 총 시간 낭비입니다. 실제로 일어나지 않는 일을 왜 하시겠습니까? 미쳤다. 당신은 단순히 그것을 할 수 없었으며 아무런 흔적도 없었기 때문에 아무런 차이가 없었을 것입니다.

잠깐만 …

2. 가짜 뿌리의 흔적

의 흔적이 남아 있을 있습니다 fakeroot. MortenSickel의 답변 에서 꽤 훌륭하고 공감할만한 명령을 살펴 보겠습니다 .

$ fakeroot
# echo "Wow I have root access" > root.tst
# ls -l root.tst
-rw-rw-r-- 1 root root   23 Oct 25 12:13 root.tst
# ls -l /root
ls: cannot open directory /root: Permission denied
# exit
$ ls -l root.tst
-rw-rw-r-- 1 ubuntu ubuntu 23 Oct 25 12:13 root.tst

언뜻보기에 사용하는 fakeroot것이 총 시간 낭비 인 것처럼 보입니다 . 결국,를 사용하지 않았다면 fakeroot같은 것을 얻게 될 것입니다.

여기서 미묘한 것은 다음과 같습니다.

$ cat root.tst
Wow I have root access

이는 파일의 내용이 여전히 루트 인 것을 기억한다는 것을 의미합니다. 사용하지 않으면 fakeroot같은 결과가 나왔다고 말할 수 있습니다 . 맞습니다.이 예는 너무 간단합니다.

다른 예를 보자.

$ fakeroot
# touch x
# touch y
# chown myuser:myuser x
# ls -l > listing
# exit
$ ls -l
total 4
-rw-rw-r-- 1 myuser myuser 152 Jan  7 21:39 listing
-rw-rw-r-- 1 myuser myuser   0 Jan  7 21:39 x
-rw-rw-r-- 1 myuser myuser   0 Jan  7 21:39 y
$ cat listing
total 0
-rw-rw-r-- 1 root   root   0 Jan  7 21:39 listing
-rw-rw-r-- 1 myuser myuser 0 Jan  7 21:39 x
-rw-rw-r-- 1 root   root   0 Jan  7 21:39 y

무슨 일이 있었는지 보자. 나는 척 root완전히 효과가있는, 그리고 창조 xy. 나는 척 x에 속하는 myusery에 속하는 root. 그것들은 실제로 myuser(우리가 결국 볼 수 있듯이)에 속하지만, 나는 단지 그런 식으로 했습니다.

그런 다음 목록을 작성하고 상상력을 파일로 저장했습니다. 나중에 파일을 다시 보면 파일 소유자가 누구인지 상상할 수 있습니다. 다시, 그들은 내가 상상했던 사람들에 의해 실제로 소유되지 않고, 나는 단지 그것을 상상했습니다.

3. 그래서 … 왜 다시 원하니?

당신은 내가 그 목록을 만들기 위해 루트가되는 가짜를 할 필요가 없다고 말할 수 있습니다. 간단히 목록을 만든 다음 상상력을 반영하도록 목록을 편집 할 수있었습니다. 당신은 당신이 필요로하지 않았다 맞아 fakeroot그것에 대해. 실제로, 그것이 fakeroot실제로 아무것도하지 않는다는 것을 알면, 이전 에는 없었던 능력을 얻을 수 없었을 것입니다.

그러나 이것은 fakeroot목록의 편집 이 쉽지 않을 수 있습니다. 시스템에 설치할 수있는 패키지와 함께 tared, gziped, xzed, bzip2ed 또는 파일을 함께 유지하고 권한 및 소유자를 기억하는 다른 형식이 있습니다. 압축 파일을 쉽게 수정하고 파일의 소유권을 편집 할 수 있습니까? 나는 당신에 대해 모른다. 그러나 나는 방법을 생각할 수 없다.

모든 것이 압축되면 압축 된 파일을 수정하고 소유권 및 권한을 프로그래밍 방식으로 편집하는 도구가 구축 될 수 있습니까? 그렇습니다. 따라서 압축하기 전에 소유권을 위조하거나 나중에 변경할 수 있습니다. 데비안 사람들은 전자가 더 쉽다고 결정했습니다.

4. 왜 그냥 사용하지 sudo않습니까?

우선, 소프트웨어를 빌드하기 위해 루트 권한이 필요하지 않으며 소프트웨어를 압축하기 위해 루트 권한이 필요하지 않습니다. 따라서 필요하지 않은 경우 해당 권한을 얻는 것을 생각하기 위해서는 실제로 Windows 사용자 여야합니다. 그러나 빈정 거림은 루트 비밀번호가 없을 수도 있습니다.

또한 루트 권한이 있다고 가정 해 봅시다. 그리고 파일에 루트에 대한 읽기 권한 만 있어야한다고 가정 해 봅시다. 따라서 sudo실제로 파일 소유자와 권한을로 변경하면 root루트 셸에서 벗어나 모든 것을 패키지하려고합니다. 루트 액세스 권한이 없어서 더 이상 파일을 읽을 수 없으므로 실패합니다. 따라서 sudo패키지를 루트로 압축하고 압축 해야 합니다. 효과적으로 모든 것을 루트로해야합니다.

이것은 나쁜 TM 입니다.

패키저로서 루트 권한이 필요하지 않으며 권한을 가져서는 안됩니다. 패키지를 설치할 때 일부 파일 ( A)을 루트 로 설치해야 할 수 있으며 여기에서 루트 권한이 필요합니다. 모든 fakeroot것이 이것을 가능하게하는 것입니다. A패키지 관리자는 아카이버에 대해 루트 소유의 것으로 패키지를 나열 할 수 있으므로 사용자가 패키지 압축을 풀 때 아카이버는 루트 권한을 요구하고 루트 A소유의 것으로 작성 합니다.


답변

AFAIK, fakeroot는 파일 조작에 대한 루트 권한이있는 환경에서 명령을 실행합니다. 이는 사용자가 루트 권한 / 소유권을 가진 파일을 사용하여 아카이브 (tar, ar, .deb 등)를 만들 수 있도록하는 데 유용합니다. fakeroot가 없으면 올바른 권한과 소유권을 가진 아카이브의 구성 파일을 생성 한 다음 압축을 풀거나 아카이버를 사용하지 않고 아카이브를 직접 구성해야하는 루트 권한이 있어야합니다.

fakeroot는 파일 조작 라이브러리 함수 (chmod (), stat () 등)를 사용자가 실제로 루트 인 경우 실제 라이브러리 함수에 미칠 영향을 시뮬레이션하는 함수로 대체하여 작동합니다.

시놉시스 :

 fakeroot [-l|--lib library] [--faked faked-binary] [--] [command]

여기서 더 확인하십시오 : fakeroot


답변

패키지 작성 스크립트에 사용했습니다. 스크립트를 실행하는 사람이 루트 수준 액세스 권한을 가지고 있는지 확실하지 않았지만 스크립트는 여전히 루트에 속하는 파일을 포함하는 tar 파일을 생성해야했습니다. 가장 간단한 방법은 fakeroot에서 패키지 빌드 스크립트를 실행하는 것입니다.이 파일은 아카이버가 파일이 루트에 속하고 아카이브 내부에있는 것처럼 압축하도록 믿었습니다. 이렇게하면 패키지가 대상 컴퓨터 (다른 컴퓨터)에 모두 압축 해제 될 때 파일이 이상하거나 존재하지 않는 사용자에 속하지 않습니다.

생각해 본 결과, 임베디드 시스템의 루트 파일, tar.gz 아카이브, rpm 패키지, .deb 패키지 등 일종의 아카이브를 구축하기위한 것입니다.


답변

한 가지 일반적인 사용법은 실패한 바이너리가 실제로 액세스하려는 파일을 찾는 것입니다. 즉, 하드 코딩 된 경로와 부적절한 예외 처리로 인한 버그를 찾아 수정하거나 해결합니다.


답변

실제로 루트 권한이없는 상태에서 fakeroot를 사용할 수 있습니다. 당신이 가지고있는 경우 su및 / 또는 sudo당신은 간단한 사용하여 시스템을 파괴 할 수있을 것입니다 rm -rf /,하지만 fakeroot 사용하여 대부분에서 당신은 당신의 홈 디렉토리를 제거합니다.