Temel bir yanlış anlaşılmayı gidermek için @ gniourf_gniourf'a şapka ucu .
Bu cevap , mevcut cevaplara genel bir bakış sağlamaya ve bunların inceliklerini ve göreceli yararlarını tartışmaya ve özellikle taşınabilirlik açısından arka plan bilgisi sağlamaya çalışır .
Yürütülebilir dosyaları bulmak, iki farklı kullanım durumuna başvurabilir :
- kullanıcı merkezli : mevcut kullanıcı tarafından yürütülebilir dosyaları bulun .
- dosya merkezli : (bir veya daha fazla) çalıştırılabilir izin biti ayarlanmış dosyaları bulun .
O Not her iki senaryoda da duyu için yapabilir kullanmakfind -L ...
yerine sadece find ...
amacıyla da bulmak için sembolik yürütülebilir .
En basit dosya merkezli durumun - TÜM üç güvenlik sorumlusu için (kullanıcı, grup, diğer) TÜMÜ için çalıştırılabilir izinler biti ayarlanmış yürütülebilir dosyaları aramak - tipik olarak , ancak mutlaka kullanıcı merkezli senaryo ile aynı sonuçları vermeyeceğini unutmayın - ve bu farkı anlamak önemlidir.
Kullanıcı merkezli ( -executable
)
Kabul edilen cevap övgüye değer bir şekilde öneriyor -executable
, IF GNU find
mevcut.
- GNU
find
En birlikte gelir Linux dağıtımlarının
- Aksine, macOS dahil BSD tabanlı platformlar, daha az güçlü olan BSD find ile birlikte gelir.
- Senaryonun gerektirdiği gibi,
-executable
yalnızca geçerli kullanıcının çalıştırabileceği dosyalarla eşleşir (uç durumlar vardır. [1] ).
BSD find
kabul cevap (sunduğu alternatif -perm +111
) bir cevap farklı , dosya -centric soru (cevap kendisi devletler gibi).
- Sadece kullanma
-perm
cevaplamak için kullanıcı -centric soruyu ise imkansız ihtiyaç duyulan şey olduğunu, çünkü ilgili dosyanın kullanıcı ve grup kimliğini geçerli kullanıcı en oysa -perm
sadece test edebilirsiniz dosyanın izinlerini.
Yalnızca POSIX find
özelliklerini kullanarak , soru harici yardımcı programları dahil etmeden yanıtlanamaz.
Bu durumda, en iyi -perm
(kendiliğinden) yapabileceği bir bir yaklaşım arasında -executable
. TÜM güvenlik sorumluları (kullanıcı, grup, diğer) için çalıştırılabilir bit setine sahip dosyaları bulmak açısından belki de olduğundan daha yakın bir yaklaşım-perm +111
-perm -111
- bu bana tipik gerçek dünya senaryosu gibi geliyor. Bir bonus olarak, POSIX uyumludur ( find -L
sembolik bağlantıları eklemek için kullanın, açıklama için aşağıya bakın):
find . -type f -perm -111 # or: find . -type f -perm -a=x
gniourf_gniourf cevabı bir sağlar gerçek, taşınabilir eşdeğeri-executable
kullanılarak-exec test -x {} \;
olsa performans pahasına .
Birleştiren -exec test -x {} \;
ile -perm +111
(yani sahip dosyalar en az bir çalıştırılabilir bit kümesi) olup performansına yardımcı olabilir exec
ileri sürülemez ihtiyacı her (şu BSD find POSIX uyumlu eşdeğer kullanan dosyası -perm +111
/ GNU bulmak -perm /111
; açıklama için daha uzağa aşağıya bakınız) :
find . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \) -exec test -x {} \; -print
Dosya merkezli ( -perm
)
- To cevap dosyası -centric soruları , ise POSIX uyumlu kullanmak için yeterli
-perm
birincil (a olarak bilinen teste GNU bulmak terminolojisinde).
-perm
sadece çalıştırılabilirliği değil, herhangi bir dosya iznini test etmenize olanak sağlar .
- İzinler, sekizlik veya sembolik mod olarak belirtilir . Sekizli modlar sekizlik sayılardır (örneğin
111
), sembolik modlar ise dizelerdir (örneğin, a=x
).
- Sembolik modlar , güvenlik sorumlularını
u
(kullanıcı), g
(grup) ve o
(diğer) olarak tanımlar veya a
üçüne de atıfta bulunur. İzin olarak ifade edilmiştir x
, örneğin, yürütülebilir, ve operatörler kullanılarak ilkeleri tahsis =
, +
ve -
; Bir için sekizlik modları dahil olmak üzere tam bir tartışma, bkz için POSIX spec chmod
yardımcı programı .
- Bağlamında
find
:
- Bir modun
-
-ug=x
önüne (örneğin ) koymak şu anlama gelir: belirtilen tüm izinlere sahip olan dosyalarla eşleştirme (ancak eşleşen dosyalar ek izinlere sahip olabilir).
- Önek YOK olması (örneğin
755
) şu anlama gelir: bu tam, tam izin kümesine sahip dosyalarla eşleştirme .
- Uyarı : Hem GNU find hem de BSD , are-of-the-belirtilen-izin-bit-kümesi mantığına sahip standart olmayan ek bir önek uygular , ancak bunu uyumsuz sözdizimi ile yapın :
- BSD bul:
+
- GNU bul:
/
[2]
- Bu nedenle, kodunuzun taşınabilir olması gerekiyorsa bu uzantılardan kaçının .
- Aşağıdaki örnekler, çeşitli dosya merkezli sorulara taşınabilir yanıtları gösterir.
Dosya merkezli komut örnekleri
Not:
- Aşağıdaki örnekler POSIX uyumludur , yani GNU find ve BSD find dahil olmak üzere herhangi bir POSIX uyumlu uygulamada çalışması gerekir; özellikle, bu şunları gerektirir:
- Standart olmayan mod önekleri
+
veya /
.
- Mantıksal işleç ön seçimlerinin POSIX biçimlerini kullanarak :
!
NOT için (GNU bul ve BSD de izin ver -not
); \!
Örneklerde !
kabuk geçmişi genişletmelerinden korunmak için kullanılan not
-a
AND için (GNU bul ve BSD de izin ver -and
)
-o
OR için (GNU bul ve BSD bul da izin ver -or
)
- Örnekler sembolik modları kullanır çünkü okunması ve hatırlanması daha kolaydır.
- Mod öneki ile
-
, =
ve +
(örneğin, operatörler birbirinin yerine kullanılabilir -u=x
eşdeğerdir -u+x
- uyguladıktan sürece -x
sonradan, ama bu yapmanın hiçbir anlamı yoktur).
,
Kısmi modlara katılmak için kullanın ; VE mantığı ima edilir; örneğin, -u=x,g=x
hem kullanıcı hem de grup çalıştırılabilir bitinin ayarlanması gerektiği anlamına gelir .
- Modlar, negatif eşleşmeyi "sadece bu bit ayarlanmadıysa eşleştir" anlamında ifade edemezler ;
-perm
NOT birincil ile ayrı bir ifade kullanmanız gerekir !
.
- Bul'un geldiğini hatırlatırız ön seçimler (örneğin
-print
, ya da -perm
; da bilinen eylemler ve testlerde GNU find in) olan örtülü katıldı -a
(mantıksal AND) ve bu -o
(aynı kaçan parantez ve muhtemelen \(
ve \)
kabuk için) uygulamaya VEYA mantık ihtiyaç vardır.
find -L ...
Sembolik bağları çalıştırılabilir dosyalar ile
find ...
eşleştirmek için sadece yerine kullanılır
-L
talimatlar sembolik bağların kendileri yerine sembolik bağların hedeflerini değerlendirmeyi bulur ; bu nedenle, olmadan -L
, -type f
sembolik bağları tamamen yok sayardı.
# Match files that have ALL executable bits set - for ALL 3 security
# principals (u (user), g (group), o (others)) and are therefore executable
# by *anyone*.
# This is the typical case, and applies to executables in _system_ locations
# (e.g., /bin) and user-installed executables in _shared_ locations
# (e.g., /usr/local/bin), for instance.
find -L . -type f -perm -a=x # -a=x is the same as -ugo=x
# The POSIX-compliant equivalent of `-perm +111` from the accepted answer:
# Match files that have ANY executable bit set.
# Note the need to group the permission tests using parentheses.
find -L . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \)
# A somewhat contrived example to demonstrate the use of a multi-principial
# mode (comma-separated clauses) and negation:
# Match files that have _both_ the user and group executable bit set, while
# also _not_ having the other executable bit set.
find -L . -type f -perm -u=x,g=x \! -perm -o=x
[1] GNU 4.4.2'den -executable
itibaren açıklaması man find
:
Yürütülebilir dosyalar ve aranabilir dizinlerle eşleşir (dosya adı çözünürlüğü anlamında). Bu, erişim kontrol listelerini ve -perm testinin yok saydığı diğer izin yapılarını hesaba katar. Bu test erişim (2) sistem çağrısını kullanır ve bu nedenle, birçok sistem istemcinin çekirdeğinde erişimi (2) uyguladığından ve bu nedenle UID eşleme (veya kök ezme) yapan NFS sunucuları tarafından kandırılabilir ve bu nedenle sunucuda tutulan UID eşleme bilgileri. Bu test yalnızca erişim (2) sistem çağrısının sonucuna dayandığından, bu testin başarılı olduğu bir dosyanın gerçekten yürütülebileceğinin garantisi yoktur.
[2] GNU , 4.5.12'den daha eski sürümlerin de öneke izin verdiğini tespit etti +
, ancak bu ilk önce kullanımdan kaldırıldı ve sonunda kaldırıldı, çünkü sembolik modlarla birleştirmek +
, kesin bir izin maskesi olarak yorumlandığından büyük olasılıkla beklenmedik sonuçlar doğurur . Eğer bir sürümüne (a) çalışma öncesinde 4.5.12 ve (b) kendinizi sınırlamak sekizlik modları sadece, sen verebilir kullanarak paçayı ile hem GNU bulup BSD Bul, ama iyi bir fikir değil.+