Tôi có thể nói tìm để không khôi phục thư mục làm việc ban đầu không?


8

findkhông thể 'khôi phục thư mục làm việc ban đầu' khi chạy phía sau sudo -unếu thư mục làm việc ban đầu không hiển thị cho người dùng tìm thấy chạy như. Điều này khiến tìm thấy luôn luôn in một thông báo cảnh báo từ chối Giấy phép gây phiền nhiễu :

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

Cách tốt nhất để ngăn chặn tìm thấy in thông điệp này là gì?

Một phương pháp là thay đổi thư mục mà người dùng find có thể khôi phục, chẳng hạn như cd /trước khi chạy find. Lý tưởng nhất, tôi chỉ muốn một tùy chọn để tìm như vậy --do-not-restore-initial-working-directorynhưng tôi đoán điều đó không có sẵn. ;)

Tôi chủ yếu sử dụng các bản phân phối dựa trên RedHat.

Câu trả lời:


5

Dọn dẹp dường như là một phần không bắt buộc trong quá trình thực thi find.

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

maintrongfind.c

  cleanup ();
  return state.exit_status;
}

cleanup các cuộc gọi cleanup_initial_cwd

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

cleanup_initial_cwdthực sự thay đổi thư mục

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

Bạn có thể thử sử dụng một kịch bản shell mà cdlà vào /đầu tiên, như bạn đề nghị. (có một số vấn đề với tập lệnh này, ví dụ: nó không thể xử lý nhiều thư mục để tìm kiếm)

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

Bạn cũng có thể lọc đầu ra của stderr để xóa tin nhắn không mong muốn

#!/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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.