su를 사용하여 나머지 bash 스크립트를 해당 사용자로 실행하려면 어떻게합니까?
나는 사용자 이름과 프로젝트를 연결하는 문자열을 인수로 사용하는 스크립트를 작성했습니다. 스크립트는 사용자 이름으로 전환하고 (su) 프로젝트 문자열을 기반으로 특정 디렉토리로 cd합니다.
나는 기본적으로하고 싶다 :
su $USERNAME;
cd /home/$USERNAME/$PROJECT;
svn update;
문제는 일단 내가 su를하면 ... 거기에서 기다린다는 것입니다. 실행 흐름이 사용자에게 전환되었으므로 의미가 있습니다. 나가면 나머지 작업이 실행되지만 원하는대로 작동하지 않습니다.
svn 명령 앞에 su를 추가했지만 명령이 실패했습니다 (예 : 원하는 디렉토리에서 svn을 업데이트하지 않았습니다).
사용자가 사용자를 전환하고 svn을 호출 할 수있는 스크립트를 작성하려면 어떻게해야합니까?
트릭은 "su"대신 "sudo"명령을 사용하는 것입니다.
이것을 추가해야 할 수도 있습니다
username1 ALL=(username2) NOPASSWD: /path/to/svn
/ etc / sudoers 파일로
스크립트를 다음과 같이 변경하십시오.
sudo -u username2 -H sh -c "cd /home/$USERNAME/$PROJECT; svn update"
여기서 username2는 SVN 명령을 실행하려는 사용자이고 username1은 스크립트를 실행하는 사용자입니다.
이 스크립트를 실행하기 위해 여러 명의 사용자가 필요한 경우 %groupname
username1 대신
훨씬 간단합니다. sudo
쉘을 실행하고 heredoc 을 사용하여 명령을 제공하십시오.
#!/usr/bin/env bash
whoami
sudo -i -u someuser bash << EOF
echo "In"
whoami
EOF
echo "Out"
whoami
( 원래 수퍼 유저 )
다른 사용자가 스크립트의 나머지 또는 일부를 실행하려면 다음과 같은 스크립트를 사용하십시오.
#!/bin/sh
id
exec sudo -u transmission /bin/sh - << eof
id
eof
모든 다른 사용자 명령을 자체 스크립트로 실행해야합니다. 하나 또는 몇 개의 명령 인 경우 인라인이 작동합니다. 명령이 많으면 자신의 파일로 옮기는 것이 가장 좋습니다.
su -c "cd /home/$USERNAME/$PROJECT ; svn update" -m "$USERNAME"
내 경우에 더 편리한 또 다른 접근 방법이 있습니다 (루트 권한을 삭제하고 제한된 사용자로부터 나머지 스크립트를 수행하고 싶었습니다). 올바른 사용자에서 스크립트를 다시 시작하도록 할 수 있습니다. 처음에 루트로 실행한다고 가정 해 봅시다. 그러면 다음과 같이 보일 것입니다 :
#!/bin/bash
if [ $UID -eq 0 ]; then
user=$1
dir=$2
shift 2 # if you need some other parameters
cd "$dir"
exec su "$user" "$0" -- "$@"
# nothing will be executed beyond that line,
# because exec replaces running process with the new one
fi
echo "This will be run from user $UID"
...
사용 sudo
하는 대신
편집 :로 더글러스는 지적, 당신은 사용할 수 없습니다 cd
에서 sudo
그것이 아니므로 외부 명령. 작업을 수행하려면 서브 쉘에서 명령을 실행해야합니다 cd
.
sudo -u $USERNAME -H sh -c "cd ~/$PROJECT; svn update"
sudo -u $USERNAME -H cd ~/$PROJECT
sudo -u $USERNAME svn update
해당 사용자의 비밀번호를 한 번만 입력하라는 메시지가 표시 될 수 있습니다.
쉘 스크립트 내에서 사용자를 변경할 수 없습니다. 다른 답변에 설명 된 sudo를 사용하는 해결 방법이 가장 좋습니다.
If you're mad enough to run perl scripts as root, you can do this with the $< $( $> $)
variables which hold real/effective uid/gid, e.g.:
#!/usr/bin/perl -w
$user = shift;
if (!$<) {
$> = getpwnam $user;
$) = getgrnam $user;
} else {
die 'must be root to change uid';
}
system('whoami');
This worked for me
I split out my "provisioning" from my "startup".
# Configure everything else ready to run
config.vm.provision :shell, path: "provision.sh"
config.vm.provision :shell, path: "start_env.sh", run: "always"
then in my start_env.sh
#!/usr/bin/env bash
echo "Starting Server Env"
#java -jar /usr/lib/node_modules/selenium-server-standalone-jar/jar/selenium-server-standalone-2.40.0.jar &
#(cd /vagrant_projects/myproj && sudo -u vagrant -H sh -c "nohup npm install 0<&- &>/dev/null &;bower install 0<&- &>/dev/null &")
cd /vagrant_projects/myproj
nohup grunt connect:server:keepalive 0<&- &>/dev/null &
nohup apimocker -c /vagrant_projects/myproj/mock_api_data/config.json 0<&- &>/dev/null &
Inspired by the idea from @MarSoft but I changed the lines like the following:
USERNAME='desireduser'
COMMAND=$0
COMMANDARGS="$(printf " %q" "${@}")"
if [ $(whoami) != "$USERNAME" ]; then
exec sudo -E su $USERNAME -c "/usr/bin/bash -l $COMMAND $COMMANDARGS"
exit
fi
I have used sudo
to allow a password less execution of the script. If you want to enter a password for the user, remove the sudo
. If you do not need the environment variables, remove -E
from sudo.
The /usr/bin/bash -l
ensures, that the profile.d
scripts are executed for an initialized environment.
'program story' 카테고리의 다른 글
이미지에서 픽셀의 x, y 좌표 색상을 얻는 방법은 무엇입니까? (0) | 2020.07.25 |
---|---|
"C99 모드 외부에서 사용되는 for 루프 초기 선언"GCC 오류를 어떻게 수정합니까? (0) | 2020.07.24 |
두 개의 현을 인터리빙하는 가장 파이썬적인 방법 (0) | 2020.07.24 |
Angular v5에서 Angular v6으로 프로젝트를 업그레이드하고 싶습니다 (0) | 2020.07.24 |
기존 Xcode 프로젝트에서 Git 사용 (0) | 2020.07.24 |