আপনার সম্ভবত এটি করা উচিত নয় , তবে আপনি পারেন। হাতের কাজটির জন্য কুসালানন্দের উত্তরটি উত্তম এবং বিষয়টি ব্যাখ্যা করেছে। যেহেতু আপনি বিশেষভাবে জিজ্ঞাসা করেছিলেন যে কীভাবে কোনও টার্মিনালের অভ্যন্তরে কোনও লাইব্রেরি কল ব্যবহার করা যায় , যদিও এখানে কয়েকটি উপায় ...
ক্ষুদ্র সি কম্পাইলার ( tcc
) একটি সমর্থন -run
পতাকা তাই আপনি, আপনি করতে দেয় (কার্যত) একটি ছোট প্রোগ্রাম লিখে সি কোড ব্যাখ্যা করতে যে একটি একক আবাহন মাধ্যমে টার্মিনাল ভিতরে কোনো লাইব্রেরি কল ব্যবহার।
আপনি strnlen
এই মত ফাংশন চালাতে পারেন :
$ tcc -run <(echo '#include <stdio.h>'; echo '#include <string.h>'; echo 'void main(int argc, char **argv) {printf("%i\n", strnlen(argv[1], 1024));}') "Hello world"
11
এটি বাশ, zsh এবং অন্যান্য শেল থেকে প্রক্রিয়া প্রতিস্থাপন ব্যবহার করে এমন tcc
ফাইল পড়তে দেয় যাতে সমস্ত echo
গুলি এর ফলাফল ধারণ করে ; অন্যান্য বিকল্প আছে।
আপনি এটি তৈরি করতে একটি ফাংশন তৈরি করতে পারেন:
call_library_function_s_i() {
func=$1
shift
tcc -run <(echo '#include <stdio.h>'; echo '#include <string.h>'; echo 'void main(int argc, char **argv) {printf("%i\n", '$func'(argv[1]));}') "$*"
}
$ call_library_function_s_i strlen hello world
(আমি strlen
এখানে ব্যবহার করেছি যাতে এটি একটি আনরি ফাংশন স্ট্রিং-> ইন্ট - আপনার প্রতিটি পৃথক আরটি এবং রিটার্ন টাইপের জন্য পৃথক ফাংশন প্রয়োজন)।
অন্য বিকল্প ব্যাশ প্লাগইন ত্যাভিস Ormandy, যা আপ গোপন দ্বারা এবং । আপনি যা চেষ্টা করছেন এটি সম্ভবত এটিই নিকটতম প্রায়। আপনি উদাহরণস্বরূপ ব্যবহার করতে পারেন:ctypes.sh
dlopen
dlsym
$ dlcall -r uint64 strlen "hello world"
এবং এটি প্রত্যাশা অনুযায়ী ফাংশন কল করবে।
এটি "টার্মিনাল থেকে" এটি করার সর্বাধিক প্রত্যক্ষ উপায়, তবে এটি আপনার বিতরণ প্যাকেজগুলির কিছু হওয়ার সম্ভাবনা নেই তাই আপনাকে এটি ম্যানুয়ালি ইনস্টল করতে হবে (যা অনানুষ্ঠানিক)। লোকেরা এটি সম্পর্কে কীভাবে অনুভূত হয় তার একটি সাধারণ ধারণা দেওয়ার জন্য এখানে নিজস্ব ওয়েবসাইট থেকেctypes.sh
কিছু তথ্যমূলক উদ্ধৃতি দেওয়া হয়েছে :
- "এটা বিব্রতকর"
- "এটি বন্ধ হয়ে গেছে"
- "আপনি এর সাথে অনেক দূরে চলে গেছেন"
অন্যান্য শাঁসের জন্যও একই ধরণের সরঞ্জাম থাকতে পারে তবে আমি সেগুলি সম্পর্কে জানি না। তাত্ত্বিকভাবে এমন কোনও কারণ নেই যে কোনও স্বতন্ত্র কমান্ড হতে পারে না যা সাধারণ মামলার জন্য ঠিক এটি করেছিল, তবে আমি কিছুটা অবাক হয়েছি যে আমি এটির সন্ধান করতে পারিনি ...
... তাই আমি একটি তৈরি! dlcall
কমান্ড লাইন থেকে লাইব্রেরি ফাংশনগুলিকে কল করতে দেয় :
$ dlcall strnlen "hello world" 6
$ dlcall sin 2.5
$ dlcall strchr "hello world" -c ' '
এটি ফাংশন প্রোটোটাইপগুলির একটি সীমিত সেটকে সমর্থন করে, এটি বর্তমানে মারাত্মকভাবে নির্ভরযোগ্য বা স্থিতিস্থাপক নয়, তবে এটি এখন বিদ্যমান।
আপনি উদাহরণস্বরূপ, পাইথন এবংpython -c 'import ctypes; import sys; print(ctypes.cdll.LoadLibrary("libc.so.6").strlen(" ".join(sys.argv[1:])))' hello world
এটিও ব্যবহার করতে পারেন তবে এটি অবশ্যই যাওয়ার সহজতম উপায় নয়। পার্ল, রুবি এবং অন্যান্য ভাষায় একই রকম বৈশিষ্ট্য রয়েছে যা আপনি ব্যবহার করতে পারেন।
সুতরাং আপনার প্রশ্নের উত্তরগুলি হ'ল:
- উপরোক্ত পদ্ধতির একটি ব্যবহার করুন।
- আপনি কি গ্রন্থাগার তোমাকে বুটস্ট্র্যাপ আরেকটি কমান্ড ব্যবহার করতে বা সফটওয়্যার এক টুকরা যে আপনার শেলে আঙ্গুলসমূহ প্রয়োজন।
সব মিলিয়ে আপনি অন্য যে কোনও উপায়ে এটি করা থেকে প্রায় নিশ্চিতই ভাল।