Dapatkah saya memberi tahu find untuk tidak mengembalikan direktori kerja awal?

8

findtidak dapat 'mengembalikan direktori kerja awal' saat dijalankan di belakang sudo -ujika direktori kerja awal tidak terlihat oleh pengguna. Hal ini menyebabkan menemukan untuk selalu mencetak pesan peringatan ditolak Izin yang mengganggu :

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

Apa cara terbaik untuk mencegah find dari mencetak pesan ini?

Salah satu metode adalah mengubah ke direktori yang dapat ditemukan oleh pengguna temukan, seperti cd /, sebelum menjalankan find. Idealnya, saya hanya ingin opsi untuk menemukan seperti --do-not-restore-initial-working-directorytetapi saya kira itu tidak tersedia. ;)

Saya kebanyakan menggunakan distribusi berbasis RedHat.

Rekomendasi Quinn
sumber

Jawaban:

5

Pembersihan tampaknya menjadi bagian non-opsional dari eksekusi find.

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

di maindalamfind.c

  cleanup ();
  return state.exit_status;
}

cleanup panggilan cleanup_initial_cwd

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

dan cleanup_initial_cwdsebenarnya mengubah direktori

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

Anda dapat mencoba menggunakan skrip shell yang cdmenjadi yang /pertama, seperti yang Anda sarankan. (ada beberapa masalah dengan skrip ini, misalnya, tidak dapat menangani beberapa direktori untuk mencari, misalnya)

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

Anda juga dapat memfilter output stderr untuk menghapus pesan yang tidak diinginkan

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