2 votes

Utilisation de caractères de remplacement avec tar

J'utilise cette commande pour sauvegarder certains fichiers de configuration importants :

tar -czvf /var/backups/201102121202.tgz -C / etc/crontab etc/httpd/conf.d/* etc/httpd/conf/httpd.conf etc/httpd/passwords etc/httpd/vhost/* etc/php.ini etc/my.cnf etc/ssh/* etc/hosts etc/sysconfig/iptables var/spool/cron/* etc/passwd etc/group root/iptables_config etc/postfix/main.cf etc/postfix/master.cf etc/postfix/transport etc/postfix/valid_recipients etc/postfix/virtual etc/sysconfig/memcached etc/php.d/apc.ini etc/selinux/config etc/yum.repos.d/* etc/list_of_installed_packages.txt etc/safe-rm.conf home/*/.bash* home/*/.ssh usr/local/bin/* usr/local/sbin/* /etc/pki/tls/certs/mysite.com.crt /etc/pki/tls/private/mysite.key /etc/pki/tls/certs/gd_bundle.crt

Quand je le lance, j'obtiens :

tar: etc/httpd/conf.d/*: Cannot stat: No such file or directory
tar: etc/httpd/vhost/*: Cannot stat: No such file or directory
tar: etc/ssh/*: Cannot stat: No such file or directory
tar: var/spool/cron/*: Cannot stat: No such file or directory
tar: etc/yum.repos.d/*: Cannot stat: No such file or directory
tar: home/*/.bash*: Cannot stat: No such file or directory
tar: home/*/.ssh: Cannot stat: No such file or directory
tar: usr/local/bin/*: Cannot stat: No such file or directory
tar: usr/local/sbin/*: Cannot stat: No such file or directory
tar: Removing leading `/' from member names
tar: Error exit delayed from previous errors

Il semble que je ne puisse pas utiliser de caractères génériques dans les chemins.
Comment puis-je réparer ou contourner ce problème ?

Merci,
Dan

0 votes

Quel Shell utilisez-vous ?

0 votes

J'utilise bash

2voto

Arcege Points 2033

Le problème probable est que vous n'êtes pas dans le répertoire racine (/), mais vos caractères génériques supposent que vous l'êtes. Rappelez-vous que le Shell développe les wildcards sur la ligne de commande avant d'invoquer le programme. Ainsi, vous etc/ssh/* est relatif à votre répertoire de travail actuel, qui n'existe probablement pas. Lancez (cd /; tar ... etc/ssh/* ...) à la place.

1voto

Il vous manque un / avant le début des noms. Le Shell ne globera les noms que si ce sont des chemins absolus. De plus, si vous faites cela, il n'y a pas besoin d'utiliser la commande -C .

0 votes

Bon point. Je pense que je l'ai fait pour une raison. Probablement parce que si j'utilise des chemins absolus, lorsque je décompresse le paquet, je risque d'écraser le répertoire /etc du système hôte. Ai-je été clair ?

1 votes

Le Shell globera tout nom de fichier existant, relatif ou absolu. Et l'ajout d'un / aux chemins d'accès les ancrera et forcera un écrasement lors de l'extraction des fichiers système et ne permettra pas l'extraction des fichiers dans, disons, /tmp (pas sans utiliser chroot de toute façon).

1 votes

@Arcege : Le Shell, cependant, ne comprendra pas comme par magie que -C causes tar pour changer de répertoire.

1voto

therube Points 1366

Essayez de laisser tomber le * (ou peut-être le /*).


Syntaxe du reste ...

Lorsque file est le nom du chemin d'un répertoire, l'action s'applique à tous les fichiers et (récursivement) aux sous-répertoires de ce répertoire.

http://www.computerhope.com/unix/utar.htm

0voto

Znik Points 329

Votre commandement :

tar -czvf /var/backups/201102121202.tgz -C / etc/crontab etc/httpd/conf.d/* etc/httpd/conf/httpd.conf etc/httpd/passwords etc/httpd/vhost/* etc/php.ini etc/my.cnf etc/ssh/* etc/hosts etc/sysconfig/iptables var/spool/cron/* etc/passwd etc/group root/iptables_config etc/postfix/main.cf etc/postfix/master.cf etc/postfix/transport etc/postfix/valid_recipients etc/postfix/virtual etc/sysconfig/memcached etc/php.d/apc.ini etc/selinux/config etc/yum.repos.d/* etc/list_of_installed_packages.txt etc/safe-rm.conf home/*/.bash* home/*/.ssh usr/local/bin/* usr/local/sbin/* /etc/pki/tls/certs/mysite.com.crt /etc/pki/tls/private/mysite.key /etc/pki/tls/certs/gd_bundle.crt

Vous faites de simples erreurs comme moi dans le passé :)

  1. L'option -C tar 'déplace' seulement la commande tar vers '/' comme vous le faites.
  2. Le premier est Shell. Cela développe les astérisques en utilisant le répertoire courant. Quand vous écrivez /etc/* , cela développe /etc/* pour les noms. Quand vous écrivez etc/* , cela ne commence pas à partir de /root, mais du répertoire courant. Vous pouvez réparer cela en ajoutant '/' ou cd /. Alors -C n'est pas nécessaire.
  3. Vous pouvez empêcher l'expansion par le Shell, en utilisant la notation 'etc/*'. Mais tar utilisera cette notation 'telle quelle'. Si vous ne voulez pas cela, utilisez l'option --wildcards.
  4. Ce qui pour vous utilise 'etc/*', vous pouvez utiliser simplement 'etc/'. L'option --recursion est par défaut.

Voir homme goudron . Mais dans les anciens systèmes, ce manuel est incomplet, alors utilisez info tar .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X