Eu tenho o php
script shell ( ) que entra em contato com o arquivo de destino desta maneira:
- inspeciona se o arquivo e o diretório são graváveis com
php
'sis_writable()
(não acho que isso seja problema) - O arquivo no local edita com o
sed
comando:
grep -q "$search" "$passwd_file" && { sed -i "s|$search|$replace|" "$passwd_file"; printf "Password changed!\n"; } || printf "Password not changed!\n"
Como resultado, recebo (tudo correto, mas) o arquivo que deveria myuser:www-data
ser myuser:myuser
.
Altera a sed
propriedade do grupo de arquivos como parece e como evitá-lo, se possível?
bash
shell
shell-script
permissions
chown
Miloš Đakonović
fonte
fonte
Respostas:
Há um pequeno problema
sed
no modo de edição local-i
.sed
cria um arquivo temporário no mesmo diretório chamadosedy08qMA
, ondey08qMA
é uma sequência gerada aleatoriamente. Esse arquivo é preenchido com o conteúdo modificado do arquivo original. Após a operação,sed
remove o arquivo original e renomeia o arquivo temporário com o nome do arquivo original. Portanto, não é uma edição verdadeira no local . Ele cria um novo arquivo com permissões do usuário que está chamando e um novo número de inode. Esse comportamento geralmente não é ruim, mas, por exemplo, os links físicos são quebrados.No entanto, se você deseja uma verdadeira edição no local, use
ed
. Ele lê comandos do stdin e edita o arquivo diretamente, sem um arquivo temporário (isso é feito atravésed
do buffer de memória). Uma prática comum é usarprintf
para gerar a lista de comandos:O
printf
comando produz a saída da seguinte maneira:Essas duas linhas são
ed
comandos. O primeiro procura a stringsearch
e a substitui porreplace
. O segundo escreve (w
) as alterações no arquivo e fecha (q
).-s
suprime a saída de diagnóstico.fonte
O
-i
parâmetrosed
funciona, criando um arquivo temporário durante a operação e substitua o arquivo real pelo arquivo temporário no final. Essa é a causa mais provável do problema, pois ao criar a propriedade do arquivo temporário, o padrão émyuser:myuser
Você pode definir o
setgid
bit no diretório pai (apenas se o diretório pai pertencer ao grupowww-data
), para que os arquivos criados nesse diretório herdem o mesmo grupo.fazer isso:
Eu acho que esse é um uso muito típico do
setgid
bit.fonte
sed -i
, encontrei a seguinte linha no trace, isso significa que ele criou o arquivo temporário no diretório atual?open("./sedKyG9Ei", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
O uso de em
ed
vez desed
parece supérfluo para isso, considerando que você precisa inserir uma entrada adicional. A distribuição em que estou trabalhando agora (CentOS 5.10) tem a-c
opção desed
utilizar 'copiar' o arquivo temporário em vez de simplesmente renomeá-lo quando usado com a-i
opção. Eu testei e funcionou perfeitamente, preservando o proprietário e o grupo originais ao fazer uma edição embutida. NÃO preserva o tempo de modificação.por exemplo,
sed -ci -e '3,5d' file.txt
-c
usa cópia em vez de renomear (ou seja, preserva a propriedade / grupo)-i
edição em linha-e
script / expressão a ser executadoNão tenho certeza de quão ampla é essa opção
sed
em outras distribuições. O Solaris 10 não o possui, mas o Solaris não tem muitas coisas que eu quero.fonte