Puis-je dire à find de ne pas restaurer le répertoire de travail initial?

8

findn'est pas en mesure de «restaurer le répertoire de travail initial» lorsqu'il est exécuté sudo -usi le répertoire de travail initial n'est pas visible pour l'utilisateur. Cela provoque toujours trouver un message d'avertissement ennuyeux d' autorisation refusée :

$ pwd
/home/myuser
$ sudo -u apache find /home/otheruser -writable
find: failed to restore initial working directory: Permission denied

Quelle est la meilleure façon d'empêcher find d'imprimer ce message?

Une méthode consiste à passer à un répertoire que l'utilisateur find peut restaurer, tel que cd /, avant d'exécuter find. Idéalement, je voudrais juste une option pour trouver, --do-not-restore-initial-working-directorymais je suppose que ce n'est pas disponible. ;)

J'utilise principalement des distributions basées sur RedHat.

Quinn Comendant
la source

Réponses:

5

Le nettoyage semble être une partie non facultative de l'exécution de find.

https://github.com/Distrotech/findutils/blob/e6ff6b550f7bfe41fb3d72d4ff67cfbb398aa8e1/find/find.c#L231

dans maindansfind.c

  cleanup ();
  return state.exit_status;
}

cleanup appels cleanup_initial_cwd

https://github.com/Distrotech/findutils/blob/e6ff6b550f7bfe41fb3d72d4ff67cfbb398aa8e1/find/util.c#L534

et cleanup_initial_cwdchange réellement le répertoire

https://github.com/Distrotech/findutils/blob/e6ff6b550f7bfe41fb3d72d4ff67cfbb398aa8e1/find/util.c#L456

static void
cleanup_initial_cwd (void)
{
  if (0 == restore_cwd (initial_wd))
    {
      free_cwd (initial_wd);
      free (initial_wd);
      initial_wd = NULL;
    }
  else
    {
      /* since we may already be in atexit, die with _exit(). */
      error (0, errno,
         _("failed to restore initial working directory"));
      _exit (EXIT_FAILURE);
    }
}

Vous pouvez essayer d’utiliser un script shell cden /premier, comme vous l’avez suggéré. (il y a quelques problèmes avec ce script, il ne peut pas gérer plusieurs répertoires à rechercher, par exemple)

#!/bin/sh
path="$(pwd)/$1"
shift
cd /
exec find "$path" "$@"

Vous pouvez également filtrer la sortie de stderr pour supprimer le message indésirable

#!/bin/sh
exec 3>&2
exec 2>&1
exec 1>&3
exec 3>&-
3>&2 2>&1 1>&3 3>&- find "$@" | grep -v "^find: failed to restore initial working directory"
# not sure how to recover find's exit status
exit 0
Gregory Nisbet
la source