os.system ()을 사용할 때 종종 명령에 매개 변수로 전달 된 파일 이름 및 기타 인수를 이스케이프해야합니다. 어떻게 할 수 있습니까? 여러 운영 체제 / 쉘에서 작동하지만 특히 bash에서는 작동하는 것이 좋습니다.
저는 현재 다음을 수행하고 있지만이를위한 라이브러리 함수 또는 적어도 더 우아하고 / 튼튼하고 / 효율적인 옵션이 있어야합니다.
def sh_escape(s):
return s.replace("(","\\(").replace(")","\\)").replace(" ","\\ ")
os.system("cat %s | grep something | sort > %s"
% (sh_escape(in_filename),
sh_escape(out_filename)))
편집 : 따옴표 사용에 대한 간단한 대답을 받아 들였습니다. 왜 그렇게 생각하지 않았는지 모르겠습니다. 나는 Windows에서 왔기 때문에 '와 "가 약간 다르게 작동하는 것 같습니다.
보안과 관련하여 우려 사항을 이해하지만이 경우 os.system ()이 제공하는 빠르고 쉬운 솔루션에 관심이 있으며 문자열의 소스는 사용자가 생성하지 않았거나 최소한 사용자가 입력 한 것입니다. 신뢰할 수있는 사용자 (나).
sh_escape
함수는 ;
및 공백을 이스케이프 하고 .NET Framework와 같은 파일을 생성하여 보안 문제를 제거하는 것 foo.txt\;\ rm\ -rf\ /
입니다.