[bash] 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은 스크립트를 실행하는 사용자입니다.

이 스크립트를 실행하기 위해 여러 사용자가 필요한 경우 %groupnameusername1 대신 a 를 사용하십시오.


답변

훨씬 더 간단합니다. sudo셸을 실행하고 heredoc 을 사용하여 명령을 제공합니다.

#!/usr/bin/env bash
whoami
sudo -i -u someuser bash << EOF
echo "In"
whoami
EOF
echo "Out"
whoami

( 원래 SuperUser에 대한 답변 )


답변

다음과 같은 스크립트를 사용하여 다른 사용자로 스크립트의 나머지 또는 일부를 실행합니다.

#!/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하는 대신

편집 : Douglas가 지적했듯이 외부 명령 이 아니기 때문에 cdin을 사용할 수 없습니다 . 작업을 수행하려면 하위 쉘에서 명령을 실행해야합니다 .sudocd

sudo -u $USERNAME -H sh -c "cd ~/$PROJECT; svn update"

sudo -u $USERNAME -H cd ~/$PROJECT
sudo -u $USERNAME svn update

해당 사용자의 암호를 입력하라는 메시지가 표시 될 수 있지만 한 번만 입력해야합니다.


답변

쉘 스크립트 내에서 사용자를 변경할 수 없습니다. 다른 답변에 설명 된 sudo를 사용하는 해결 방법은 아마도 가장 좋은 방법입니다.

펄 스크립트를 루트로 실행하기에 충분히 화를 내면 $< $( $> $) 실제 / 유효 uid / gid 를 포함하는 변수로이를 수행 할 수 있습니다 . 예 :

#!/usr/bin/perl -w
$user = shift;
if (!$<) {
    $> = getpwnam $user;
    $) = getgrnam $user;
} else {
    die 'must be root to change uid';
}
system('whoami');