Bir sudo find` komutunda, `-exec` komutunun normal kullanıcı olarak çalıştırıldığından nasıl emin olabilirim?


10

Aşağıdaki komutu komut process_pathsdosyası yükseltilmiş ayrıcalıklar altında çalıştırılmayacak şekilde çalışmaya çalışıyorum . Bunu yapmanın bir yolu var mı?

sudo find /path/ -exec process_paths '{}' \+

Burada /path/normal kullanıcı için okuma izni olmayan bazı dosyalar var. Betiğin process_pathssadece yollara ihtiyacı vardır.


... -exec sudo -u user process_paths {} \+
Satō Katsura

@SatoKatsura bazen bu ile başarısız sudo: unable to execute /usr/bin/perl: Argument list too long: /
pii_ke

1
Evet, find içindeki SUDO_COMMANDdeğişken hakkındaki nota bakın . . [^.] * tipi f -print0 | xargs -0 sudo chmod 664; çalışmıyor
Stéphane Chazelas

2
İsterseniz -execkomutlar kullanıcı olarak çağrılacak, neden kaçıyorsunuz findkullanarak sudoilk etapta?
marcelm

2
@marcelm Sanırım sorunun son cümlesi size cevap veriyor.
Hey

Yanıtlar:


16

Onu destekleyen sistemlerde (GNU ve diğer birkaç tane) şunları yapabilirsiniz:

sudo find /path/ -print0 | xargs -r0 process_paths

xargsaltında çalıştırılmaz sudo, bu yüzden orijinal uids / gids ve aynı zamanda orijinal ortam (daha büyük anlamda) tarafından değiştirilir sudo.

process_pathsbağlı (gerçi değiştirilen kadar biter stdin'i xargsuygulanması, bu açık olduğunu /dev/nullveya hisselerin pipegelen sudo/ ' find.

Ki (GNU önlemek için xargsve benzeri kabuklar ksh, zshya basho destek süreci ikamesi), bunu yapabilirsiniz:

xargs -r0a <(sudo find /path/ -print0) process_paths

İle zsh:

sudo zsh -c '
   files=(/path/**/*(D))
   USERNAME=$SUDO_USER
   autoload zargs
   zargs $files -- process_paths'

'De zsh, $USERNAMEözel değişkene bir kullanıcı adı atamak , uids, gids öğelerini, kullanıcı veritabanındaki karşılık gelen kullanıcının yaptığı gibi ayarlar sudo -u "$SUDO_USER".

Şunları yapabilirsiniz:

 sudo sh -c '
   exec find /path/ -exec sudo -u "$SUDO_USER" process_paths {} +'

Ancak sudo, bir $SUDO_COMMANDortam değişkenini (bağımsız değişkenlerin boşluklarla birleştirilmesini içeren) geçtiği için process_paths, dosya listesi iki kez iletilir ve process_pathsbu da büyük bir alan varsa maksimum args + env boyutundaki sınıra ulaşılacağı anlamına gelir. dosya sayısı.

Çoğu suuygulamada şunları yapabilmeniz gerekir:

 sudo sh -c '
   exec find /path/ -exec su "$SUDO_USER" -c '\''
     exec "$0" "$@"'\'' process_paths {} +'

gerçi suaynı konuya sahip değil.


1

Şunları kullanabilirsiniz sudo:

sudo find <directory> -exec sudo -u <normal_user> <command> {} \;

Ancak bir yorumda belirtildiği gibi, {} sudo için çok uzunsa görünüşte başarısız olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.