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

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

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

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

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

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

  • Почему суперпользователь отключен в iOS и Android
  • SUID случайно удален из файла / bin / su
  • Невозможно использовать sudo и другие приложения
  • Отправить команду с паролем в сценарии upstart
  • По умолчанию оболочка не выбрана с помощью useradd
  • Как сделать скрипт sudo без пароля для любого пользователя в bash
  • Копирование защищенных файлов между серверами в одной строке?
  • Как изменить права на файлы / каталоги на установленном каталоге nfs, поэтому я обращаюсь к файлам как пользователь?
  • One Solution collect form web for “Могу ли я сказать, чтобы найти, чтобы не восстановить исходный рабочий каталог?”

    Очистка, по-видимому, является необязательной частью выполнения 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); } } 

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

     #!/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 
    Linux и Unix - лучшая ОС в мире.