এই উত্তরটি কিছুটা দেরিতে আসতে পারে তবে আমার একই সমস্যা হয়েছে এবং গ্রহণযোগ্য উত্তরটি আমার পক্ষে যথেষ্ট সন্তুষ্ট বলে মনে হয় না, তাই আমি আরও কিছুটা তদন্ত করেছিলাম।
আমার বিরক্ত যে ছিল $0
বা $PROGRAM_NAME
সত্যিই কি ব্যবহারকারী সম্পর্কে সঠিক তথ্য রাখা হয়নি টাইপ করা । যদি আমার রুবি স্ক্রিপ্টটি কোনও PATH ফোল্ডারে থাকে এবং ব্যবহারকারী নির্বাহযোগ্য নাম প্রবেশ করায় (যেমন কোনও পথের সংজ্ঞা যেমন ./script
বা না /bin/script
), এটি সর্বদা মোট পথে প্রসারিত হবে।
আমি ভেবেছিলাম এটি একটি রুবির ঘাটতি, তাই পাইথন এবং সেখানে আমার চাগ্রিনের সাথেও আমি একই চেষ্টা করেছি, এটি কোনও আলাদা নয়।
একটি বন্ধু আমাকে সন্ধান করার জন্য একটি হ্যাক প্রস্তাব real thing
করেছিল /proc/self/cmdline
, এবং ফলাফলটি ছিল: [ruby, /home/danyel/bin/myscript, arg1, arg2...]
(নাল-চর দ্বারা পৃথক)। এখানকার খলনায়ক হ'ল execve(1)
এটি যখন কোনও অনুবাদকের কাছে পৌঁছে দেয় তখন মোট পাথের পথটি প্রসারিত করে।
সি প্রোগ্রাম উদাহরণ:
extern char** environ;
int main() {
char ** arr = malloc(10 * sizeof(char*));
arr[0] = "myscript";
arr[1] = "-h";
arr[2] = NULL;
execve("/home/danyel/bin/myscript", arr, environ);
}
আউটপুট: `ব্যবহার: / হোম / ড্যানিয়েল / বিন / ম্যাসক্রিপ্ট ফাইল ...
এটি প্রমাণ করার জন্য যে এটি সত্যই কোনও execve
জিনিস এবং বাশ থেকে নয়, আমরা একটি ডামি ইন্টারপ্রেটার তৈরি করতে পারি যা এতে প্রেরিত যুক্তিগুলি ছাপানো ছাড়া কিছুই করে না:
// interpreter.c
int main(int argc, const char ** argv) {
while(*argv)
printf("%s\n", *(argv++));
}
আমরা এটি সংকলন করে একটি পাথ ফোল্ডারে রেখেছি (বা শেবাংয়ের পরে পুরো পথটি রেখেছি) এবং এতে একটি ডামি স্ক্রিপ্ট তৈরি করি ~/bin/myscript/
Hi there!
এখন, আমাদের main.c এ:
extern char** environ;
int main() {
char ** arr = malloc(10 * sizeof(char*));
arr[0] = "This will be totally ignored by execve.";
arr[1] = "-v";
arr[2] = "/var/log/apache2.log";
arr[3] = NULL;
execve("/home/danyel/bin/myscript", arr, environ);
}
সংকলন এবং চলমান ./main
: দোভাষী / হোম / ড্যানিয়েল / বিন / মাইক্রিপ্ট -v /var/log/apache2.log
সম্ভবত এটির পিছনে কারণটি হ'ল যদি স্ক্রিপ্টটি আপনার পাঠ্যপথের মধ্যে থাকে এবং পুরো পথটি সরবরাহ না করা হত , দোভাষী অনুবাদক এটিকে একটি No such file
ত্রুটি হিসাবে স্বীকৃতি দেবেন যা আপনি যদি করেন তবে: ruby myrubyscript --options arg1
এবং আপনি সেই স্ক্রিপ্টটির ফোল্ডারে নেই ।