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

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.

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 
  • Как сделать скрипт sudo без пароля для любого пользователя в bash
  • «Su», когда пароль неизвестен, но вы находитесь в «колесе» с «без пароля»,
  • Какая потребность в команде `fakeroot` в Linux?
  • mac terminal - как сделать каталог требует SUDO-доступа, чтобы удалить его?
  • Что произошло после sudo -s
  • Выход из скрипта Bash при выходе из sudo
  • Почему я не могу использовать sudo для OpenBSD?
  • Перезапустить PHP-FPM из скрипта PHP
  • Выполнить строку команд с помощью одного sudo
  • Отсутствуют параметры административной панели Webmin.
  • Как исправить пустые / etc / sudoers как root?
  • В чем разница между терминалом root и sudo?
  • Linux и Unix - лучшая ОС в мире.