ලිනක්ස් හි කිසියම් ඩිරෙක්ටරියක් යටතේ ක්‍රියාත්මක කළ හැකි ගොනු පමණක් සොයා ගන්නේ කෙසේද?


175

ලිනක්ස් හි කිසියම් ඩිරෙක්ටරියක් යටතේ ක්‍රියාත්මක කළ හැකි ගොනු පමණක් සොයා ගන්නේ කෙසේද?


මෙන්න එක්තරා ආකාරයක BASH ස්ක්‍රිප්ට් එකක්, එය නරක දෙයක් නොවේ මට කිව හැකි දේ :) stackoverflow.com/a/20209457/2067125
AjayKumarBasuthkar

සම්මත fileවිධානය භාවිතා කිරීම ගැන කුමක් කිව හැකිද?
බ්‍රේක්ට්‍රෝ

5
මැක් මත මෙය කිරීමට කැමති ඕනෑම අයෙකුට (OS X 10.9.5 හි පරීක්ෂා කර ඇත): ls -l | egrep '^[^d]..x..x..x.*$' ඉහත දැක්වෙන්නේ වත්මන් ඩිරෙක්ටරියේ ඇති සියලුම ක්‍රියාත්මක කළ හැකි දේ (සියල්ලන්ටම / පරිශීලකයාට සහ කණ්ඩායමට) ලැයිස්තුගත කිරීමයි. සටහන : -executableවිකල්පය මැක් මත ක්‍රියා නොකරයි, එබැවින් ඉහත ක්‍රියාකාරීත්වය.
techfoobar


1
chtechfoobar: ප්‍රශ්නය අපැහැදිලි ය: එයින් අදහස් කරන්නේ ක්‍රියාත්මක කළ හැකි කේත අඩංගු ලිපිගොනු ද, නැතහොත් එයින් අදහස් කරන්නේ ක්‍රියාත්මක කළ හැකි අවසර ඇති ගොනු ද? නමුත් ක්‍රියාත්මක කළ හැකි අවසරය අවශ්‍ය යැයි අපි උපකල්පනය කළත් (ප්‍රතිචාර වලින් බහුතරයක් පෙනෙන පරිදි), ප්‍රශ්නය ලෝක ක්‍රියාත්මක කළ හැකි යැයි නොකියයි . ඔබගේ විසඳුම මගින් ලෝක ක්‍රියාත්මක කිරීමට අවසර ඇති ලිපිගොනු (සහ ෆිෆෝස්, සොකට්, සිම්ලින්ක්, ආදිය) සොයාගනු ඇත, නමුත් 750 ( -rwxr-x---) නොවේ, එය සමහර පරිශීලකයින්ට තවමත් ක්‍රියාත්මක කළ හැකිය.
ජී-මෑන් පවසන්නේ 'මොනිකා නැවත

Answers:


173

ක්‍රියාත්මක කළ හැකි ලිපිගොනු පරීක්ෂා කිරීම -perm(නිර්දේශ නොකෙරේ) හෝ -executable(නිර්දේශිතයි, එය ACL සැලකිල්ලට ගන්නා බැවින්). -executableවිකල්පය භාවිතා කිරීමට :

find <dir> -executable

ඔබට සෙවිය හැකි ගොනු පමණක් නොව සෙවිය හැකි නාමාවලි සොයා ගැනීමට අවශ්‍ය නම්, මේවා සමඟ ඒකාබද්ධ කරන්න -type f:

find <dir> -executable -type f

24
ෂෙබාං යනු ඒවා ක්‍රියාත්මක කළ හැකි යැයි අදහස් නොවේ. එය අපට පවසන්නේ කුමන පරිවර්තකය භාවිතා කළ යුතුද යන්න පමණි. සහ ලිනක්ස් අර්ථ දැක්වීම අනුව “ක්‍රියාත්මක කළ හැකි ගොනු” යනු ක්‍රියාත්මක කළ හැකි (x) බිට් කට්ටලය සහිත ගොනු වේ
knittl

3
-Type සඳහා එම වර්ගයට සහය දක්වන සොයාගැනීමේ අනුවාදය කුමක්ද? මිනිසා මගේ පද්ධතියේ b, c, d, p, f, l, s සහ D ලැයිස්තු සොයා ගනී.
innaM

7
ඔබ සතුව පැරණි සොයාගැනීමේ අනුවාදයක් තිබේ නම් (බොහෝ විට 4.3.8 ට පෙර) -එය භාවිතයෙන් සොයාගත නොහැකි විය. -perm / u = x, g = x, o = x.
ලුඩ්විග් වෙයින්සියර්


10
find: invalid predicate -executable'on RHEL
SSH මේ

37

සොයා -permගැනීමේ විකල්පය භාවිතා කරන්න . මෙමඟින් වත්මන් නාමාවලියෙහි ඒවායේ හිමිකරු විසින්, කණ්ඩායම් සාමාජිකයන් හෝ වෙනත් අය විසින් ක්‍රියාත්මක කළ හැකි ලිපිගොනු සොයා ගනු ඇත:

find . -perm /u=x,g=x,o=x

සංස්කරණය කරන්න:

අවම වශයෙන් GNU හි ඇති තවත් විකල්පයක් මට හමු විය 4.4.0:

find . -executable

ACLs ද සලකනු ලබන බැවින් මෙය ඊටත් වඩා හොඳින් ක්‍රියා කළ යුතුය.


2
මෙය ක්‍රියාත්මක වන්නේ සොයාගැනීමේ නවතම අනුවාදයක පමණි. CentOS සමඟ පෙරනිමියෙන් එන දෝෂය find: invalid mode / u = x, g = x, o = x'`
davr

12
එවිට ඔබ GNU හි දැන් අතහැර දමා ඇති "-perm +" අනුවාදය උත්සාහ කළ යුතුය: සොයා ගන්න. -perm +111 "
innaM

-perm /111වඩාත්ම අතේ ගෙන යා හැකි අනුවාදය විය හැකි බව පෙනේ .
ස්කොට්

21

ප්‍රශ්නයේ විශේෂයෙන් ලිනක්ස් ගැන සඳහන් වන බව මම දනිමි, නමුත් එය ගූගල් හි පළමු ප්‍රති result ලය බැවින් මට අවශ්‍ය වූයේ මා සොයන පිළිතුර එක් කිරීමට ය (උදාහරණයක් ලෙස ඔබ නම් - මේ මොහොතේ මා වැනි - ඔබේ සේවායෝජකයා විසින් GNU නොවන භාවිතා කිරීමට බල කරයි / ලිනක්ස් පද්ධතිය).

මත පරීක්ෂා macOS 10.12.5

find . -perm +111 -type f

1
RHEL 5 හි ද ක්‍රියා කරයි.
හෝසේ ටොමස් ටොසිනෝ

OS X 10.14, thx
ජස්ටින්

කාර්යබහුල පෙට්ටියක් සොයා ගැනීමේදී මෙය අවශ්‍ය විය. ක්‍රියාත්මක කළ නොහැකි විය. -perm +111පරිපූර්ණයි.
jmcarter9t

4

මට තවත් ප්‍රවේශයක් ඇත, ඔබට සැබවින්ම අවශ්‍ය වන්නේ ක්‍රියාත්මක කළ හැකි ලිපිගොනු සමඟ යමක් කිරීම පමණි - සහ එය පෙරීමට සොයා ගැනීමට බල කිරීම අවශ්‍ය නොවේ:

for i in `find -type f`; do [ -x $i ] && echo "$i is executable"; done

මම මෙය වඩාත් කැමති වන්නේ එය -executableවේදිකාවට විශේෂිත වූ දේ මත රඳා නොපවතින බැවිනි ; එය -permතරමක් චාම්, ටිකක් වේදිකා විශේෂිත වූවක් මත රඳා නොපවතින අතර ඉහත ලියා ඇති පරිදි ගොනුව සෑම කෙනෙකුටම ක්‍රියාත්මක කළ හැකි වේ (ඔබ පමණක් නොවේ).

මෙම -type f* nix බහලුම් traversable විය ක්රියාත්මක විය යුතු අතර, විමසුම වඩාත් වැදගත් වන්නේ මේ වසරේදී තමයි findඔබේ විධාන වනු ඇත තව තවත් මතකය, කාර්යක්ෂම, විධාන.

කෙසේ වෙතත්, වෙනත් ප්‍රවේශයක් ඉදිරිපත් කරන්න, මන්ද * නික්ස් යනු බිලියනයක ප්‍රවේශයක භූමියයි.


(0) ඔබ කැමති, චාම් සහ නිවැරදි හෝ බුද්ධිමය හා දෝෂ සහිතද? මම කැමතියි නිවැරදි දේට. (1)  innaM හි පිළිතුර , විශේෂාංග කරමින් find -perm, ඕනෑම ක්‍රියාත්මක කිරීමේ අවසර පත්‍ර කට්ටලයක් ඇති ගොනු සොයා ගනී . (2) ඊට වෙනස්ව, මෙම පිළිතුර සොයා ගන්නේ වත්මන් පරිශීලකයාට අවසර ලබා දී ඇති ගොනු පමණි. ඇත්ත වශයෙන්ම, OP ට අවශ්‍ය වන්නේ එය විය හැකි නමුත් එය අපැහැදිලි ය. … (ඉදිරියට)
ස්කොට්

(Cont'd) ... (3) පැහැදිලි බව, ඔබ වෙනස් කිරීම සඳහා අවශ්ය විය හැකි `…`කිරීමට $(…)බලන්න - මෙම , මෙම සහ මෙම . (4) එහෙත් එසේ නොකරන්න for i in $(find …); do …; අවකාශය (ය) අඩංගු ගොනු නාම මත එය අසමත් වේ. ඒ වෙනුවට කරන්න find … -exec …. (5) තවද, ඔබ ෂෙල් විචල්‍යයන් සමඟ වැඩ කරන විට, සෑම විටම ඒවා (ද්විත්ව උපුටා දැක්වීම් වලින්) උපුටා දක්වන්න, ඔබට එසේ නොකිරීමට හොඳ හේතුවක් නොමැති නම් සහ ඔබ කරන්නේ කුමක්දැයි ඔබ දන්නා බව ඔබට විශ්වාසයි.
ස්කොට්

ස්කොට් හරි, මම නිවැරදිව සිටිමි :) මම -permතර්කය කියෙව්වේ මේ තුනම අවශ්‍ය බව මිස ඒවායින් එකක් නොවේ. එසේම, ෂෙල් තර්ක ආරක්ෂා කිරීම සඳහා වූ ආදානයට ස්තූතියි, මම නොදැන සිටි සියල්ල එයයි.
මාර්ක් මැකේනා

ArkMarkMcKenna ඔබට එහි යතුරු ලියනය තිබේ: for i in සොයා ගන්න. -type f ; do [ -x $i ] && echo "$i is executable"; done; මම තිතක් (.) භාවිතා කරන <dir> කොටස ඔබට මග
හැරී ඇත

3

ක්‍රියාත්මක කළ හැකි යැයි සලකුණු කරන ලද ගොනුවක් ක්‍රියාත්මක කළ හැකි හෝ පැටවිය හැකි ගොනුවක් හෝ වස්තුවක් නොවිය යුතුය.

මෙන්න මම භාවිතා කරන දේ:

find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
    case "$(head -n 1 "$1")" in
      ?ELF*) exit 0;;
      MZ*) exit 0;;
      #!*/ocamlrun*)exit0;;
    esac
exit 1
' sh {} \; -print

2
මෙය කරන්නේ කුමක්ද?
ඩර්මයික්

Er ඩර්මයික්, .so ගොනු ඇතුළුව වත්මන් ඩිරෙක්ටරියේ ක්‍රියාත්මක කළ හැකි එක් ක්‍රමයක් වන අතර, ගොනුවක් ක්‍රියාත්මක කළ හැකි ලෙස සලකුණු නොකළද එය සොයාගත හැකිය.
අජේකුමාර් බාසුත්කාර්

හොඳයි, මම, අදහස් ආකාරය එය කරන්නේ කෙසේද?
ඩර්මයික්

එය සොයා ගැනීමට ගොනුවේ ශීර්ෂයෙන් කියවනු ලැබේ, සෑම ද්විමය ගොනුවකට හෝ ස්ක්‍රිප්ට් ගොනුවකටම ශීර්ෂයක් ඇත.
අජේකුමාර් බාසුත්කාර්

1
මම දැඩි ලෙස එකඟ නොවෙමි. ක්‍රියාත්මක කළ හැකි / + x ලෙස සකසා ඇති ගොනු මොනවාදැයි @OP විමසුවේ නැත, නමුත් ඇත්ත වශයෙන්ම ක්‍රියාත්මක කළ හැකි ගොනු මොනවාද? එහි තේරුම අර්ථ දැක්වීම පා portrait.pnger කයාට ඉතිරිව ඇත, නමුත් ධජය මඟ හැරීම සඳහා අහම්බෙන් වෙනස් කළද, ක්‍රියාත්මක කළ හැකි a+xයැයි මම /usr/bin/grepනොසිතමි x.
Torque

1

එක් ලයිනර් රසිකයෙක් ලෙස ...

find /usr/bin -executable -type f -print0 | xargs file | grep ASCII

Find විධානයෙන් ප්‍රතිදානය ලබා ගැනීමට 'xargs' භාවිතා කිරීම (අවකාශයන් සහිත ගොනු නාම නිවැරදිව හසුරුවන බව සහතික කිරීම සඳහා print0 භාවිතා කිරීම). අප සතුව ක්‍රියාත්මක කළ හැකි ගොනු ලැයිස්තුවක් ඇති අතර ඒවා 'ගොනුව' විධානය සඳහා පරාමිතිය ලෙස අපි එකින් එක සපයන්නෙමු. ද්විමය නොසලකා හැරීම සඳහා ASCII යන පදය සඳහා grep කරන්න. කරුණාකර ඔබ කැමති ශෛලියක් (පෙර පිළිතුරු බලන්න) හෝ ඔබේ 'නික්ස් මෙහෙයුම් පද්ධතිය' සමඟ ක්‍රියා කරන දේ සමඟ සොයාගත හැකි විධානය ආදේශ කරන්න.

Root සතු ස්ක්‍රිප්ට් වල එවාල් සහිත ලිපිගොනු සොයා ගැනීමට මට ඉහත අවශ්‍ය විය, එබැවින් root පරිශීලකයා අනාරක්ෂිත පරාමිතීන් සමඟ ස්ක්‍රිප්ට් ධාවනය කරන පුද්ගලික තීව්‍රතා දුර්වලතා සොයා ගැනීමට උපකාරී වේ ...

echo -n "+ Identifying script files owned by root that execute and have an eval in them..."
find /  -not \( -path /proc -prune \)  -type f -executable -user root -exec grep -l eval {} \; -exec file {} \; | grep ASCII| cut -d ':' -f1 > $outputDir"/root_owned_scripts_with_eval.out" 2>/dev/null &

ස්ක්‍රිප්ටයේ ASCII නොවන අක්ෂර අඩංගු නම් එය ක්‍රියා නොකරනු ඇත. fileකේතන ක්‍රමය වාර්තා කරයි, එබැවින් පයිතන් පිටපතක් ලෙස වාර්තා කළ හැකිය a /usr/bin/python script, UTF-8 Unicode text executable. find ... | xargs file -b | grep -v '^ELF'ද්විමය නොවන දේ හඳුනා ගැනීමට වඩා හොඳින් ක්‍රියා කළ හැකිය.
xenoid

1

මම ~/.bashrcඅද රාත්‍රියේ ශ්‍රිතයක් නිර්මාණය කළේ ක්‍රියාත්මක කළ හැකි ගොනු පද්ධති මාවතේ නොව ඩිරෙක්ටරි සඳහා නොවේ:

# Quickly locate executables not in the path
xlocate () {
    locate -0r "$1" | xargs -0 -I{} bash -c '[[ -x "$1" ]] && [[ ! -d "$1" ]] \
        &&  echo "executable: $1"'  _  {}
} # xlocate ()

වාසිය නම් එය findතත්පර 15 ක් තුළ ලිනක්ස් ඩිස්ට්‍රෝස් තුනක් සහ වින්ඩෝස් ස්ථාපනය සෙවීමයි .

උදාහරණයක් වශයෙන්:

$ time xlocate llocate
executable: /bin/ntfsfallocate
executable: /home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/bin/ntfsfallocate
executable: /mnt/clone/home/rick/restore/mnt/e/bin/llocate
executable: /mnt/clone/usr/bin/fallocate
executable: /mnt/e/bin/llocate
executable: /mnt/old/bin/ntfsfallocate
executable: /mnt/old/usr/bin/fallocate
executable: /usr/bin/fallocate

real    0m0.504s
user    0m0.487s
sys     0m0.018s

නැතහොත් සම්පූර්ණ නාමාවලියක් සඳහා සහ එහි සියලුම උප:

$ time xlocate /mnt/e/usr/local/bin/ | wc -l
65

real    0m0.741s
user    0m0.705s
sys     0m0.032s

මම භාවිතා කරන විසඳුම මෙයයි. ඉතා කාල-කාර්යක්ෂම, මම එය දැමීමට හැකි වීමට කැමතියි ~/.bashrc.
bballdave025
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.