리눅스에서`fakeroot` 명령이 필요한 이유


92

왜 우리에게 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 여야 함)

이유가 무엇입니까?


6
보안상의 이유로 실행할 수 sudo있거나 su머신이기 때문에 일반 사용자로 수행 할 수있는 모든 것을 루트로 사용하지 않는 것이 좋습니다 . fakeroot1) 그것은 실제로 루트 사용자라고 믿는 프로그램을 속이는 것입니다. 실제로 잘못 작성된 독점 소프트웨어는 필요하지 않더라도 필요할 수 있습니다 (일반적으로 Windows 개발자는 Linux를갔습니다) 및 2) 파일 모드 및 소유권 변경을 모방 할 수 있습니다. ' 그렇지 않으면 tar소프트웨어를 패키징 할 때 유용한 올바른 권한과 소유권을 가진 파일 을 만들 수 있습니다.
pqnet

1
나는 About.com 발췌 부분의 메모가 요약한다고 생각합니다. 이 중 하나라도 이해하지 못하면 필요하지 않습니다 fakeroot! fakeroot유용한 상황을 생각할 수 없다면 말 그대로 필요하지 않습니다. 그러나 실제로는 사용 사례를 완전히 이해해야합니다.
Christopher Schultz

답변:


68

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

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


그래서 fakeroot시스템 설정을 변경 하는 데 사용할 수 없습니다 ?? cuz 우리가 실행할 명령은 그것이 루트로 실행되고 있다고 생각하고 우리가 원하는 것을 수행합니다. 그렇지 않습니까?
mrid

3
@mrid "실제로는 실제 루트 권한을 얻지 못합니다". 그래서
대답

52

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는 올바른 파일 소유권을 얻는 데 작동하지 않습니다.


위조 위험하지 않습니까? suid 비트와 rx perm을 사용하여 파일을 만들면 루트가 소유 한 파일을 루트로 소유하고 누구나 실행할 수 있습니다! 아니면 suid 비트를 설정해도 작동하지 않습니까?
Frizlab

7
좋지 않다. 나는 이것을 직접 시도했다. fakeroot의 주된 이유는 소유권 root : root를 실제로 루트가 아닌 빌드 된 패키지로 가져 오는 것입니다. 그러나 설치된 패키지에는 적절한 권한이 있습니다.
hanetzer December

2
@ ntzrmtthihu777의 의견을 읽을 때까지 매우 혼란 스러웠습니다!
Shahbaz

설명을 이해하지 못합니다. 근본이 아니더라도 불만을 갖지 않도록 도구를 패치하지 않겠습니까? 관련 질문 : 결국, 가짜 루트 에서 생성 한 파일은 실제로 루트 소유 하지 않습니다 . 이것이 그런 .deb파일을 설치할 때 모든 /usr파일이 누구라고 불리는 사람이 소유하고 있음을 의미하지 fakeroot않습니까?
Johannes Schaub-litb

@ JohannesSchaub-litb, 아니 요점입니다. 파일은 루트가 소유하지 않지만 fakeroot셸 내부에서는 파일 처럼 보입니다 . 이 셸 내에 .deb 패키지가 만들어지면 파일 소유자가 파일 시스템에서 읽고 ( fakeroot가로 채서 반환 root) 패키지에 저장됩니다. 패키지를 설치할 때 패키지는 루트가 파일을 소유해야하므로 패키지에 루트 액세스 권한이 필요합니다.
Shahbaz

45

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

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소유의 것으로 작성 합니다.


5
훌륭한 글쓰기로 분명합니다.
Christian Long

1
So either you could fake the ownerships before compressing, or change them after. Debian people decided the former is easier.이것은 '왜 나중에 수정하지 않겠습니까?'
aaaaaa

1
덕분에,이 모르 텐의 대답 @ 읽은 후 내가 가진 혼란을 지 웁니다
요하네스 SCHAUB - litb

33

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

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

시놉시스 :

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

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


@MaskTheSmokin : fakeroot는 파일 조작 작업에 대해서만 슈퍼 유저 권한을 제공합니다.
gkt

@ gkt.pro : 맞습니다.

10
그것은 실제로 수퍼 유저 권한을 부여하지 않으며, 단지 가짜 일뿐입니다.-실행중인 프로그램은 루트 권한을 가지고 있다고 생각하지만 실제로는 여전히 사용자의 일반 권한을 사용합니다.
Paŭlo Ebermann

2
the program running in it thinks it has root privileges프로그램과 루트 권한 의 차이점은 어디에 있습니까 ? 내가 rm -rf /프로그램과 프로그램을 수행 할 수 있다면 루트 권한이 있다고 생각합니다.
사용자 알 수 없음

10
@userunknown 당신 rm은 충분한 권한을 가지고 있다는 것을 체크하지 않을 수도 있지만 커널 자체로는 그렇게 할 수 없다. unlink시스템 호출은 실패합니다. 권한을 처리하는 것은 응용 프로그램 단독의 문제가 아니며 권한을 확인하지 않고 원하는 작업을 수행하는 자체 응용 프로그램을 작성할 수 있습니다.
Michael Mrozek

11

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

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


1
fakeroot버그가있는 패키징 소프트웨어를위한 임시 해결책입니다 : 그러한 패키지를 만들기 위해 루트가되어야 할 이유는 없지만, 사전에 파일 시스템에 직접 설정하는 것 외에 다른 방법으로 파일 권한을 지정할 수 없기 때문에 선택
pqnet

3

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


1

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


2
그 필요성을 설명하지는 않습니다 fakeroot. 홈 디렉토리를 직접 제거 할 수 있습니다.
JMCF125

1

간단한 답변 :

su 및 sudo는 루트로 명령을 실행합니다. fakeroot는 부분적인 샌드 박스 배열이 아닙니다.

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