Saya mencoba membuat perintah berikut berfungsi dengan cara agar process_paths
skrip tidak dijalankan di bawah hak istimewa yang ditinggikan. Apakah ada cara untuk melakukan ini?
sudo find /path/ -exec process_paths '{}' \+
Di sini /path/
ada beberapa file yang tidak memiliki izin baca untuk pengguna normal. Script process_paths
hanya membutuhkan path.
... -exec sudo -u user process_paths {} \+
sudo: unable to execute /usr/bin/perl: Argument list too long
: /SUDO_COMMAND
variabel dalam find. . [^.] * -type f -print0 | xargs -0 sudo chmod 664; tidak bekerja-exec
perintah dipanggil sebagai pengguna Anda, mengapa Anda menjalankanfind
menggunakansudo
di tempat pertama?Jawaban:
Pada sistem yang mendukungnya (GNU dan beberapa lainnya), Anda dapat melakukan:
xargs
tidak berjalan di bawahsudo
, sehingga masih memiliki uids / gids asli dan juga lingkungan asli (dalam arti yang lebih besar), bukan yang dimodifikasi olehsudo
.process_paths
stdin akhirnya dimodifikasi (tergantung padaxargs
implementasinya, terbuka/dev/null
atau berbagipipe
darisudo
/find
.Untuk menghindarinya (dengan GNU
xargs
dan shells likeksh
,zsh
ataubash
substitusi proses dukungan), Anda dapat melakukan:Dengan
zsh
:Di
zsh
, menugaskan nama pengguna ke$USERNAME
variabel khusus, mengatur uids, gids ke pengguna yang sesuai dalam database pengguna seperti yangsudo -u "$SUDO_USER"
akan dilakukan.Anda bisa melakukannya:
Tetapi karena
sudo
melewati$SUDO_COMMAND
variabel lingkungan (yang berisi rangkaian argumen dengan spasi) keprocess_paths
, daftar file akhirnya diteruskan dua kaliprocess_paths
yang berarti batas pada ukuran maksimum args + env kemungkinan akan tercapai jika ada besar jumlah file.Dengan sebagian besar
su
implementasi, Anda harus dapat melakukan:meskipun karena
su
tidak memiliki masalah yang sama.sumber
Anda bisa menggunakan
sudo
:Tetapi seperti yang dikatakan dalam komentar, itu bisa gagal jika {} terlalu panjang untuk sudo.
sumber