Posso dire a find di non ripristinare la directory di lavoro iniziale?


8

findnon è in grado di "ripristinare la directory di lavoro iniziale" quando eseguito dietro sudo -use la directory di lavoro iniziale non è visibile all'utente trova esecuzioni come. Questo fa sì che trovi sempre un fastidioso messaggio di avviso di Autorizzazione negata :

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

Qual è il modo migliore per impedire a find di stampare questo messaggio?

Un metodo consiste nel passare a una directory che l'utente find può ripristinare, ad esempio cd /prima di eseguire find. Idealmente, vorrei solo un'opzione per trovare come --do-not-restore-initial-working-directoryma immagino che non sia disponibile. ;)

Uso principalmente distribuzioni basate su RedHat.

Risposte:


5

La pulizia sembra essere una parte non facoltativa dell'esecuzione di find.

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

in maininfind.c

  cleanup ();
  return state.exit_status;
}

cleanup chiamate cleanup_initial_cwd

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

e in cleanup_initial_cwdrealtà cambia la directory

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);
    }
}

Potresti provare a usare uno script di shell che cdè il /primo, come hai suggerito. (ci sono alcuni problemi con questo script, non può gestire più directory per la ricerca, ad esempio)

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

Puoi anche filtrare l'output di stderr per rimuovere il messaggio indesiderato

#!/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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.