tar: Removendo `/ 'principal dos nomes dos membros


137
root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names

Como posso resolver esse problema e manter os /nomes dos arquivos?


2
O que exatamente não está funcionando como esperado?

34
Não é um problema. Você não deseja barras invertidas em um arquivo tar. A sério. Se você deseja extrair um arquivo morto para a raiz do sistema, especifique -C /ao extraí-lo.
ThiefMaster

Respostas:


69

Use a opção --absolute-namesou -Ppara desativar esse recurso.

tar fczP bkup.tar.gz /home/foo/

tar fcz bkup.tar.gz --absolute-names /home/foo

54
Esta é a resposta correta, mas lembre-se de que, na maioria dos casos, não é isso que você deseja , pois resulta em um arquivo que é extraído em caminhos completos!
rubo77

8
Usar a -C /opção descrita na resposta do @Marcus se livrará da mensagem STDERR, se esse for seu objetivo principal.
Matt Sanders

11
Como o @ rubo77 comentou, geralmente este não é o resultado esperado do comando.
Alfredocambera

3
Na maioria das vezes, isso não é o que um usuário deseja, simplesmente porque a maioria deles não lê o manual até que precise (ninguém tem tempo para isso). Portanto, seria sensato, pelo menos, expandir sua resposta, alertando as pessoas a não fazerem isso, a menos que tenham certeza absoluta de que entendem qual é o efeito disso. Especialmente sendo aceito como resposta.
Mladen B.

11
@Toskan Exemplos adicionados
Barmar

89

Na verdade, isso é um recurso, não um problema. Arquivos com locais absolutos são um risco de segurança. Os invasores podem usar esses arquivos para induzir os usuários a instalar arquivos em locais críticos do sistema.

Sim, você poderia 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 a extração explicitamente no diretório raiz? Então eles impactam conscientemente locais críticos do sistema e não podem fazê-lo por acidente.


5
Às vezes, os recursos são problemas. Encontrei esse segmento depois de configurar um script de backup que enviaria por e-mail um status de saída diferente de zero tar. Essa mensagem em particular estava causando tara saída com um status de 1, o que estava fazendo com que eu recebesse alertas de email falsos em backups bem-sucedidos, simplesmente porque tarestava gravando essa mensagem no STDERR. cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
Corrigi

11
Eu acho que existem alguns casos de uso para usar -P- por exemplo, se você estiver fornecendo algum tipo de recurso de captura de imagem do sistema de arquivos no FUSE. Às vezes, você pode querer descompactar um instantâneo em um diretório específico, e não cwdda perspectiva do usuário.
DIMMSum

81

Se você quiser se livrar da "Removendo` `/ 'principal dos nomes de membros" sendo impressa no STDERR, mas ainda assim desejar deixar de fora as barras principais, como o tar sabiamente faz por padrão, eu vi uma excelente solução aqui pelo comentarista timsoft.

A solução envolve usar a opção -C para alterar o diretório para a raiz (/) e especificar a árvore de arquivos a ser arquivada sem uma barra inicial, porque agora você só precisa de um caminho relativo. Isso faz o mesmo que um comando tar create normal, mas nenhuma remoção é necessária:

tar fcz bkup.tar.gz -C / home/foo/

Não funcionará com backups incrementais. Mas uma boa resposta.
gajdipajti

Também não funciona se você deseja tar arquivos denotados por shell-expansion (por exemplo tar c -C / home/foo/*), porque o shell não sabe sobre a raiz alterada. Mas ainda é uma boa resposta para outros casos.
Boris

11
-C /não funciona para mim, ponto final. Isso não impede o stderr para mim.
Acumenus

3
@ABB verifique se o caminho a seguir a -C / é relativo.
Zurfyx

Essa abordagem funcionará se um usuário não tiver permissões no diretório raiz?
Mladen B.

31

Um mês atrasado, mas achei a solução mais apropriada para o meu caso (em um script shell): ir para o diretório pai e executar o comando lá.

cd /var/www/
tar -czf mysite.gz mysite

Ao invés de:

tar -czf /var/www/mysite.gz /var/www/mysite

9
Na verdade, você poderia ter feito isso usando: tar -zcvf mysite.gz -C / var / www / mysite / O benefício disso é que você pode executá-lo a partir de qualquer diretório
alfredocambera

Obrigado pela ajuda. Era disso que eu precisava. Eu não queria o caminho completo no meu tarball, apenas a pasta de destino.
Christia

Provavelmente isso deveria ter sido aceito como uma resposta correta, eu acho.
Mladen B.

Não vejo como isso responde à pergunta. É algo diferente que poderia ser feito. ……… Como: Q: Como eu passo de Los Angeles para Nova York? A: Vá para São Francisco.
G-Man

Eu concordo com @ G-Man. Isso resultará em um arquivo tar com uma estrutura de diretório completamente diferente. Em alguns casos, essa estrutura de diretórios é realmente mais apropriada em primeiro lugar, mas não responde à pergunta.
21419 Kevin Keane

7

Isto é como eu fiz isso 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"

4
O problema é que oculta o código de erro. Portanto, se você deseja verificar o código de erro do tar em um script bash, ele não retornará 0 com êxito.
Brian

@staticx, o código de erro é 0, independentemente.
Acumenus

11
@ABB Meu tarcomando pode retornar 2erro fatal.
Novite

11
@Brian, você pode usar $ PIPESTATUS para obter o código de saída. Veja unix.stackexchange.com/questions/14270/…
simpleuser

3

Tente usar -Csomente o caminho que impediria compactar com caminhos completos:

root@server # tar fcz bkup.tar.gz -C /home/ foo/

2

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ê deseja descompactá-lo na raiz do sistema de arquivos, basta

cd / && tar xzf backupt.tar.gz depois de transferi-lo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.