리디렉션없이 파일에 쓰시겠습니까?


13

특수 파일을 작성하고 마법 쿠키를 작성 해야하는 정기적으로 컴파일 된 응용 프로그램을 작성 중입니다. 응용 프로그램에서 직접 파일을 쓸 수 없으므로 시스템 보안 모델을 사용하려면 높은 권한으로 도우미 도구를 시작하여 트릭을 수행해야합니다. 도우미 도구에 여러 가지 인수를 제공 할 수 있습니다. 이제 도우미 도구 역할을하고 파일을 만들 수있는 매우 간단한 시스템 명령을 선택하고 싶습니다. 이 같은:

/bin/sh -c "/bin/echo -n 'magic' > /some/where/file"

간단한은 touch내가 파일에 쿠키, 간단한 쓸 필요로 잘라하지 않습니다 echo이 파일을 작성하는 리디렉션을 필요로 작동하지 않는 래퍼 쉘 않고 있습니다. 그런 사소한 작업을 수행하기 위해 루트 권한으로 쉘을 호출하는 것이 불편합니다. 파일을 작성하기 위해 호출 할 수있는 정말 간단하고 제한된 시스템 명령이 있습니까?


/bin/sh -c 'echo magic > /path/to/magic/file'작동하지 않는 이유 가 있습니까? 그것은 실행 파일과 두 개의 인수입니다. 마지막 인수를 문자열 (sprintf 또는 이와 동등한 형식)로 작성해야합니다. 이것이 효과가없는 이유가 있습니까? 귀하의 질문에서 doCommandAsRoot ()가 명령으로 스트림을 입력하지 않는 것처럼 들립니다. 맞습니까? 그렇지 않으면 마지막 인수를 대체하고 'cat > /path/to/magic/file'문자열을 생성하는 대신 데이터를 전달할 수 있습니다.
Arcege

쉘 예제는 작동하지만 간단한 파일을 만들기 위해 루트 권한으로 쉘을 호출하는 것을 싫어합니다. 라이브러리는 통신 파이프 인수 ( AuthorizationExecuteWithPrivileges )를 사용하여 쿠키를 사용하여 쿠키를 작성하는 데 사용될 수 있습니다 tee. 감사!
zoul

답변:


11

이것은 어떤가요:

echo -n 'magic' | sudo tee /some/where/file > /dev/null

물론 이것에는 방향 전환이 있지만 티 만 쉘이 아닌 루트로 실행됩니다. 함께 작동합니다 dd of=....


2
죄송합니다. 최근에 자신을 설명하는 데 어려움이 있습니다. 문제는 높은 권한으로 무언가를 실행하려면 특별한 라이브러리 호출 (예 :)을 거쳐야한다는 것 doCommandAsRoot입니다. 그리고이 함수는 명령과 인수에 대한 경로 만 허용하므로 출력 리디렉션을 즉시 사용할 수있는 방법이 없습니다. 나는 질문에 표시된 것처럼 쉘을 통과 할 수는 있지만 보안 측면에서는 마음에 들지 않습니다.
zoul

@ zoul : 쉘 스크립트를 작성한다고 생각했습니다. 권한이없는 프로세스가 액세스 할 수있는 파일에 매직 쿠키를 작성해도 괜찮습니까? 그렇다면 그런 파일에 쓰고를 호출하십시오 doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file").
stribika

아니요, 정기적으로 컴파일 된 응용 프로그램입니다 (질문 업데이트). 나는 단지 스스로 작성하지 않아도되도록 도우미 역할을 할 "쉘"명령을 찾고 있습니다. 예, 쿠키는 민감하지 않습니다. 이 dd예제는 내가 원하는 것에 매우 가깝습니다. 감사합니다. 더 간단한 것을 생각할 수 있습니까?
zoul

물론 — 대신 cp또는 mv을 사용할 수 있습니다 dd.
mattdm

나는 복사 할 필요없이 더 단순함을 의미한다 :)
zoul

9

출력 리디렉션이없고 파이프는 없지만 "여기서 문자열"이있는 경우 :

dd of=/some/where/file <<<'magic'

이 방법의 한 가지 단점은 dd는 일부 통계를 stdout에 기록한다는 것입니다. > / dev / null을 사용하여 숨길 수 있지만이 시점에서 티를 사용할 수도 있습니다.
studgeek

1
이것은 출력 리디렉션이나 파이프를 사용할 수없는 비정상적인 상황에서 나에게 효과적이었습니다. status=none최신 버전의 GNU coreutils의 다른 모든 출력을 억제합니다 dd.
Michael Hampton

5

다른 사용자가 볼 수 있기 때문에 매직 쿠키의 가치를 명령 행에두기를 원하지 않는다는 또 다른 고려 사항이 있습니다. 프로그램의 수명이 짧아도 (프로그램이 명령 줄 문자열을 0으로 만드는 경우 포함) 공격 가능성이 있습니다. 이론적으로는 :

writestringtofile 'magic' /some/where/file

위험한 접근입니다. 따라서 @stribika의 제안을 승인합니다. 값을 임시 파일에 쓰고 제자리에 복사하십시오. mkstemp()경쟁 조건이 없도록 보안 기능을 사용하여 임시 파일 ( ) 을 만드십시오 .


감사합니다. 유용한 토론입니다. 다행히도 "매직 쿠키"는 보안 장치가 아니며 누구나 볼 수 있습니다.
zoul

0

moreutils의 스폰지 -표준 입력을 흡수하고 파일에 씁니다.

echo -n 'magic' | sponge /some/where/file

쉘 재 지정과 달리 스폰지 는 출력 파일을 쓰기 전에 모든 입력을 흡수합니다. 가능한 경우 스폰지 는 임시 파일의 이름을 변경하여 출력 파일을 원자 적으로 생성하거나 업데이트합니다.

참조

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.