질문:
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
권한있는 하위 프로세스를 만듭니다. 현재 프로세스의 권한은 변경되지 않습니다. 이후의 명령 su
은 su
완료된 후 일반 권한 으로 실행 됩니다.
대신 -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] 삭제
몇 마디 만하겠습니다