su를 사용하여 나머지 bash 스크립트를 해당 사용자로 실행하려면 어떻게 해야 합니까?
저는 사용자 이름과 프로젝트를 연결하는 문자열을 인수로 사용하는 스크립트를 작성했습니다.스크립트는 (su)를 사용자 이름으로, cd를 프로젝트 문자열에 기반한 특정 디렉토리로 전환해야 합니다.
저는 기본적으로 다음과 같은 일을 하고 싶습니다.
su $USERNAME;
cd /home/$USERNAME/$PROJECT;
svn update;
문제는 제가 일단 su를 하면...그것은 그냥 거기서 기다립니다.실행의 흐름이 사용자에게 전환으로 이어졌으니 말이 됩니다.일단 종료하면 나머지 작업이 실행되지만 원하는 대로 작동하지 않습니다.
su를 svn 명령어 앞에 붙였지만 명령어가 실패했습니다(즉, 원하는 디렉터리에서 svn을 업데이트하지 않았습니다).
사용자가 사용자를 전환하고 svn을 호출할 수 있는 스크립트를 작성하려면 어떻게 해야 합니까?
훨씬 단순함: 사용sudo
셸을 실행하고 명령을 전달하기 위해 유전자를 사용합니다.
#!/usr/bin/env bash
whoami
sudo -i -u someuser bash << EOF
echo "In"
whoami
EOF
echo "Out"
whoami
요령은 "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
사용자 이름 1 대신
다른 모든 사용자 명령을 고유한 스크립트로 실행해야 합니다.하나 또는 몇 개의 명령어만 있으면 인라인이 작동합니다.명령이 많은 경우에는 해당 명령을 자신의 파일로 이동하는 것이 가장 좋습니다.
su -c "cd /home/$USERNAME/$PROJECT ; svn update" -m "$USERNAME"
제 경우에는 루트 권한을 삭제하고 제한된 사용자로부터 스크립트의 나머지 부분을 수행하는 것이 더 편리했습니다. 올바른 사용자로부터 스크립트를 자동으로 재시작할 수 있습니다.이 접근 방식은 사용하는 것보다 더 읽기 쉽습니다.sudo
또는su -c
"스크립트 스크립트"를 사용합니다.처음에 루트로 시작했다고 가정해 보겠습니다.그러면 코드는 다음과 같이 표시됩니다.
#!/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"
...
다른 사용자 아래에서 스크립트의 나머지 또는 일부를 실행하려면 다음과 같은 스크립트를 사용합니다.
#!/bin/sh
id
exec sudo -u transmission /bin/sh - << eof
id
eof
사용하다sudo
대신
편집: Douglas가 지적했듯이, 당신은 사용할 수 없습니다.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를 사용한 해결 방법이 가장 좋습니다.
Perl 스크립트를 루트로 실행할 정도로 미친 경우 다음을 수행할 수 있습니다.$< $( $> $)
실제/유효 uid/sigma를 유지하는 변수, 예:
#!/usr/bin/perl -w
$user = shift;
if (!$<) {
$> = getpwnam $user;
$) = getgrnam $user;
} else {
die 'must be root to change uid';
}
system('whoami');
이것은 나에게 효과가 있었습니다.
"프로비저닝"을 "스타트업"에서 분리했습니다.
# Configure everything else ready to run
config.vm.provision :shell, path: "provision.sh"
config.vm.provision :shell, path: "start_env.sh", run: "always"
그러면 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 &
@MarSoft의 아이디어에서 영감을 받아 다음과 같이 대사를 변경했습니다.
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
사용한 적이 있습니다.sudo
암호 없이 스크립트를 실행할 수 있습니다.사용자의 암호를 입력하려면 다음을 제거합니다.sudo
하지 않은 합니다.-E
스도에서
그/usr/bin/bash -l
, ▁the를 profile.d
스크립트는 초기화된 환경에 대해 실행됩니다.
언급URL : https://stackoverflow.com/questions/1988249/how-do-i-use-su-to-execute-the-rest-of-the-bash-script-as-that-user
'programing' 카테고리의 다른 글
각도 2 - 모델 변경 후 뷰가 업데이트되지 않음 (0) | 2023.05.21 |
---|---|
기본 변경 기본 iOS 시뮬레이터 장치 대응 (0) | 2023.05.21 |
급여표에서 세 번째 또는 네 번째 최대 급여를 찾는 방법은 무엇입니까? (0) | 2023.05.21 |
Visual Studio에서 zure 함수를 게시하는 동안 오류 발생 (0) | 2023.05.21 |
필요한 하위 구문 분석기를 사용한 인수 구문 분석 (0) | 2023.05.21 |