programing

su를 사용하여 나머지 bash 스크립트를 해당 사용자로 실행하려면 어떻게 해야 합니까?

linuxpc 2023. 5. 21. 11:01
반응형

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

(원래 SuperUser에 대한 답변)

요령은 "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가 지적했듯이, 당신은 사용할 수 없습니다.cdsudo외부 명령이 아니기 때문입니다.하위 셸에서 명령을 실행해야 합니다.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

반응형