[unix] 루트 대신 생성 된 파일의 소유자로 사용자 이름을 설정하도록 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. 현재 사용자를 지정할 필요가 없습니다 (변수를 사용하고 있습니까?).


답변

install대신에 사용하십시오 cp:

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


답변

A의 POSIX 호환cp 할 수있는 것은 sudo cp -p foo bar하는 다음과 같은 파일 메타 데이터를 보존 복사 할 때 :

  • 접근 시간
  • 수정 시간
  • 아이디
  • 그룹 ID
  • 방법

다른 사용자 를 설정 하려면 JennyD의 솔루션 이 가장 좋습니다.


답변

당신이 할 경우 :

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

다음 ~/foo.txt과 같은 쉘이 열려있을 것입니다 당신이 (그래서 당신의 자격 증명을 사용하여 생성) 한 다음 sudo그 리디렉션의 표준 출력으로 실행됩니다.

결국, 파일은 귀하가 소유하게됩니다.

이러한 접근 방식은 또한 수행하는 작업을 제한하는 데 도움이됩니다 root. 여기서는 root그의 권한 만 open에 사용하고 /etc/foo.txt잠재적으로 유해한 작업은 수행하지 않습니다 (작성을 위해 파일을 열면 ~/foo.txt예를 들어 symlink 인 경우 나쁜 결과를 초래할 수 있음 ).


답변

를 사용 sudo하여 다른 사용자로 전환합니다. 이것이 명령의 핵심입니다. 첫 번째 파일에 정기적으로 액세스 할 수 없기 때문에 다른 사용자 ( root이 경우)에 액세스해야합니다.

sudo모든 sudo것을 수행하는 것은 명령을 실행하기 위해 다른 사용자로 전환하기 때문에 자체적으로 관리 할 수있는 방법이 없습니다 .

당신은해야합니다

  1. 두 명령 (또는 복합 명령)을 계속 사용하십시오.
  2. 다른 명령을 찾으십시오 (예 : 다른 응답에서 볼 수있는 설치).
  3. 또는 스크립트를 작성하고을 통해 해당 스크립트를 실행하십시오 sudo.

답변

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

Sudo를 루트로 가정하면 (Sudo를 사용하여 다른 사용자도 액세스 할 수 있음) 다음 두 단계를 자동화하는 스크립트를 작성할 수 있습니다.

cp source target
chown $SUDO_USER target

(루트 만 파일을 제공 할 수 있기 때문에 루트가 아닌 사용자에게 sudo 인 경우에는 작동하지 않습니다.)

그것을 자동화하는 것은 약간의 일이 될 것입니다. 소스가 단일 파일이고 대상이 디렉토리가 아닌 경우 작업이 완료된 것입니다. 나는 문제가 더 복잡한 상황, 예를 들어 다음과 같은 일을 할 때 실제 문제 일 뿐이므로 질문을했다고 가정합니다.

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

어떤 파일과 어떤 디렉토리가 전달되는지, 어떤 파일이 이미 존재하는지, 어떤 파일이 실제로 덮어 써 졌는지, 그리고 성공적으로 복사 된 파일의 소유권을 변경하는 복잡한 스크립트를 작성할 수 있습니다.

이 작업은 이미 완료되었습니다. 사용할 수 있습니다 cpio-sudo to root 후 cpio를 사용하여 파일을 복사하십시오. cpio는 복사 할 파일 목록이 필요하므로 2 단계 프로세스입니다. 아래 ls에서 복사 할 파일 목록을 생성하는 데 사용 합니다.

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

-pdm수단 “패스 스루 모드, 파일 수정 시간을 필요에 따라 디렉토리를 만듭니다 유지”

--owner $SUDO_USER" 지정된 사용자가 파일을 소유하게합니다.

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

cpio awesomeness에 대한 자세한 내용은 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


답변