Use a opção --absolute-names
ou -P
para desativar esse recurso.
tar fczP bkup.tar.gz /home/foo/
tar fcz bkup.tar.gz --absolute-names /home/foo
root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading '/' from member names
Como posso resolver este problema e manter o /
nos nomes dos arquivos?
Isso é realmente um recurso, não um problema. Arquivos com localizações absolutas são um risco de segurança. Os atacantes podem usar esses arquivos para enganar os usuários para que instalem arquivos em locais críticos do sistema.
Sim, você pode usar -P
. Mas o que há de errado em permitir que o tar remova a barra, e simplesmente exigir que o usuário do arquivo faça explicitamente a extração no diretório raiz? Então eles estão impactando conscientemente os locais críticos do sistema e não podem fazê-lo por acidente.
Se você quiser se livrar de "Removendo o líder '/' dos nomes dos membros" sendo impressos no STDERR, mas ainda assim quiser deixar de lado as barras iniciais, como sabiamente, vi uma solução excelente aqui do comentarista timsoft.
A solução envolve usar a opção -C para alterar o diretório para a raiz (/) e, em seguida, especificar a árvore de arquivos para arquivar sem uma barra inicial, porque agora você precisa apenas de um caminho relativo. Isso faz a mesma coisa que um comando normal de criação de tar, mas não é necessário decapagem:
tar fcz bkup.tar.gz -C / home/foo/
Um mês atrasado, mas achei a solução mais apropriada para o meu caso (em um shell script) é ir ao diretório pai e executar o comando lá.
cd /var/www/
tar -czf mysite.gz mysite
Em vez de:
tar -czf /var/www/mysite.gz /var/www/mysite
Foi assim que eu fiz usando o método de força bruta: 2>&1 | grep -v "Removing leading"
.
Por exemplo:
tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v "Removing leading"
Eu resolvi esse problema com:
cd /home/foo && tar czf ~/backup.tar.gz .
Dessa forma, você não está tentando colocar caminhos absolutos no arquivo tar em primeiro lugar. Se você quiser descompactá-lo na raiz do sistema de arquivos, você apenas
cd / && tar xzf backupt.tar.gz
após transferi-lo.
Tente usar -C
apenas para o caminho, o que impediria a compactação com caminhos completos:
root@server # tar fcz bkup.tar.gz -C /home/ foo/