No es un problema. No desea barras inclinadas en un archivo tar. Seriamente. Si desea extraer un archivo a la raíz de su sistema, especifique -C /al extraerlo.
ThiefMaster
Respuestas:
69
Use la opción --absolute-nameso -Ppara deshabilitar esta función.
tar fczP bkup.tar.gz /home/foo/
tar fcz bkup.tar.gz --absolute-names /home/foo
Esta es la respuesta correcta, pero tenga en cuenta que, en la mayoría de los casos, esto no es lo que desea , ya que da como resultado un archivo que se extrae en rutas completas.
rubo77
8
Usar la -C /opción como se describe en la respuesta de @Marcus eliminará el mensaje STDERR si ese es su objetivo principal.
Matt Sanders
1
Como comentó @ rubo77, generalmente este no es el resultado esperado del comando.
alfredocambera
3
La mayoría de las veces esto no es lo que un usuario quiere, simplemente porque la mayoría de ellos no leen el manual hasta que lo necesitan (nadie tiene tiempo para eso). Por lo tanto, sería prudente, al menos, expandir su respuesta, advirtiéndole a las personas que no hagan esto a menos que estén absolutamente seguros de entender cuál es el efecto. Especialmente ser aceptado como respuesta.
Mladen B.
1
@Toskan Ejemplos agregados
Barmar
89
Eso es en realidad una característica, no un problema. Los archivos con ubicaciones absolutas son un riesgo de seguridad. Los atacantes podrían usar dichos archivos para engañar a los usuarios para que instalen archivos en ubicaciones críticas del sistema.
Sí, podrías usarlo -P. Pero, ¿qué tiene de malo permitir que tar elimine la barra diagonal y simplemente requerir que el usuario del archivo haga la extracción explícitamente en el directorio raíz? Entonces están afectando conscientemente las ubicaciones críticas del sistema, y no pueden hacerlo por accidente.
A veces las características son problemas. Encontré este hilo después de configurar un script de copia de seguridad que enviaría un correo electrónico en un estado de salida distinto de cero tar. Este mensaje en particular estaba causando tarque saliera con un estado de 1, lo que estaba causando que recibiera alertas de correo electrónico falsas sobre copias de seguridad exitosas, simplemente porque tarestaba escribiendo este mensaje en STDERR. Solucioné este problema usando mi propia versión modificada de la solución de cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
@Marcus
1
Creo que hay algunos casos de uso para usar -P, por ejemplo, si proporciona algún tipo de función de captura de imágenes del sistema de archivos en FUSE. En ocasiones, es posible que desee descomprimir una instantánea en un directorio específico en lugar de cwddesde la perspectiva del usuario.
DIMMSum
81
Si desea deshacerse de "Eliminar los principales '/' de los nombres de los miembros 'que se imprimen en STDERR, pero aún así desea omitir esas barras inclinadas como lo hace sabiamente el alquitrán por defecto, vi una excelente solución aquí por el comentarista timsoft.
La solución implica usar la opción -C para cambiar el directorio a la raíz (/), luego especificar el árbol de archivos para archivar sin una barra inclinada, porque ahora solo necesita una ruta relativa. Esto hace lo mismo que un comando normal de creación de tar, pero no se necesita quitar:
No funcionará con copias de seguridad incrementales. Pero una buena respuesta.
gajdipajti 05 de
Tampoco funciona si desea tar archivos denotados por shell-expansion (por ejemplo tar c -C / home/foo/*), porque el shell no sabe acerca de la raíz modificada. Pero sigue siendo una buena respuesta para otros casos.
Boris
1
-C /no me funciona, punto. No previene el stderr para mí.
Acumenus
3
@ABB asegúrese de que la ruta que sigue a -C / sea relativa.
zurfyx
¿Funcionará este enfoque si un usuario no tiene permisos en el directorio raíz?
Mladen B.
31
Un mes tarde, pero encontré que la solución más adecuada para mi caso (en un script de shell) es ir al directorio principal y ejecutar el comando allí.
De hecho, podría haberlo hecho usando: tar -zcvf mysite.gz -C / var / www / mysite / El beneficio de esto es que puede ejecutarlo desde cualquier directorio
alfredocambera
Gracias por tu ayuda. Esto es lo que necesitaba. No quería la ruta completa en mi tarball, solo la carpeta de destino.
Christia
Esto probablemente debería haber sido aceptado como una respuesta correcta, creo.
Mladen B.
No veo cómo esto responde a la pregunta en absoluto. Es algo diferente que se podría hacer. ... ... ... Como: P: ¿Cómo llego desde Los Ángeles a Nueva York? A: Ve a San Francisco en su lugar.
G-Man
Estoy de acuerdo con @ G-Man. Esto dará como resultado un archivo tar con una estructura de directorio completamente diferente. En algunos casos, esa estructura de directorios es realmente más apropiada en primer lugar, pero no responde la pregunta.
Kevin Keane el
7
Esta es la forma en que lo hice usando el método de fuerza bruta: 2>&1 | grep -v "Removing leading".
El problema con esto es que oculta el código de error. Entonces, si desea verificar el código de error de tar en un script bash, entonces no devolverá 0 en caso de éxito.
Brian
@staticx, el código de error es 0 independientemente.
Acumenus
1
@ABB Mi tarcomando puede devolver 2un error fatal.
de esa manera no estás tratando de poner rutas absolutas en el archivo tar en primer lugar. Si desea descomprimirlo en la raíz del sistema de archivos, simplemente
cd / && tar xzf backupt.tar.gz después de transferirlo.
-C /
al extraerlo.Respuestas:
Use la opción
--absolute-names
o-P
para deshabilitar esta función.fuente
-C /
opción como se describe en la respuesta de @Marcus eliminará el mensaje STDERR si ese es su objetivo principal.Eso es en realidad una característica, no un problema. Los archivos con ubicaciones absolutas son un riesgo de seguridad. Los atacantes podrían usar dichos archivos para engañar a los usuarios para que instalen archivos en ubicaciones críticas del sistema.
Sí, podrías usarlo
-P
. Pero, ¿qué tiene de malo permitir que tar elimine la barra diagonal y simplemente requerir que el usuario del archivo haga la extracción explícitamente en el directorio raíz? Entonces están afectando conscientemente las ubicaciones críticas del sistema, y no pueden hacerlo por accidente.fuente
tar
. Este mensaje en particular estaba causandotar
que saliera con un estado de1
, lo que estaba causando que recibiera alertas de correo electrónico falsas sobre copias de seguridad exitosas, simplemente porquetar
estaba escribiendo este mensaje en STDERR. Solucioné este problema usando mi propia versión modificada de la solución decd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
-P
, por ejemplo, si proporciona algún tipo de función de captura de imágenes del sistema de archivos en FUSE. En ocasiones, es posible que desee descomprimir una instantánea en un directorio específico en lugar decwd
desde la perspectiva del usuario.Si desea deshacerse de "Eliminar los principales '/' de los nombres de los miembros 'que se imprimen en STDERR, pero aún así desea omitir esas barras inclinadas como lo hace sabiamente el alquitrán por defecto, vi una excelente solución aquí por el comentarista timsoft.
La solución implica usar la opción -C para cambiar el directorio a la raíz (/), luego especificar el árbol de archivos para archivar sin una barra inclinada, porque ahora solo necesita una ruta relativa. Esto hace lo mismo que un comando normal de creación de tar, pero no se necesita quitar:
fuente
tar c -C / home/foo/*
), porque el shell no sabe acerca de la raíz modificada. Pero sigue siendo una buena respuesta para otros casos.-C /
no me funciona, punto. No previene el stderr para mí.Un mes tarde, pero encontré que la solución más adecuada para mi caso (en un script de shell) es ir al directorio principal y ejecutar el comando allí.
En lugar de:
fuente
Esta es la forma en que lo hice usando el método de fuerza bruta:
2>&1 | grep -v "Removing leading"
.Por ejemplo:
fuente
tar
comando puede devolver2
un error fatal.Intente utilizar
-C
solo la ruta que evitaría comprimir con rutas completas:fuente
Resolví este problema con:
cd /home/foo && tar czf ~/backup.tar.gz .
de esa manera no estás tratando de poner rutas absolutas en el archivo tar en primer lugar. Si desea descomprimirlo en la raíz del sistema de archivos, simplemente
cd / && tar xzf backupt.tar.gz
después de transferirlo.fuente