Como adicionar uma linha a um arquivo que possui apenas permissão de gravação raiz e para continuar a execução do script

9

Estou tentando aprender scripts bash. Estou trabalhando em um problema prático e, a certa altura, preciso adicionar uma linha a um arquivo que requer rootpermissão para escrever.

O código fica assim:

# some code
echo "add this line to the code" >> fileName
# some code

É possível, de alguma maneira, fazer com que o script solicite a senha root, valide a senha e, na autenticação bem-sucedida, modifique o arquivo? O script deve retornar ao modo de usuário e continuar a execução do comando.

Alex
fonte

Respostas:

13

Há uma dica na sudopágina de manual que explica como fazer algo assim. Aqui está o meu one-liner:

#!/usr/bin/bash
sudo sh -c "echo \"add this line to the code\" >> fileName"

Obviamente, primeiro você precisará configurar seu usuário para ter sudoprivilégios. O shshell é usado devido ao redirecionamento para o arquivo de propriedade raiz. Eu também tive que escapar das aspas usadas para o echocomando.

SigueSigueBen
fonte
2

su está disponível na maioria dos sistemas unix e deve funcionar:

su root -c 'echo "add this line to the code" >> fileName'
miracle173
fonte
Ao contrário de sudo, as senhas não parecem ser armazenadas em cache su.
precisa
@ Ryne Everett: Eu não estou familiarizado com o sudo. Mas o comportamento de 'su' é realmente o necessário para o script do OP. Na maioria das vezes eu uso 'su' ao contrário: mudando da raiz para outro usuário. Nesse caso, nenhuma senha é necessária para todos.
miracle173
1

Você poderia usar teecom sudo:

echo "add this line to the code" | sudo tee -a filename > /dev/null

echoA saída de é redirecionada com |( canal ) para sudo tee. teelê da entrada padrão e grava na saída padrão qualquer arquivo, nesse caso filename. -a(ou --append) teeanexa aos arquivos, sem ele os arquivos seriam substituídos. Como teeé executado, sudoele abre arquivos com permissões de root. Finalmente, > /dev/nullsuprime teea saída para saída padrão .

Uma vantagem de usar, em teevez de apenas iniciar o comando inteiro, incluindo o redirecionamento com su -cor sudo sh -cis, é que você não precisa alterar a citação do comando inicial de nenhuma maneira (as linhas de citação que já contêm aspas podem ficar feias às vezes).

Adaephon
fonte
0

Tente isto Este comando está disponível no Unix e Linux.

sudo sh -c "echo 'add this line to the code' >> fileName"

JongYoung
fonte
-2

Faria o truque:

ssh host "sudo su root -c 'echo "add this line to the code" >> /etc/hosts'"
user1934677
fonte
Por que ssh? Você não precisa sucom sudoe nem você precisa especificar rootcomo é o padrão. Em suma, um pouco mais de explicações seria bom, pois o OP queria aprender algo e não apenas um problema resolvido.
Adaephon
Eu acho que você vai correr em problemas com vocês aspas
miracle173