2010-08-20 4 views
4

특정 작업을 다른 사용자가 소유 한 다른 특정 bash 스크립트에 위임하는 root (cron)로 실행되는 bash 백업 스크립트가 있습니다. 루트로 수행 할 (간체 예를 들어, 원칙이며, 몇 가지가있다, 다른 작업은 적절한 환경과 사용자 (오라클에 위임 아마존, ...)다른 사용자로 변경할 때 환경 설정

mkdir -p /tmp/backup$NAME 
su - oracle -c "~/.backups/export-test.sh" 
tar cf /tmp/backup/$NOW.tar /tmp/backup$NAME 
su - amazon upload_to_amazon.sh /tmp/backup/$NOW.tar 

자체로 다음 몇 가지 작업을 수행이 스크립트 oracle 사용자 : 내가 파이썬에서이 동작을 모방 할 때

mkdir -p $TMP_LOCATION 
cd ~/.backups 
exp $TMP_LOCATION/$NAME-$NOW 

나는 다음과 같은 SU를 사용하는 경우 배쉬에서

name = "oracle" 

# part run as root 
os.makedirs(tmp_backup + name) 


os.setegid(pwd.getpwnam(name)[3]) 
os.seteuid(pwd.getpwnam(name)[2]) 

# part run as oracle 
os.makedirs(tmp_location) 
os.chdir(os.path.expanduser("~{user}/.backups".format(user=name))) 
subprocess.check_call(["exp", 
         "os.path.join(tmp_location, name+'-'+now)" 
         ]) 

(루트로서 크론에서 시작)를 내놓았다 -하는 실제 새 쉘이 호출되고 해당 사용자의 모든 환경 변수가 설정됩니다. 파이썬 스크립트에서 어떻게 향상시킬 수 있습니까? 내가 따를 수있는 표준 요리법이 있습니까? 환경 변수, umask를 생각 중입니다 ...

환경이 중요 할 수있는 경우 Solaris 환경입니다. 해당 사용자의

답변

1

모든 환경 변수는 시작할 때 쉘이 .profile 파일을 실행 보통 때문에

을 설정합니다.

몇 가지 선택 사항이 있습니다. su - 동일 -

  1. .profile을 실행 subprocess.Popen으로 적절한 하위 프로세스를 생성.

  2. 환경 변수 설정을 신중하게 찾아 파이썬으로 모방하십시오. 문제는 .profile이 모든 종류의 미친 짓을 할 수 있기 때문에 .profile의 정확한 효과를 결정하는 데 잠재적 인 문제가된다는 것입니다.

  3. 또는 관련 환경 변수를 추출하여 쉘 환경과 Python 프로그램 모두에 액세스 할 수있게 만들 수 있습니다.

처음. 각각의 사용자가 설정 한 환경 변수 (파이썬 스크립트에 적용되지 않는 별칭이나 다른 광란과는 다른)에 대해 명확히하기 위해 .profile을 읽으십시오. 이러한 환경 변수 중 일부는 실행중인 스크립트와 관련이 있습니다. 일부는 관련이 없습니다.

두 번째. "관련"환경 변수를 깔끔한 env_backups.sh 스크립트 또는 env_uploads.sh 스크립트로 분할하십시오.

일단 환경 변수 스크립트를 사용하면 source env_backup.sh 또는 source env_uploads.sh으로 환경 변수 설정을 바꾸려면 .profile 파일을 업데이트하십시오.

셋째. Python 프로그램을 실행하기 전에 관련 env_thisenv_that 스크립트를 제공하십시오. 이제 파이썬 환경은 셸 환경과 변수를 공유하며 한 곳에서만 유지합니다.

my_script.sh

source ~oracle/env_backup.sh 
source ~amazon/env_uploads.sh 
python my_script.py 

저에게 가장 좋은 방법입니다. (그 이후로 우리가 할 수있는 방법입니다.)

+0

(1), 당신은 하루 종일 서브 프로세스로의 .profile 실행 할 수 있으며 부모의 환경을 수정하지 않습니다 - 이것은 실제로 선택 사항이 아닙니다. (3)이 더 좋지만, 오라클의 환경 변수가 아마존에 의해 덮어 쓰여질 수있는 잠재적 인 문제가 있습니다. – bstpierre

+0

(3) 사용자 환경의 분리를 제공하지 않습니다. 오라클 부분을 실행할 때 아마존 키도 환경에 있습니다. – Joram

+0

@ 조램 : 그래서? 그게 무슨 문제 야? –

0

어쨌든 환경 변수가 필요없이 root로 amazon을 실행할 수 있습니다. boto을 사용했습니다.

는 오라클 환경 변수에 관해서는 나는이 코드 조각을 사용 :에 관한

if "ORACLE_HOME" not in os.environ or os.environ["ORACLE_HOME"] != ORACLE_HOME: 
    logger.debug("setting ORACLE_HOME='{oh}'".format(oh=ORACLE_HOME)) 
    os.environ['ORACLE_HOME'] = ORACLE_HOME 
if ORACLE_HOME + "/bin" not in os.environ["PATH"].split(":"): 
    logger.debug("setting PATH='{p}'".format(p=os.path.expandvars(ORACLE_PATH))) 
    os.environ['PATH'] = os.path.expandvars(ORACLE_PATH) 
if "NLS_LANG" not in os.environ or os.environ["NLS_LANG"] != NLS_LANG: 
    logger.debug("setting NLS_LANG='{n}'".format(n=NLS_LANG)) 
    os.environ['NLS_LANG'] = NLS_LANG