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
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.
À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:
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á.
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".
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.
-C /
ao extraí-lo.Respostas:
Use a opção
--absolute-names
ou-P
para desativar esse recurso.fonte
-C /
opção descrita na resposta do @Marcus se livrará da mensagem STDERR, se esse for seu objetivo principal.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.fonte
tar
. Essa mensagem em particular estava causandotar
a saída com um status de1
, o que estava fazendo com que eu recebesse alertas de email falsos em backups bem-sucedidos, simplesmente porquetar
estava 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]
-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ãocwd
da perspectiva do usuário.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:
fonte
tar c -C / home/foo/*
), porque o shell não sabe sobre a raiz alterada. Mas ainda é uma boa resposta para outros casos.-C /
não funciona para mim, ponto final. Isso não impede o stderr para mim.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á.
Ao invés de:
fonte
Isto é como eu fiz isso usando o método de força bruta:
2>&1 | grep -v "Removing leading"
.Por exemplo:
fonte
tar
comando pode retornar2
erro fatal.Tente usar
-C
somente o caminho que impediria compactar com caminhos completos:fonte
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.fonte