শেল থেকে লাইব্রেরি কমান্ডগুলি কীভাবে কার্যকর করা যায়?


27

আমি কেবল একটি স্ট্রিংয়ের দৈর্ঘ্য গণনা করতে চেয়েছিলাম (এটি হ্যাশ মান)। সুতরাং, আমি টার্মিনালটি খুললাম এবং এটি করেছি:

$ apropos length

যা আমাকে শেষ পর্যন্ত কমান্ড / ফাংশনগুলি দিয়েছিল (3)বা (3ssl)সেগুলি শেষে যুক্ত করেছে। এখন মানুষ আমাদের এগুলির section numbersঅর্থ কী তা সম্পর্কে তথ্য দেয় ।

3   Library calls (functions within program libraries)

কৌতূহলের বাইরে আমি এই সমস্ত কমান্ড দিয়ে চেষ্টা করেছি (আশা করি কমপক্ষে একটি কাজ করবে)

strcspn (3)          - get length of a prefix substring
strlen (3)           - calculate the length of a string
strnlen (3)          - determine the length of a fixed-size string
strspn (3)           - get length of a prefix substring
wcslen (3)           - determine the length of a wide-character string
wcsnlen (3)          - determine the length of a fixed-size wide-character string

এবং প্রতিটি কমান্ডের জন্য একই ত্রুটি ছাড়া আর কিছুই পেল না

$ strnlen HelloWorld 
$ strnlen: command not found

ওয়েল, আমি জানি কিভাবে শেল মধ্যে স্ট্রিং এর দৈর্ঘ্য এটি ব্যবহার wc -m, expr lengthএবং অন্যান্য সমাধান নীচে উপস্থিত।

তবে, আমার এখানে দুটি প্রশ্ন রয়েছে:

  1. কিভাবে ব্যবহার কোনোlibrary calls (3) শেল ভিতরে?
  2. কীভাবে কেবল লাইব্রেরি কলগুলি এবং অন্যান্য কমান্ডগুলি ব্যবহার করে স্ট্রিংয়ের দৈর্ঘ্য গণনা করবেন?

দ্রষ্টব্য: প্রশ্নটি সাধারণভাবে library callsএবং শেলের মধ্যে তাদের ব্যবহারগুলিকে কেন্দ্র করে। এটি প্রথম প্রশ্নের উত্তরকে আরও গুরুত্বপূর্ণ করে তোলে।



4
মূলত, মাইকের উত্তরটি দুর্দান্ত হ্যাক হলেও এর সরল উত্তরটি: আপনি দেবেন না। লাইব্রেরি কলগুলি শেলের সাথে সম্পর্কিত নয় । এগুলি সি ভাষায় প্রোগ্রাম লেখার জন্য ব্যবহৃত হয়। - আরও সাধারণভাবে, ম্যানপেজগুলি পড়ার সময়, আপনি যদি কোনও প্রোগ্রাম কোড করে না দেখেন, কেবল বিভাগ 2, 3 এবং 9 উপেক্ষা করুন
বর্ণালী

অফ টপিক, তবে ওপেনভিএমএস-এর "লেজিকাল" ফাংশন রয়েছে যা সিস্টেম লাইব্রেরির ফাংশনগুলির শেল ইন্টারফেসগুলি।
রনজহান

উত্তর:


39

আপনার সম্ভবত এটি করা উচিত নয় , তবে আপনি পারেন। হাতের কাজটির জন্য কুসালানন্দের উত্তরটি উত্তম এবং বিষয়টি ব্যাখ্যা করেছে। যেহেতু আপনি বিশেষভাবে জিজ্ঞাসা করেছিলেন যে কীভাবে কোনও টার্মিনালের অভ্যন্তরে কোনও লাইব্রেরি কল ব্যবহার করা যায় , যদিও এখানে কয়েকটি উপায় ...


ক্ষুদ্র সি কম্পাইলার ( 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.shdlopendlsym

$ 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 এটিও ব্যবহার করতে পারেন তবে এটি অবশ্যই যাওয়ার সহজতম উপায় নয়। পার্ল, রুবি এবং অন্যান্য ভাষায় একই রকম বৈশিষ্ট্য রয়েছে যা আপনি ব্যবহার করতে পারেন।


সুতরাং আপনার প্রশ্নের উত্তরগুলি হ'ল:

  1. উপরোক্ত পদ্ধতির একটি ব্যবহার করুন।
  2. আপনি কি গ্রন্থাগার তোমাকে বুটস্ট্র্যাপ আরেকটি কমান্ড ব্যবহার করতে বা সফটওয়্যার এক টুকরা যে আপনার শেলে আঙ্গুলসমূহ প্রয়োজন।

সব মিলিয়ে আপনি অন্য যে কোনও উপায়ে এটি করা থেকে প্রায় নিশ্চিতই ভাল।


2
"dlcall" উইন্ডোজের "rundll" সম্পর্কে মনে করিয়ে দেয়: সমর্থন.
microsoft.com/en-gb/help/164787/…

1
@ পিজেসি 50: পাবলিক সার্ভিস ঘোষণা: rundll32 স্বেচ্ছাসেবী ফাংশনগুলি কল করার জন্য সাধারণ উদ্দেশ্য সরঞ্জাম নয় । এটি কেবলমাত্র একটি স্বাক্ষর সহ ফাংশনগুলিতে কল করতে ব্যবহৃত হতে পারে। এছাড়াও, এটি ভয়াবহ ভবিষ্যতের প্রমাণ নয়
কেভিন

29

aproposকমান্ড নানাভাবে উপকারী, তবে এটি আপনাকে "আবর্জনা" অনেকটা খুব দিতে পারে। আপনি তালিকাভুক্ত বেশিরভাগ জিনিস সি লাইব্রেরির রুটিন (এটি ম্যানুয়ালটির 3 নং অংশের জন্য) যা আপনি সরাসরি শেল থেকে ব্যবহার করতে পারবেন না।

এগুলি ব্যবহার করতে, আপনাকে সি প্রোগ্রাম লিখতে হবে যা তাদের কল করে। এটি এই নির্দিষ্ট সাইট দ্বারা আচ্ছাদিত বিষয়গুলির সীমার বাইরে রয়েছে (এটি স্ট্যাকওভারফ্লোতে বিষয় হবে )।

এগুলি হ'ল আপনার প্রশ্নের উত্তর:

  1. আপনি পারবেন না, এগুলি সি লাইব্রেরির রুটিন।
  2. আপনি পারবেন না, যদি না আপনি কোনও সি প্রোগ্রাম না লিখে থাকেন।

আমি জানি আপনি এটি জানেন তবে সম্পূর্ণতার জন্য: শেলটিতে আপনার যদি ভেরিয়েবলের স্ট্রিং থাকে তবে stringআপনি এটি করতে পারেন

string='hello world'
printf 'Length of string "%s" is %d\n' "$string" "${#string}"

এটি Length of string "hello world" is 11টার্মিনালে মুদ্রণ করবে যেখানে 11আসে সেখান থেকে ${#string}স্ট্রিংয়ের দৈর্ঘ্যে প্রসারিত হয় $string

অভ্যন্তরীণভাবে, শেলটি আপনার দৈর্ঘ্যের গণনা করতে তালিকাভুক্ত লাইব্রেরি কলগুলির একটি হতে পারে।

শেলের শেল ভেরিয়েবলের মধ্যে স্ট্রিংয়ের দৈর্ঘ্য পাওয়ার এটি সবচেয়ে কার্যকর উপায়।

নোট খুব যে ${#string}হয় একটি POSIX শেল প্যারামিটার সম্প্রসারণ , এটা সেইজন্য সমস্ত শাঁস POSIX সম্মতি কোন ডিগ্রী দাবি করে যে মধ্যবর্তী পোর্টেবল।


লাইব্রেরির ফাংশনগুলির অংশগুলি একটি ভাল ব্যাখ্যা, তবে এই উত্তরটির বাকি অংশটি কিছুটা বিভ্রান্তিকর। ওপি বলেছেন "আমি কেবল একটি স্ট্রিংয়ের দৈর্ঘ্য গণনা করতে চেয়েছিলাম" এখানে ব্যবহার করার দরকার printfনেই। আপনি যদি বাক্যের অংশ হিসাবে এটি মুদ্রণ করতে চান তবে এটি সর্বোত্তম উপায় হতে পারে। তবে "আমি কীভাবে একটি স্ট্রিংয়ের দৈর্ঘ্য পেতে পারি?" এই প্রশ্নের উত্তর? হয় ${#string}অংশ, না printf,। আপনি কেবলমাত্র echo ${#string}দৈর্ঘ্যটি আউটপুট string_length=${#string}করতে চান বা আপনি যা চান তার সাথে অন্য কোনও ভেরিয়েবলের কাছে এটি নির্ধারণ করতে পারেন। প্রিন্টফ সত্যই প্রাসঙ্গিক নয়
আদম

1
@ অ্যাডাম আমি উত্তরে ছোট ছোট পরিবর্তন করেছি। আমি মনে করি এটি স্ট্রিংয়ের দৈর্ঘ্য কীভাবে পাওয়া যায় এবং ব্যবহারকারী ইতিমধ্যে বলেছে যে এটি কীভাবে করা যায় সে সম্পর্কে এটি স্পষ্ট clear দ্বারা ব্যবহার সঙ্গে স্ট্রিং এর দৈর্ঘ্য printfআমি শুধু "ব্যবহার বলার অপেক্ষা রাখে না ছাড়া অন্য কিছু যোগ ${#string}(যা উদাহরণ থেকে স্ব স্পষ্ট)"।
কুসালানন্দ

15

আমি strlen()কেবল এটির জন্য করব না , তবে সি কোডটি চেষ্টা করার জন্য এটি একটি দরকারী কৌশল।

ব্যবহারকারী @ হোস্ট: ~ $ জিডিবি জিডিবি
(জিডিবি) শুরু
অস্থায়ী ব্রেকপয়েন্ট 1, ... মূলত ()
(জিডিবি) মুদ্রণ স্ট্রেন ("ফুবার")
$ 1 = 6

এখানে gdbজিএনইউ ডিবাগার রয়েছে এবং এটির পরে ডিবাগ করার জন্য এটি সাধারণত কোনও প্রোগ্রামের নাম নেয়। আমাদের কোনও নেই বলে এই উদাহরণটি এটিকে ডিবাগ করতে দেয়। তারপরে startপ্রোগ্রামটি শুরু হয় এবং তারপরে gdbস্বেচ্ছাসেবক সি কোড চালানো যায়।


2
ভাল কৌশল, জিডিবি ব্যবহার করতে। তবুও জিডিবি হ'ল বিকাশকারী সরঞ্জামগুলির একটি অংশ এবং আপনি যদি লাইব্রেরি ফাংশনটি ব্যবহার করতে চান তবে আপনি বিকাশকারী সরঞ্জামগুলি ব্যবহার করতে শেখার জন্য আরও ভাল প্রস্তুতি নিন।
ডুডি বয়

4

একটি সরঞ্জাম যা ভাগ করে নেওয়া লাইব্রেরিতে ক্রিয়াকলাপ কল করতে ব্যবহৃত হতে পারে: "ডাইনক্রাফট সংকলক সংগ্রহ"। https://github.com/endrazine/wcc

গিটহাব পৃষ্ঠা থেকে:

ডাব্লু: জাদুকরী শেল

ডাইনিট্রাক্ট শেল ইএনএফ শেয়ার করা লাইব্রেরিগুলি, ইএনএফ ET_DYN এক্সিকিউটেবল এবং জাদুকরী শেল স্ক্রিপ্টসকে ইনপুট হিসাবে পাঙ্ক-সিতে লিখিত হিসাবে গ্রহণ করে। এটি সমস্ত এক্সিকিউটেবলকে তার নিজস্ব ঠিকানার জায়গায় লোড করে এবং তাদের এপিআইটি এম্বেডড ইন্টারপ্রেটারে প্রোগ্রামিংয়ের জন্য উপলব্ধ করে। এটি জাওয়ার মতো ভাষার প্রতিবিম্বের মাধ্যমে প্রদত্ত বাইনারিগুলির কার্যকারিতার জন্য সরবরাহ করে।

Wsh এর উদাহরণের উদাহরণ নীচের কমান্ডটি /usr/sbin/apache2wsh এর মধ্যে এক্সিকিউটেবলকে লোড করে , ap_get_server_banner()তার ব্যানারটি পুনরুদ্ধার করতে অ্যাপাচে ফাংশনটি কল করে এবং wshদোভাষীর মধ্যে প্রদর্শন করে ।

jonathan@blackbox:~$ wsh /usr/sbin/apache2
> a = ap_get_server_banner()
> print(a)
Apache/2.4.7
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.