Kann ich find finden, dass das ursprüngliche Arbeitsverzeichnis nicht wiederhergestellt werden soll?

8

findsudo -ukann das anfängliche Arbeitsverzeichnis nicht wiederherstellen, wenn es hinterher ausgeführt wird, wenn das anfängliche Arbeitsverzeichnis für den Benutzer nicht sichtbar ist. Dies führt dazu, dass find immer eine nervige Warnmeldung " Berechtigung verweigert" druckt :

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

Wie kann am besten verhindert werden, dass find diese Nachricht druckt?

Eine Methode besteht darin, in ein Verzeichnis zu wechseln, das der Suchbenutzer wiederherstellen kann, z. B. cd /bevor find ausgeführt wird. Im Idealfall möchte ich nur eine Option zum Finden wie, --do-not-restore-initial-working-directoryaber ich denke, das ist nicht verfügbar. ;)

Ich verwende hauptsächlich RedHat-basierte Distributionen.

Quinn Comendant
quelle

Antworten:

5

Die Bereinigung scheint ein nicht optionaler Teil der Ausführung von zu sein find.

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

in maininfind.c

  cleanup ();
  return state.exit_status;
}

cleanup Anrufe cleanup_initial_cwd

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

und cleanup_initial_cwdändert tatsächlich das Verzeichnis

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

Sie könnten versuchen , einen Shell - Skript , das cdin s /zuerst, wie Sie vorgeschlagen. (Es gibt einige Probleme mit diesem Skript. Es kann beispielsweise nicht mehrere zu durchsuchende Verzeichnisse verarbeiten.)

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

Sie können auch die Ausgabe von stderr filtern, um die unerwünschte Nachricht zu entfernen

#!/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
quelle