간단한 bash 프로그램이 있는데 파일 구조는 다음과 같습니다.
$ 트리
.
├── includes
│ └── vimrc.vim
└── test_sourcing_vimrc.sh
.
file: test_sourcing_vimrc.sh
#! /bin/bash
self_dir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
sudo -s -u lando cat includes/vimrc.vim > test_output
.
file: includes/vimrc.vim (contains a .vimrc content)
" vim settings
set number
set laststatus=2
syntax enable
내 의도는
스크립트를 루트로 실행합니다(스크립트에는 다른 이유로 이러한 권한이 필요합니다).
sudo ./test_sourcing_vimrc.sh
sudo
루트가 아닌 사용자에게 "lando" 제공 - 이미 존재합니다.cat
내용을includes/vimrc.vim
새 파일로test_output
test_output
"lando"가 소유해야 하지만 루트가 소유합니다.
-rw-r--r-- 1 root root 5620 Sep 24 19:00 test_output
루트가 아닌 올바른 사용자가 소유한 파일을 생성하기 위해 이 스크립트를 어떻게 얻을 수 있습니까?
답변1
또 다른 해결책은 다음과 같습니다.
sudo install -o lando -m0775 -p -S includes/vimrc.vm test_output
복사된 파일이 받는 권한을 설정합니다 -m0775
. 이러한 권한은 실제로 기본값이므로 필요한 경우 생략할 수 있습니다. -p
복사된 파일의 수정 시간을 원본 파일과 동일하게 만듭니다 . 이렇게 -S
하면 이미 존재하는 경우 소스 파일이 성공적으로 복사되지 test_output
않는 한 삭제되지 않습니다 . install
필요에 따라 이러한 작업이 필요하지 않을 수도 있습니다. 어쨌든, 이 문제에 직면하고 다른 요구 사항이 있는 다른 사람들을 위해 이를 지적하겠습니다.
마지막으로 포함된 스크립트는 이미 루트로 실행 중이므로 초기 sudo
.
답변2
해결됨
변경됨
sudo -s -u lando cat includes/vimrc.vim > test_output
도착하다
sudo -s -u lando <<EOF
cat includes/vimrc.vim > test_output
EOF