내 사용자 이름을 루트 대신 생성된 파일의 소유자로 설정하도록 sudo에 지시하는 방법이 있습니까?

내 사용자 이름을 루트 대신 생성된 파일의 소유자로 설정하도록 sudo에 지시하는 방법이 있습니까?

sudo cp /etc/foo.txt ~/foo.txt그렇게 하면 새 파일이 소유자로 생성됩니다.root

이제 ls마지막 두 명령을 사용하는 것 외에는 이 문제를 해결할 수 있는 방법이 없습니다(사용 사례를 명확히 하기 위해).

belmin@server1$ ls /etc/foo.txt
>  -rw------- 1 root root 3848 Mar  6 20:35 /etc/foo.txt
>
belmin@server1$ sudo cp /etc/foo.txt ~/foo.txt
belmin@server1$ sudo chown belmin: $_

내가 선호하는:

  1. 하나의 명령으로 수행하십시오 sudo.
  2. 현재 사용자를 지정할 필요 없이(아마도 변수를 사용하고 있을까요?)

답변1

install대신 사용하십시오 cp:

sudo install -o belmin /etc/foo.txt ~/foo.txt

답변2

POSIX 호환cp당신은 sudo cp -p foo bar할 수다음 파일 메타데이터를 보존하십시오.복사할 때:

  • 면접 시간
  • 시간 변경
  • 사용자 ID
  • 그룹 번호
  • 모델

설정하고 싶다면다른사용자Jenny D의 솔루션그게 제일이야.

답변3

이렇게 하면:

sudo cat /etc/foo.txt > ~/foo.txt

그런 다음 쉘에 의해 다음과 같이 ~/foo.txt열립니다 .(귀하의 자격 증명으로 생성됨) sudo그러면 표준 출력이 해당 위치로 리디렉션됩니다.

결국 파일은 귀하의 것이 될 것입니다.

이 접근 방식은 제한 사항에도 도움이 됩니다 root. 여기서는 root해당 권한으로만 열리며 /etc/foo.txt잠재적으로 유해한 작업은 수행하지 않습니다( ~/foo.txt예를 들어 심볼릭 링크인 경우 쓰기 위해 파일을 열면 바람직하지 않은 결과가 발생할 수 있음).

답변4

Sudo는 로그인한 사용자(실제로 Sudo를 실행 중인 사용자)를 찾는 데 사용할 수 있는 환경 변수 "SUDO_USER"를 생성합니다.

루트로 sudo를 사용한다고 가정하면(다른 사용자에게도 sudo를 사용할 수 있음) 다음 두 단계를 자동화하는 스크립트를 작성할 수 있습니다.

cp source target
chown $SUDO_USER target

(루트 사용자만이 파일을 유출할 수 있으므로 루트가 아닌 사용자로 sudo를 사용하는 경우에는 작동하지 않습니다.)

자동화하려면 약간의 작업이 필요합니다. 소스가 단일 파일이고 대상이 디렉터리가 아닌 경우 작업이 완료된 것입니다. 이 문제는 실제로는 다음과 같이 더 복잡한 상황에서만 문제가 되기 때문에 이 질문을 하신다고 가정합니다.

cp /path/source/some*files /path/target/directory/

어떤 파일과 디렉터리가 전달되었는지, 어떤 파일과 디렉터리가 기존에 있었는지, 어떤 파일이 실제로 덮어썼는지 확인하고, 성공적으로 복사된 파일의 소유권만 변경하는 복잡한 스크립트입니다.

작업이 완료되었습니다. - sudo를 사용 cpio하여 루트로 이동하고 cpio를 사용하여 파일을 복사할 수 있습니다. cpio에는 복사할 파일 목록이 필요하므로 이는 2단계 프로세스입니다. 아래에서는 이를 사용하여 ls복사할 파일 목록을 생성합니다.

ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/

-pdm"통과 모드, 필요에 따라 디렉터리 생성, 파일 수정 시간 유지"를 의미합니다 .

--owner $SUDO_USER"지정된 사용자가 파일을 소유하도록 만듭니다.

마지막 피연산자는 cpio가 파일을 저장해야 하는 디렉터리입니다.

cpio의 강력한 기능에 대해 자세히 알아보려면 다음을 방문하세요.CPIO 매뉴얼 페이지는 여기입니다

단일 sudo 명령으로 이 작업을 수행할 수도 있습니다. 사용자가 이러한 파일에 액세스할 수 있다고 가정하면 다음과 같이 cpio 부분에만 sudo를 사용하세요.

ls /path/source/some*files | cpio -pdm --owner $USER /path/target/directory/

위의 예에서는 Sudo가 실행되기 전에 평가되므로 $SUDO_USER 대신 $USER를 사용합니다. 또는 사용자에게 파일을 나열할 권한이 없는 경우 해당 파일을 래퍼 스크립트에 넣고 sudo를 사용하여 래퍼를 실행합니다. 이는 더 어려워질 수 있지만 가장 간단한 경우 래퍼는 소스와 대상이라는 두 가지 매개 변수를 사용합니다.

이는 "cp_as_user" 래퍼에 들어갑니다.

ls $1 | cpio -pdm --owner $SUDO_USER $2

그런 다음 래퍼를 다음과 같이 사용하십시오.

sudo cp_as_user "/path/to/some*files" /path/to/target/directory

관련 정보