Python의 하위 프로세스를 사용하여 일반 사용자에서 루트로 자동 전환

Bawn

질문:

PostgreSQL db에서 읽는 cmd를 실행하려고합니다. 수동으로 루트로 전환 한 다음 postgre 사용자로 전환하여 원하는 정보에 액세스 할 수 있습니다.

내가 가진 문제는 이것을 실행할 때 멈추고 아무 일도 일어나지 않는다는 것입니다.

루트 암호가 있고 현재 사용자에서 전환 할 때이 암호가 필요하지만 입력하라는 메시지가 표시되지 않습니다.

이것이 멈추지 않고 암호를 묻는 메시지를 표시하려면 어떻게해야합니까?

아래 코드는 단순성을 위해 'ls'만 실행합니다.

암호:

def popen_cmd_shell(command):
    print command
    process = subprocess.Popen(command,
                               stdout=subprocess.PIPE,
                               stderr=subprocess.STDOUT,
                               shell=True)

    proc_stdout = process.communicate()[0].strip()    
    return proc_stdout

if __name__ == '__main__':
    querylist = popen_cmd_shell('su - root; ls;')

    print querylist

업데이트 하나 :

Linux SUSE에서 python 2.7과 함께 제공되지 않는 라이브러리를 사용할 수 없습니다. 명령을 실행하고 종료하면됩니다.

업데이트 2 :

루트가 아니어야하는 다른 작업을 수행해야하므로 스크립트를 루트로 실행할 수 없습니다.

업데이트 3 :

LeBarton 제안에 따라 루트에 로그인하는 스크립트가 있지만 ls 명령은 루트로 실행되지 않지만 원래 사용자로 실행됩니다. 명령을 실행하면 루트 암호를 입력하라는 메시지가 표시되고 "@host" 에서 종료 이외의 다른 명령을 실행할 수없는 "host"전송됩니다 . 내가 종료하면 모든 명령 실행 출력이 나타납니다.

LeBarton이 가지고있는 것처럼 코드에 사용자 암호를 저장하고 싶지 않습니다. 루트로 명령을 실행하고 돌아와서 새 사용자에게 잠기지 않고 'exit'를 입력 할 필요없이 나머지 스크립트를 계속하려면 어떻게해야합니까?

"표준 오류 = subprocess.STDOUT" 는 정지 원인이 있었는지이었던 것으로 보인다.

암호:

if __name__ == '__main__':
    def subprocess_cmd(command):
        process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=True)
        proc_stdout = process.communicate()[0].strip()
        print proc_stdout

    subprocess_cmd('echo a; su - root; ls; cd;ls;')

...continue with rest of script where I execute commands as original user 

대답:

그의 훌륭한 답변에 대한 tripleee에게 감사드립니다.

다음 코드로 내가 설정 한 것을 달성했습니다.

if __name__ == '__main__':
    def subprocess_cmd(command):
        process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=False)
        proc_stdout = process.communicate()[0].strip()
        print proc_stdout

    subprocess_cmd(['su','-','root','-c','su -s /bin/sh  postgres -c \'psql -U msa ..........])

-c 이후에 루트로 실행하고 있던 명령이 있어야했습니다. 따라서 이제 postgres 사용자로 전환하고 루트에서 필요한 데이터를 찾아 일반 사용자에게 반환합니다.

트리플 리

당신은 무엇을하는지 오해하고 su있습니다. su권한있는 하위 프로세스를 만듭니다. 현재 프로세스의 권한은 변경되지 않습니다. 이후의 명령 susu완료된 일반 권한 으로 실행 됩니다.

대신 -c상승 된 권한으로 실행할 명령을 지정 하는 옵션 을 전달 하려고합니다. ( su맨 페이지 도 참조 하십시오 .)

popen_cmd_shell('su -c ls - root')

sudo 이런 종류의 일을 단순화하도록 특별히 설계되었으므로 대신 사용하는 것이 좋습니다.

권한있는 명령에 대한 스크립트 액세스는 끈질긴 주제입니다. 한 가지 일반적인 접근 방식은 명령이 권한있는 작업을 수행 한 다음 해당 권한을 삭제하는 것입니다. 보안 및 설계 관점에서이 접근 방식은 전체 논리를 단순화하는 경향이 있습니다. 권한이있는 코드는 가능한 한 간단하고 짧아야합니다. 예를 들어 권한이있는 섹션에서는 구문 분석이 없습니다.

권한이 부여 된 코드가 적절하게 테스트, 감사 및 동결되면 스크립트에 필요한 권한을 부여하는 것은 간단한 문제 여야합니다 (많은 조직이 편집증이 있고 기본적으로 이러한 종류에 대한 실행 가능한 정책을 설정할 수 없지만).

어떤 접근 방식을 취하 shell=True든 보안에 민감한 컨텍스트에서 어떤 것도 피하고 대신 외부 명령을 단일 문자열이 아닌 목록으로 전달해야합니다.

popen_cmd_shell(['su', '-c', 'ls', '-', 'root'])

(특히 셸을 원하지 않기 때문에 함수의 이름을 바꿀 수도 있습니다. 분명히를 지정하도록 함수를 변경하십시오 shell=False.)

다시 말하지만, 이러한 보안 문제는 권한을 삭제하든 또는 또는를 통해 권한 에스컬레이션을 요청 su하든 상관 없습니다 sudo.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

자바 스크립트를 사용하여 레일에서 API 요청 값을 자동으로 반환

분류에서Dev

Python에서 사전을 사용하여 숫자를 문자로 변환

분류에서Dev

사용자 루트를 사용자 루트로 전환하여 부모 프로세스를 종료하는 방법은 무엇입니까?

분류에서Dev

R에서 자동 프로세스 (예 : for 루프 등)를 사용하여 벡터 간의 특정 값 시퀀스에 대한 일치 행을 찾는 방법

분류에서Dev

자바를 사용하여 jar 파일을 실행하면 전용 PC를 기반으로 PC에서 작동

분류에서Dev

graphene을 사용하여 Graphql에서 문자열로 삽입 된 사전 반환

분류에서Dev

루트로 설치하고 일반 사용자로 액세스

분류에서Dev

Excel 시트의 특정 필드를 사용하여 Outlook에서 전자 메일을 자동화하는 Excel

분류에서Dev

동일한 텍스트 상자를 반복적으로 사용하여 HTML 및 Javascript에서 사용자의 입력을받을 수 있습니까?

분류에서Dev

루트로 전환하고 일반 사용자와 동일한 도트 파일을 사용하는 방법은 무엇입니까?

분류에서Dev

for 루프를 사용하여 C ++에서 반복적 자기 상관 프로세스 구현

분류에서Dev

루트 사용자로 전환하지만 동일한 디렉토리에 유지하는 방법

분류에서Dev

ctrl-z를 사용하여 자동으로 프로세스 일시 중단

분류에서Dev

숫자 변환에서 오버플로를 처리하기 위해 여러 컴파일러가 사용하는 일반적인 전략은 무엇입니까?

분류에서Dev

하위 프로세스를 사용하여 Python의 Bash 환경 변수에 액세스

분류에서Dev

joblib를 사용하여 결과를 상위 프로세스로 반환

분류에서Dev

VB를 사용하여 RTF 형식의 문자열을 일반 텍스트 문자열로 변환

분류에서Dev

솔루션에서 msbuild를 사용하여 일부 프로젝트에서 사용자 지정 대상 호출

분류에서Dev

일반 사용자 인 systemd 서비스에서 루트가 되고자하는 프로세스를 어떻게 실행합니까?

분류에서Dev

프로세스 대체를 사용한 여러 하위 문자열 일치

분류에서Dev

matplotlib를 사용하여 플로팅하기 위해 텍스트 파일 inorder의 문자열을 변환

분류에서Dev

Python을 사용하여 텍스트 파일에서 동일한 문자열을 찾으려고하면 두 가지 다른 결과가 반환됩니다.

분류에서Dev

Alt +`를 사용하여 동일한 응용 프로그램의 창간에 전환하는 방법

분류에서Dev

이메일을 params, rails로 사용하여 find_by에서 사용자 객체를 반환해야합니다.

분류에서Dev

태그를 사용하여 동일한 활동의 프래그먼트간에 여러 문자열 전송

분류에서Dev

사용자 정의 매개 변수를 사용하여 JBPM 6에서 새 프로세스 시작

분류에서Dev

동일한 파일에서 여러 사용자 로그인을 테스트하기 위해 Robot Framework 사용

분류에서Dev

일부 텍스트를 추가하여 프로세스 및 특정 사용자의 출력

분류에서Dev

toString을 사용하여 숫자를 문자열로 변환하여 반전

Related 관련 기사

  1. 1

    자바 스크립트를 사용하여 레일에서 API 요청 값을 자동으로 반환

  2. 2

    Python에서 사전을 사용하여 숫자를 문자로 변환

  3. 3

    사용자 루트를 사용자 루트로 전환하여 부모 프로세스를 종료하는 방법은 무엇입니까?

  4. 4

    R에서 자동 프로세스 (예 : for 루프 등)를 사용하여 벡터 간의 특정 값 시퀀스에 대한 일치 행을 찾는 방법

  5. 5

    자바를 사용하여 jar 파일을 실행하면 전용 PC를 기반으로 PC에서 작동

  6. 6

    graphene을 사용하여 Graphql에서 문자열로 삽입 된 사전 반환

  7. 7

    루트로 설치하고 일반 사용자로 액세스

  8. 8

    Excel 시트의 특정 필드를 사용하여 Outlook에서 전자 메일을 자동화하는 Excel

  9. 9

    동일한 텍스트 상자를 반복적으로 사용하여 HTML 및 Javascript에서 사용자의 입력을받을 수 있습니까?

  10. 10

    루트로 전환하고 일반 사용자와 동일한 도트 파일을 사용하는 방법은 무엇입니까?

  11. 11

    for 루프를 사용하여 C ++에서 반복적 자기 상관 프로세스 구현

  12. 12

    루트 사용자로 전환하지만 동일한 디렉토리에 유지하는 방법

  13. 13

    ctrl-z를 사용하여 자동으로 프로세스 일시 중단

  14. 14

    숫자 변환에서 오버플로를 처리하기 위해 여러 컴파일러가 사용하는 일반적인 전략은 무엇입니까?

  15. 15

    하위 프로세스를 사용하여 Python의 Bash 환경 변수에 액세스

  16. 16

    joblib를 사용하여 결과를 상위 프로세스로 반환

  17. 17

    VB를 사용하여 RTF 형식의 문자열을 일반 텍스트 문자열로 변환

  18. 18

    솔루션에서 msbuild를 사용하여 일부 프로젝트에서 사용자 지정 대상 호출

  19. 19

    일반 사용자 인 systemd 서비스에서 루트가 되고자하는 프로세스를 어떻게 실행합니까?

  20. 20

    프로세스 대체를 사용한 여러 하위 문자열 일치

  21. 21

    matplotlib를 사용하여 플로팅하기 위해 텍스트 파일 inorder의 문자열을 변환

  22. 22

    Python을 사용하여 텍스트 파일에서 동일한 문자열을 찾으려고하면 두 가지 다른 결과가 반환됩니다.

  23. 23

    Alt +`를 사용하여 동일한 응용 프로그램의 창간에 전환하는 방법

  24. 24

    이메일을 params, rails로 사용하여 find_by에서 사용자 객체를 반환해야합니다.

  25. 25

    태그를 사용하여 동일한 활동의 프래그먼트간에 여러 문자열 전송

  26. 26

    사용자 정의 매개 변수를 사용하여 JBPM 6에서 새 프로세스 시작

  27. 27

    동일한 파일에서 여러 사용자 로그인을 테스트하기 위해 Robot Framework 사용

  28. 28

    일부 텍스트를 추가하여 프로세스 및 특정 사용자의 출력

  29. 29

    toString을 사용하여 숫자를 문자열로 변환하여 반전

뜨겁다태그

보관