বাশের অন্য ব্যবহারকারীর কাছে একটি ফাংশন পাস করবেন?


11

কোনও ব্যবহারকারীর মাধ্যমে কীভাবে আমি একজন ব্যবহারকারী থেকে অন্য ব্যবহারকারীর কাছে কোনও ফাংশন পাস করতে পারি?

উদাহরণস্বরূপ, আমার কাছে একটি ছোট বাশ স্ক্রিপ্ট রয়েছে যা আমি রুট হিসাবে সম্পাদন করি:

#!/bin/bash
user_func(){
  whoami
  exit
}
su vagrant -c 'user_func'

যাইহোক, user_func ফাংশন ভ্যাগ্র্যান্ট ব্যবহারকারীর জন্য সংজ্ঞায়িত করা হয়নি, কেবল রুটের জন্য, এবং কার্যকর করা যায় না।

আমার অন্য বিকল্পটি একাধিক লাইন থাকবে

su vagrant -c 'cmd1' 
su vagrant -c 'cmd2'
, etc 

অথবা, একাধিক কমান্ড নির্বাহ করুন:, su vagrant -c 'cmd1; cmd2; cmd3;'তবে আমি অতিরিক্ত না থাকা পছন্দ করব, বিশেষত ভ্যাগ্র্যান্ট ব্যবহারকারী হিসাবে 5 টিরও বেশি কমান্ড কার্যকর করার চেষ্টা করার সময়।

একই স্ক্রিপ্টের মধ্যে থেকে অন্য ব্যবহারকারীর কাছে কোনও ফাংশন পাস করা সম্ভব (উদাহরণস্বরূপ, পৃথক ব্যবহারকারী হিসাবে ডিস্কে কোনও স্ক্রিপ্ট তৈরি না করা এবং সেই উত্পন্ন স্ক্রিপ্টটি কার্যকর করা)? বা অন্য কোন বিকল্প আছে যা আমি উপেক্ষা করছি?

উত্তর:


10

আপনার exportপ্রথমে সেই ফাংশন সংজ্ঞাটির মতো লাগছে :

#!/bin/bash
user_func (){
  whoami
  exit
}
export -f user_func
su vagrant -c 'user_func'

কৌতুক করা উচিত।

এটি -fজানায় exportযে এটি একটি ভেরিয়েবলের পরিবর্তে ফাংশনের নাম। থেকে উদ্ধৃতি help export:

পরবর্তীকালে সম্পাদিত কমান্ডগুলির পরিবেশে স্বয়ংক্রিয় রফতানির জন্য প্রতিটি NAMEকে চিহ্নিত করে। ....

বিকল্প:

 -f   refer to shell functions

মন্তব্যগুলিতে পিটার্ফ এবং স্টিফেন দ্বারা নির্দেশিত হিসাবে, এটি দুটি জিনিস ধরে নিয়েছে:

  1. আপনার suকমান্ড ব্যবহারকারীর পরিবেশকে ওভাররাইট করবে না
  2. এই vagrantলগইন শেল হয় bash। যদি তা না হয় তবে আপনি suস্টিফেন দ্বারা সরবরাহিত বিকল্প কমান্ড লাইনটি ব্যবহার করতে পারেন :

    su vagrant -c 'bash -c user_func'

এটি আসলে আমি প্রত্যাশা করছিলাম। আমি বুঝতে পারি নি যে আপনি ফাংশনটি রপ্তানি করতে সক্ষম হবেন। এটি যেমন নমুনা স্ক্রিপ্ট সম্পাদনা করার পরে আশা করছিলাম ঠিক তেমন কাজ করেছে। ধন্যবাদ!
gdieckmann

1
দুর্দান্ত, তবে suপরিবেশকে ওভাররাইড করে এমন ক্ষেত্রে কাজ করবে না ।
পিটার্ফ

1
মনে রাখবেন যে, এটি শুধুমাত্র কাজ করে এর লগ-ইন শেল vagrantহয় bash। যদি তা না হয়su vagrant -c 'bash -c user_func'
স্টাফেন চ্যাজেলাস

6

এটি কিছুটা হ্যাকিশ, তবে আপনি সোমন্ডের ভিতরে ফাংশনটির সংজ্ঞাটি প্রিন্ট করতে পারেন suএবং তারপরে আপনি অবশ্যই এটি ব্যবহার করতে পারেন।

$ function foo { do_some_stuff_here; }
$ su test -c "$(typeset -f foo); foo"

এটি কোনও কারণে স্খলিত শেলের পরিবেশকে suওভাররাইট করা হবে এমনকী এটি কাজ করবে, যেহেতু এটি শেল প্রারম্ভিককরণের পরে সংজ্ঞা রাখে। আপনি যদি ফাংশনটি তুলনামূলকভাবে যথেষ্ট পরিমাণে লেখেন তবে এটি তখনও কার্যকর হবে যখন প্রশ্নে থাকা দু'জন ব্যবহারকারী বিভিন্ন শেল ব্যবহার করছেন।


+1 সত্যিই ঝরঝরে কৌশল! যদিও কেবল একটি প্রশ্ন, suশেলের পরিবেশকে বাহ্যিক উপাদানগুলির দ্বারা ওভাররাইট করা যেতে পারে? আমি বলতে চাইছি, এক্ষেত্রে suআপনার স্ক্রিপ্টে থাকা কমান্ড লাইনের উপর সম্পূর্ণ নিয়ন্ত্রণ রয়েছে । কীভাবে এর নতুন শেলের পরিবেশটি ওভাররাইট করা যেতে পারে?
জোসেফ আর।

উদাহরণস্বরূপ, তৈরি শেল suপরিবেশের কিছু সূচনা করতে পারে। এছাড়াও suসুরক্ষাকে কিছুটা কড়া করার জন্য কলারের কিছু পরিবেশ ছিনিয়ে নিতে পারে (যদিও এটি সাধারণত আরও শক্তিশালী বিকল্পগুলির দ্বারা করা হয় sudo)।
পিটার্ফ

0

এটি আপনার কোনও স্ক্রিপ্ট নয়, এটি একটি ফাংশন। মনে হচ্ছে আপনি কোনও স্ক্রিপ্ট চান , যদিও। পারেন একটি সঠিক স্ক্রিপ্ট তৈরি করুন এবং এটা করা, যেমন আপনার চাহিদা প্রয়োজন, /usr/local/bin, অথবা /home/vagrant/bin, এবং আপনার চেয়ে যেমন করতে সক্ষম হওয়া উচিতsu vagrant -c '/home/vagrant/bin/myscript.sh'


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

0

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

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