Escrever em um arquivo sem redirecionamento?

12

Estou escrevendo um aplicativo compilado regular que precisa criar um arquivo especial e gravar um cookie mágico nele. Não consigo escrever o arquivo diretamente do aplicativo, o modelo de segurança do sistema exige que eu lance uma ferramenta auxiliar com privilégios elevados para executar o truque. Eu posso fornecer qualquer número de argumentos para a ferramenta auxiliar. Agora eu gostaria de escolher um comando de sistema muito simples que serviria como ferramenta auxiliar e criaria o arquivo para mim. Algo assim:

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

O Simple touchnão funciona porque eu preciso gravar o cookie no arquivo, um simples echosem o invólucro do shell não funciona, pois ele precisa de redirecionamento para gravar o arquivo. Não me sinto confortável chamando o shell com privilégios de root para executar uma tarefa tão trivial. Existe algum comando do sistema realmente simples e restrito que eu poderia chamar para escrever o arquivo para mim?

zoul
fonte
Existe uma razão pela qual /bin/sh -c 'echo magic > /path/to/magic/file'não funciona? Isso seria um arquivo executável e dois argumentos. Você precisaria construir o último argumento como uma string (com sprintf ou equivalente). Existe uma razão para isso não funcionar para você? Na sua pergunta, parece que doCommandAsRoot () não recebe entrada para transmitir ao comando, correto? Caso contrário, você poderá substituir o último argumento por 'cat > /path/to/magic/file'e passar os dados em vez de construir uma string.
Arcege 22/02
O exemplo do shell funciona, mas eu odiaria chamar o shell com privilégios de root apenas para criar um arquivo simples. A biblioteca usa um argumento de canal de comunicação (é AuthorizationExecuteWithPrivileges ), que pode ser usado para gravar o cookie usando tee. Obrigado!
zoul
Veja também stackoverflow.com/a/18146890/2032064
Mifeet 28/10

Respostas:

11

Que tal agora:

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

Claro que existem redirecionamentos nisto, mas somente o tee é executado como root, não como um shell. Funciona com dd of=...também.

stribika
fonte
2
Desculpe, obviamente tenho problemas para me explicar ultimamente. O problema é que, quando quero executar algo com privilégios elevados, tenho que passar por uma chamada de biblioteca especial (algo como doCommandAsRoot). E essa função aceita apenas um caminho para o comando e seus argumentos, então não há como eu usar o redirecionamento de saída imediatamente. Eu poderia passar pelo shell (como mostrado na pergunta), mas não gosto disso em termos de segurança.
zoul
@ zoul: Eu pensei que você estivesse escrevendo um script de shell. É possível gravar o cookie mágico em um arquivo acessível para processos sem privilégios? Se for, grave-o em um arquivo e ligue doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file").
22711 stribika
Não, é um aplicativo compilado regular (pergunta atualizada). Estou apenas procurando comandos "shell" para servir como ajudante, para que eu não precise escrevê-lo. Sim, o cookie não é nada sensível. O ddexemplo está bem próximo do que eu quero, obrigado. Você poderia pensar em algo ainda mais simples?
zoul
Claro - você pode usar cpou em mvvez de dd.
mattdm
Quero dizer mais simples, sem a necessidade de copiar :)
zoul
9

Sem redirecionamento de saída, sem pipe, mas com "here string":

dd of=/some/where/file <<<'magic'
Rainer Perske
fonte
Uma desvantagem dessa abordagem é o dd escreve algumas estatísticas no stdout. Você pode usar> / dev / null para ocultá-los, mas nesse ponto você também pode usar tee.
Studgeek
1
Isso funcionou para mim em uma situação incomum em que eu não podia usar redirecionamento de saída ou pipes. status=nonesuprimirá todas as outras saídas das versões modernas dos coreutils do GNU dd.
Michael Hampton
5

Há outra consideração: você não deseja colocar o valor do cookie mágico em uma linha de comando, pois isso pode ser observado por outros usuários. Mesmo que o programa tenha vida curta (inclusive se o programa zerar a cadeia de caracteres da linha de comando), há uma oportunidade de ataque. Então, um teórico:

writestringtofile 'magic' /some/where/file

é uma abordagem perigosa. Portanto, apoio a sugestão do @ stribika: escreva o valor em um arquivo temporário e copie-o no lugar. Certifique-se de usar uma função segura para criar o arquivo temporário ( mkstemp()), para que também não haja uma condição de corrida.

mattdm
fonte
Obrigado, esta é uma discussão útil. Felizmente, o “cookie mágico” não é um dispositivo de segurança, pode ser visto claramente por qualquer pessoa.
zoul