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


19

를 수행 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. 현재 사용자를 지정할 필요가 없습니다 (변수를 사용하고 있습니까?).

sudo cat /etc/foo.txt > ~/foo.txt. 파일은 이유 때문에 루트 만 읽을 수 있으므로 루트가 아닌 사용자가 사본을 읽을 수있게하려면 해당 이유를 명심해야합니다.
jw013

답변:



14

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

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

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


2
대상 사용자가 원본 파일을 소유 한 경우에만 작동합니다.
Jenny D

4
sudo를 실행하는 사람이 원본 파일을 가지고 있지 않다고 가정합니다. 그렇지 않으면 sudo를 사용할 필요가 없습니다.
EightBitTony

@EightBitTony sudo소유하지 않은 파일은 복사 할 필요가 없습니다. 결국 읽기 권한 만 있으면 됩니다.
l0b0

네, 잘못 입력했습니다.하지만 문제의 사용자 ID는 여전히 sudo가 필요하지 않기 때문에 파일을 읽을 수 없다고 가정합니다. 따라서 최종 파일을 소유하려는 사용자 ID가 원본 파일에 액세스 할 수 없다고 가정해야합니다. 어느 쪽이든, 이것은 sudo '문제'가 아닙니다. 당신의 대답은 우리가 원치 않는 것으로 가정하는 소유자를 유지하는 것을 제안합니다.
EightBitTony

2
이론적으로 파일은 대상 사용자가 소유하지만 대상 사용자가 입력 할 권한이없는 디렉토리에있을 수 있습니다. 그러나 그것은 가능성이 낮습니다 :-)
Jenny D

8

당신이 할 경우 :

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

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

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

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


2
이는 사용자가 대상 디렉토리에 쓸 수 있다고 가정합니다.
Johan

3

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

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

당신은해야합니다

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

1

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

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