স্ক্রিপ্টগুলি কার্যকর হিসাবে নির্ধারিত না হয়েও চালানো যেতে পারে?


25

আমি স্ক্রিপ্টগুলি (.sh) চালানো এবং এগুলি নির্বাহযোগ্য হিসাবে সেট না করেই চালাতে পারি। তাহলে ঠিক এই বিষয়টি কোথায়?

উত্তর:


24

আসুন ধরে নেওয়া যাক আপনার কাছে myscriptনিম্নলিখিত ফাইল রয়েছে:

#!/bin/bash
echo "Hello, World!"

আপনি যদি এই ফাইলটিকে এক্সিকিউটেবল বানান এবং এটি দিয়ে চালনা করেন ./myscriptতবে কার্নেলটি দেখতে পাবে যে প্রথম দুটি বাইট রয়েছে #!, যার অর্থ এটি একটি স্ক্রিপ্ট-ফাইল। এর পরে কার্নেল বাকী রেখাটি দোভাষী হিসাবে ব্যবহার করবে এবং ফাইলটিকে তার প্রথম আর্গুমেন্ট হিসাবে পাস করবে। সুতরাং, এটি চলে:

/bin/bash myscript

এবং বাশ ফাইলটি পড়ে এবং এতে থাকা কমান্ডগুলি কার্যকর করে।

সুতরাং, স্ক্রিপ্টটি "চালনা" করার জন্য বাশ (বা আপনার স্ক্রিপ্টের যে কোনও অনুবাদক প্রয়োজন) এর জন্য কেবল ফাইলটি পড়তে পারা দরকার।

সুতরাং, স্ক্রিপ্টগুলির জন্য, এক্সিকিউট বিট এটি সম্পাদন করতে কিছুটা সুবিধাজনক করে তোলে। যতক্ষণ বাশ কার্যকর করা যায় ততক্ষণ আপনি স্ক্রিপ্ট ফাইলের সাথে বাশকে সর্বদা আর্গুমেন্ট হিসাবে চালাতে পারেন, বা ব্যাশটিকে ইন্টারেক্টিভভাবে চালাতে পারেন এবং কমান্ডগুলি কার্যকর করতে আপনার টার্মিনালে লাইন স্ক্রিপ্ট লাইনটি অনুলিপি করতে পারেন।


বিস্তারিত ব্যাখ্যা করার জন্য ধন্যবাদ। :) যদি আমি এটি সঠিকভাবে বুঝতে পারি তবে ব্যাশের যে কোনও ব্যবহারকারীর অ্যাক্সেসের জন্য এটি চালাতে স্ক্রিপ্টটিতে কেবল অ্যাক্সেস দরকার কারণ বাশ স্ক্রিপ্টটিকে ইনপুট হিসাবে গ্রহণ করবে এবং কেবল এটি পড়তে হবে। আমি সেই ব্যবহারকারীর জন্য স্ক্রিপ্টের পড়ার অনুমতি নিয়ে এই আচরণটি থামাতে পারি। রাইট? সুতরাং কখন এই নির্বাহযোগ্য অনুমতি ব্যবহার করা হয় এবং ঠিক বিষয়টি বিবেচনা করে?
আশফাম

হ্যাঁ, আপনি যদি "ব্যাশ মাইক্রিপ্ট" ব্যবহার করেন তবে ব্যবহারকারীর কেবল "মাইক্রিপ্ট" এর জন্য পড়ার অ্যাক্সেসের প্রয়োজন (এবং অবশ্যই যদি রাস্তার মধ্যে বাশ থাকে তবে / বিন / ব্যাশের জন্য কার্যকর)। তবে, আপনি যদি আপনার স্ক্রিপ্টটিকে সম্পাদনযোগ্য করে তোলেন তবে বিষয়গুলি কিছুটা আলাদা। এটি সত্য যে কার্নেলের দৃষ্টিকোণ থেকে, প্রথম লাইনটি যদি #! / বিন / বাশ হয় তবে এটি আবার "/ বিন / বাশ ম্যাসক্রিপ্ট" হবে, তবে সেই বিন্দুতে পৌঁছতে প্রথমে আপনাকে স্ক্রিপ্টটি সম্পাদনযোগ্য হিসাবে উপস্থাপন করতে হবে ব্যবহারকারী বা গোষ্ঠী। তবে, এটি সত্য যদি কিছু ব্যবহারকারীর পক্ষে স্ক্রিপ্টটি সম্পাদনযোগ্য না হলেও পাঠযোগ্য হয়, তবে তিনি এখনও "বাশ মাইক্রিপ্ট" দিয়ে স্ক্রিপ্টটি "চালাতে" পারেন ....
LGB

@ এলজিবি এটি এতটা অকেজো। ভাল কথা হ'ল স্ক্রিপ্টটির জন্য কোনও ব্যবহারকারীর থেকে পঠন অনুমতিটি কেটে দেওয়া। রাইট?
আশফাম

@ আশফাম: আমি অকেজোের চেয়ে দরকারী বলব। নিয়মিত ফাইলগুলিতে এক্সিকিউট বিট অ্যাক্সেসকে সীমাবদ্ধ করার জন্য ব্যবহার করা হয় না (এবং কখনই এর উদ্দেশ্য ছিল না)। দেখে মনে হচ্ছে আপনি এটি থেকে আশা করছেন। আপনার যদি বাইনারি এক্সিকিউটেবল থাকে তবে এটি চালানোর জন্য আপনার অবশ্যই এটি চালানোর অনুমতি নিতে হবে। তবে, যদি আপনি এটিতে অ্যাক্সেস পড়ে থাকেন তবে আপনি সর্বদা আপনার নিজের ডিরেক্টরি ডিরেক্টরিতে ফাইলটি অনুলিপি করতে পারবেন, সেক্ষেত্রে অনুলিপিটি আপনার নিজের মালিকানাধীন হবে, যাতে আপনি এটিতে সম্পাদনের অনুমতি যুক্ত করতে পারেন ... এবং এটি চালাতে পারেন। ডিরেক্টরিগুলির জন্য যদিও এর কিছুটা ভিন্ন উদ্দেশ্য রয়েছে। Mywiki.wooledge.org/Perifications
গিরাহ

1
আমি যদি সঠিক দোভাষীটি না জানি তবে / বিন / বাশের পরিবর্তে আমার কী ব্যবহার করা উচিত? এমন কোন কমান্ড আছে যা শেবাং লাইন অনুসারে স্ক্রিপ্টটি চালায়?
আইভর

16

আপনি "শ ব্যবহার করে শেল স্ক্রিপ্ট চালাচ্ছেন" "sh ব্যবহার করে শেল স্ক্রিপ্ট চালাচ্ছেন না" তা নিশ্চিত করুন।

এতে ফাইল অনুমতি দ্বারা এটি প্রভাবিত হবে না file.sh:

sh file.sh

আপনি কার্যকর করছেন sh(যা প্রোগ্রামটির সমাধান করে /bin/sh), যা file.shএর কোডটি পড়ে এবং কার্যকর করে।

আপনি যদি সত্যই স্ক্রিপ্টটি নিজে চালিত করেন তবে ফাইল অনুমতিগুলি কার্যকর হবে :

./file.sh

নোট করুন যে ফাইল অনুমতিগুলি নন-লিনাক্স ফাইল সিস্টেমগুলি যেমন FAT দ্বারা সমর্থিত নয়। সুতরাং আপনি চালনা chmod -x file.shকরলেও ফাইলটির এটির পূর্বের অনুমতি থাকবে।

এক্সিকিউট করার অনুমতি ফাইল সিস্টেম দ্বারা প্রয়োগ করা হয়। তবে প্রোগ্রামগুলি ফাইলের বিষয়বস্তু পড়ে কোডটি "কার্যকর" করতে পারে, যা "এক্সিকিউট" -এ ফাইল সিস্টেমের অনুমতিকে বাইপাস করে।


আমি আপনার বক্তব্য বুঝতে পারি। তবে তা কি গ্রুপ বা বিশ্ব বা উভয়ের পক্ষে?
আশফাম

@ আশফেম আপনি যদি নির্বাহযোগ্য অনুমতি সেট করেন তবে স্ক্রিপ্টটি সরাসরি ব্যবহারকারীদের দ্বারা চালানো যেতে পারে যাদের সেই অনুমতি আছে - তাদের এটি কোনও গোষ্ঠী, বিশ্ব বা মালিকের ভিত্তিতে রয়েছে কিনা। এমনকি নির্বাহী অনুমতি ব্যতীত লোকেরাও মৃত্যুদণ্ড কার্যকর করতে আলাদা প্রোগ্রামে (যেমন bash) কল করে এটি কার্যকর করতে পারে - যাতে আপনাকে তাদের readঅনুমতিও নিতে হবে away
jg-faustus

If you set the executable permission, the script can be run directly by users who have that permission - whether they have it on a group, world or owner basisকিন্তু কার্যকর কার্যকর অনুমতি যাচাই করে বিভিন্ন ব্যবহারকারীকে কীভাবে অনুমতি দেওয়া হয়? এবং আমি আপনার দ্বিতীয় পয়েন্ট পেয়েছি। আপনার অর্থ হ'ল স্ক্রিপ্টের তাদের পড়ার অনুমতি কেড়ে নেওয়া যাতে তারা এমনকি এটি ব্যাশের মাধ্যমে প্রক্রিয়া করতে না পারে। রাইট?
আশফাম

@ আশফাম পঠনের অনুমতি পয়েন্টে, হ্যাঁ। কীভাবে, আপনি sudo chmod g+x myfile.shফাইলের গ্রুপের জন্য এক্সিকিউট এক্সিকিউটিস যুক্ত করতে টার্মিনালের মতো কিছু কল করবেন । দেখুন ফাইলের অনুমতি টিউটোরিয়াল । একসাথে বেশ কয়েকটি ব্যবহারকারীর জন্য অনুমতি পরিচালনা করতে আপনি গোষ্ঠী ব্যবহার করবেন, উদাহরণস্বরূপ গোষ্ঠী পরিচালনা করা
jg-faustus

আমি যখন জিইআইতে এক্সিকিউটেবল অনুমতি যুক্ত করছিলাম তখন তার অর্থ কী ছিল, তবে এটি কার জন্য? মালিক / গ্রুপ / বিশ্বের?
আশফাম

1

এটিকে এভাবে ভাববেন না। আমি কি এই ফাইলটি কার্যকর করতে পারি? এটিকে এভাবে ভাবুন: এই ফাইলটি কে কার্যকর করতে পারে?

কম্পিউটার যদি আপনার হয় এবং ফাইলটি আপনার হয় তবে আমি নিশ্চিত যে আপনি এটি কার্যকর করতে পারেন। আপনি chmod এবং chown এবং ফাইল অনুমতিগুলির মতো কমান্ডগুলি আরও দেখতে চাইতে পারেন ।

আমি আশা করি এটি সাহায্য করবে.


হ্যাঁ আমি তাদের সম্পর্কে জানি। তার অর্থ, আমি (মালিক) সর্বদা এটি সম্পাদন করতে পারি। রাইট? তাহলে এক্সিকিউটেবল হিসাবে কোনও ফাইল সেট করা গ্রুপ বা বিশ্ব বা উভয়েরই জন্য?
আশফাম

1

execলিনাক্স কার্নেলের প্রাপ্ত syscall সঙ্গে ব্যর্থ EACCESফাইলটি এক্সিকিউটেবল নয়

আপনি যখন এটি করতে পারেন sh myprog.sh(যা কেবলমাত্র ফাইলগুলি বোঝায় এবং ব্যাখ্যায় তা হ'ল), প্রোগ্রামটি ./myprog.shকাজ করতে পারে না বলে চালানোর চেষ্টা করছেন , যেহেতু আপনি এটি করেন:

এটি দিয়ে যাচাই করা যেতে পারে main.c:

#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>

int main(void) {
    char *argv[] = {"myprog", NULL};
    char *envp[] = {NULL};
    int ret;
    ret = execve("myprog.sh", argv, envp);
    perror("execve");
    printf("%d\n", errno);
    printf("%d\n", EACCES);
}

এবং myprog.sh:

#!/bin/sh
echo worked

যদি myprog.shমৃত্যুদন্ড কার্যকর না হয় তবে এতে mainব্যর্থ হন:

execve: Permission denied
13
13

উবুন্টু 17.10, এ পরীক্ষিত gcc -std=c99

পজিক্স 7 উল্লেখ করেছে যে:

Fexecve () বাদে এক্সিকিউটিভ ফাংশনগুলি ব্যর্থ হবে যদি:

[EACCES] নতুন প্রক্রিয়া চিত্রের ফাইলের উপসর্গের তালিকাভুক্ত ডিরেক্টরিটির জন্য অনুসন্ধানের অনুমতি অস্বীকার করা হয়েছে, বা নতুন প্রক্রিয়া চিত্র ফাইলটি কার্যকর করার অনুমতি অস্বীকার করে।

আরও যুক্তি এখানে পাওয়া যাবে: /security/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.