O usuário não pode tocar -t

10

Quando SCP está no meu servidor Fedora, um usuário continua recebendo erros por não conseguir modificar os registros de data e hora do arquivo ("set time: operation not allowed"). O usuário não é o proprietário do arquivo, mas não podemos chown arquivos para esse usuário por motivos de segurança. O usuário pode sudo , mas como isso está acontecendo por meio de um cliente SCP / FTP, também não é possível fazer isso. E, finalmente, não queremos ter que dar a esse usuário acesso root, apenas para permitir que ele use uma sincronização como o rsync ou o WinSCP que precisa definir registros de data e hora.

O usuário faz parte de um grupo com permissões rw completas em todos os arquivos e diretórios relevantes. Alguma idéia sobre como conceder permissão ao usuário para touch -t desses arquivos específicos sem chown -los para ele?

Mais informações Tudo isso tem a ver com a ativação do desenvolvimento de PHP em um cenário de único desenvolvedor (isto é: sem o SCM). Eu estou tentando trabalhar com o Eclipse ou NetBeans para trabalhar em uma cópia local do site baseado em PHP (WordPress), permitindo ao usuário "instantaneamente" visualizar suas alterações no servidor de desenvolvimento. O usuário estará trabalhando remotamente. Até agora, todas as tentativas de sincronização automática falharam - mesmo usando o WinSCP no modo "watch folder", onde ele monitora uma pasta local e tenta fazer upload de qualquer alteração até o erro do diretório remoto porque sempre tenta definir a data / timestamp .

O usuário tem acesso ao sudo, mas me disseram que realmente não é uma boa ideia trabalhar com o 'root', então eu não estou disposto a fazer login como root para fazer este trabalho. Além disso, não deveria ser necessário. Eu gostaria que outro, não superusuário, fosse capaz de fazer a mesma coisa - usando suas informações de conta, estabelecer uma conexão FTP e ser capaz de trabalhar remotamente via sincronização. Portanto, a solução precisa funcionar para alguém sem acesso root.

O que me espanta é o quanto estou tendo dificuldade. Todos esses softwares (NetBeans, Eclipse, WinSCP) são projetados para permitir a sincronização, e todos eles tentam gravar o timestamp. Então deve ser possível. O WinSCP tem a opção de desativar "definir registro de data e hora", mas essa opção fica indisponível (sempre "ligada") quando você seleciona monitorar / sincronizar pasta. Então, é obtido como algo que é bastante normal.

Dado que eu sou um completo idiota quando se trata de Linux, e eu sou o "administrador do servidor" dev eu só posso assumir que é algo idiota que eu estou fazendo ou que eu (mis) configurei.

Resumo Em suma, eu quero que todos os usuários que têm acesso de grupo r / w a um diretório, possam alterar o registro de data e hora em arquivos nesse diretório via SCP.

    
por Tom Auger 14.06.2011 / 17:53

2 respostas

9

Por que não funciona

Quando você tenta alterar o horário de modificação de um arquivo com touch , ou mais geralmente com a chamada de sistema subjacente utime , há dois casos.

  • Você está tentando definir a hora de modificação do arquivo para um horário específico. Isso requer que você seja o proprietário do arquivo. (Tecnicamente falando, o ID do usuário efetivo do processo deve ser o proprietário do arquivo.²)
  • Você está tentando definir a hora da modificação do arquivo para a hora atual. Isso funciona se e somente se você tiver permissão para gravar no arquivo. O motivo dessa exceção é que você poderia obter o mesmo efeito de qualquer maneira sobrescrevendo um byte existente do arquivo com o mesmo valor¹.

Por que isso geralmente não importa

  • Quando você copia arquivos com ftp, scp, rsync etc., a cópia cria um novo arquivo pertencente a quem fez a cópia. Assim, a copiadora tem permissão para definir os horários do arquivo.
  • Com o rsync, você não poderá definir a hora dos diretórios existentes: eles serão definidos para a hora em que um arquivo foi sincronizado pela última vez. Na maioria dos casos, isso não importa. Você pode dizer ao rsync para não se incomodar com os tempos de diretório passando --omit-dir-times ( -O ).
  • Com sistemas de controle de versão, as datas de revisão são armazenadas em arquivos; os metadados nos arquivos são principalmente irrelevantes.

Soluções

This all has to do with enabling PHP development in a single-developer scenario (ie: without SCM).

Ok, pare aí mesmo. Só porque há um único desenvolvedor não significa que você não deveria usar o SCM. Você deve estar usando o SCM. Peça ao desenvolvedor que faça o check-in de um arquivo e dê a ele uma maneira de pressionar um botão “deploy” para verificar os arquivos do SCM no diretório ativo.

Não há absolutamente nenhuma razão técnica pela qual você não deveria estar usando o SCM, mas pode haver uma razão humana. Se a pessoa que está trabalhando nesses arquivos se denominar "desenvolvedor", ele deve estar usando o SCM. Mas se for uma pessoa não técnica que insere documentos, o SCM pode ser muito complicado. Então vá empurrando os arquivos via FTP ou SSH. Existem três maneiras pelas quais isso pode funcionar.

  • Você realmente precisa sincronizar os horários? Como indicado acima, rsync tem uma opção para não sincronizar os horários. Scp não a menos que você diga. Eu não conheço WinSCP, mas provavelmente também pode.
  • Continue fazendo o que você está fazendo, apenas ignore as mensagens sobre os horários. Os arquivos ainda estão sendo copiados. Esta não é uma boa opção, porque ignorar os erros é sempre arriscado. Mas é tecnicamente possível.
  • Se você precisar de flexibilidade para preencher os arquivos de propriedade do usuário apache , a abordagem usual seria permitir o acesso do usuário SSH como apache . A abordagem fácil é fazer com que o usuário crie uma chave privada SSH e adicione a chave pública correspondente a ~apache/.ssh/authorized_keys . Isso significa que o usuário poderá executar comandos arbitrários como o usuário apache . Já que você está de acordo em dar ao usuário direitos de sudo de qualquer maneira, não importa no seu caso. É possível, mas não tão fácil, colocar mais restrições (você precisa de uma entrada separada do banco de dados do usuário com um nome diferente, o mesmo ID do usuário, um shell restrito e um chroot jail; detalhes em uma questão separada, embora isso já possa ser coberto neste site ou em Falha do servidor ).

¹ Ou, para um arquivo vazio, escreva um byte e trunque.
² Excluindo complicações adicionais, mas nenhuma que eu saiba se aplica aqui.

    
por 15.06.2011 / 17:56
2

Você pode configurar o rsync para usar o sudo no lado remoto da seguinte forma:

rsync -ave ssh --rsync-path="sudo rsync" /source/ user@host:/dest/
    
por 14.06.2011 / 23:13