Могу я сказать найти, чтобы не восстанавливать начальный рабочий каталог?


8

findне может «восстановить исходный рабочий каталог» при запуске позади, sudo -uесли исходный рабочий каталог не виден пользователю. Это заставляет find всегда печатать раздражающее предупреждающее сообщение « Отказано в доступе»:

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

Каков наилучший способ запретить поиску печатать это сообщение?

Один из способов - перейти в каталог, который может найти пользователь find, например cd /, перед запуском find. В идеале, я бы просто хотел найти вариант, например, --do-not-restore-initial-working-directoryно я думаю, что это не доступно. ;)

Я в основном использую дистрибутивы на основе RedHat.

Ответы:


5

Очистка представляется необязательной частью выполнения find.

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

в mainвfind.c

  cleanup ();
  return state.exit_status;
}

cleanup звонки cleanup_initial_cwd

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

и на cleanup_initial_cwdсамом деле меняет каталог

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

Вы можете попробовать использовать скрипт, cdS в /первый, как вы предложили. (есть некоторые проблемы с этим сценарием, например, он не может обрабатывать несколько каталогов для поиска)

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

Вы также можете отфильтровать вывод stderr, чтобы удалить нежелательное сообщение

#!/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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.