Bash 스크립트에서 chown을 실행하면 오류가 발생합니다.

Bash 스크립트에서 chown을 실행하면 오류가 발생합니다.

bar:bar소유권이 있는 파일을 다운로드한 다음 소유권을 으로 변경하는 스크립트를 작성 중입니다 foo:server. 그래서 를 통과하기 위해 보조 스크립트( chown_test.sh) 를 작성했습니다 chown. 일단 작동하면 이를 기본 스크립트에 삽입하지만 문제가 발생합니다( 아래에 표시됨) 아마도 사용량이 부족했기 때문일 것입니다 chown.

노트:아래에 필요한 정보를 모두 담으려고 노력했지만, 더 많은 정보가 필요하시면 댓글로 알려주세요.

디렉토리 구조, 소유권 및 권한:

+ drwxrwxr-x 2 foo:server chown_test  # test directory
├─  -rwxrwxr-- 1 foo:server chown_test.sh  # side script
├─  -rwxrwxr-- 1 bar:bar    file           # empty file

관련 항목 /etc/group:

sudo:x:27:foo
bar:x:33:foo
foo:x:1000:
server:x:1003:bar,foo

코드 chown_test.sh:

#!/bin/bash

echo "User: $USER"
chown foo:server ./file

저도 시도해 보았지만 sudo chown foo:server ./filesudo 비밀번호를 묻는 메시지가 표시 bar되고 sudo 비밀번호가 없습니다.

실행 결과는 다음 chown_test.sh과 같습니다 bar.

[16:13 foo@Opus]:~/chown_test$ sudo -H -u bar bash -c ./chown_test.sh
User: bar
chown: changing ownership of ‘./file’: Operation not permitted

실행 결과는 다음 chown_test.sh과 같습니다 foo.

[16:14 foo@Opus]:~/chown_test$ ./chown_test.sh 
User: foo
chown: changing ownership of ‘./file’: Operation not permitted


누군가 내 딜레마를 설명해 줄 수 있나요?
제 질문을 읽어주셔서 감사합니다.


고쳐 쓰다:

도움을 받아Toby Speight의 답변 및 의견, 행복한 매체를 찾았습니다.

부터,"권한이 있는 프로세스(Linux: CAP_CHOWN이 기능이 있는 프로세스)만이 파일 소유자를 변경할 수 있습니다. 파일 소유자는 파일 그룹을 소유자가 속한 어떤 그룹으로든 변경할 수 있습니다.", 그런 다음 소유자가 아닌 그룹만 변경하기로 결정했습니다.

chown나는 명령을 chown_test.sh다음과 같이 변경하여 이 작업을 수행했습니다.

chown :server ./file

결과:

├─  -rwxrwxr-- 1 bar:server file

나에게는 효과가 있지만 당신에게는 그렇지 않다면 한 번 살펴보세요토비 스페이트의 답변자세한 내용은 아래를 참조하세요.

답변1

chown(2)매뉴얼 페이지 에서 :

권한이 있는 프로세스(Linux: CAP_CHOWN이 기능이 있는 프로세스)만 파일 소유자를 변경할 수 있습니다. 파일 소유자는 파일 그룹을 소유자가 속한 그룹으로 변경할 수 있습니다. 권한이 있는 프로세스(Linux: CAP_CHOWN)는 마음대로 그룹을 변경할 수 있습니다.

귀하의 프로세스에는 권한이 없으며 소유한 파일 그룹을 소유자 그룹으로 변경하지도 않습니다.

따라서 적절한 권한을 얻어야 합니다. 가장 간단한 두 가지 방법은 다음과 같습니다.

  1. 파일의 소유권을 설정하고(남용을 방지하기 위해 파일의 경로 이름을 하드코딩할 수 있다고 가정함) 최소한의 바이너리 프로그램(아마도 C로)을 작성하고 이를 루트로 설정하거나 더 나은 방법으로 CAP_CHOWN기능을 추가합니다 sudo setcap cap_chown+ep <program_name>. 프로그램은 root모든 결과와 함께 실행됩니다.

  2. /etc/sudoers비밀번호 없이 특정 명령을 실행할 수 있도록 적절한 항목을 작성하십시오 sudo. 다음과 같은 줄을 작성하십시오.

    bar ALL = (root) NOPASSWD: /bin/chown foo:server '/full/path/to/file'
    

    해당 지시문이 있는지 확인 /etc/sudoers.d하세요 . 대부분의 Linux 배포판에는 해당 지시문이 있습니다. 스크립트가 호출하는 명령이 정확히 일치하는지 확인하세요!/etc/sudoers#includedir

관련 정보