বাশ, নতুন শেলটি সন্ধানের পরে কমান্ড কার্যকর করুন


12

আমি এটির মতো একটি স্ক্রিপ্ট তৈরি করার চেষ্টা করছি:

#!/bin/bash
sudo -s
something...

যখন আমি এটি somethingসম্পাদন করি, আমি একটি নতুন শেল পাই তবে কেবল তখনই কার্যকর করা হয় যখন আমি তার দ্বারা তৈরি শেলটি প্রস্থান করি sudo -s, তার ভিতরে নয়।

কোন সাহায্য?

উত্তর:


7

সমস্যাটি sudo -sকোনও যুক্তি ছাড়াই মূলের জন্য একটি ইন্টারেক্টিভ শেলটি খুলবে।

আপনি যদি কেবল একটি কমান্ড ব্যবহার করে চালাতে চান তবে আপনি sudo -sসহজ করতে পারেন:

sudo -s command

উদাহরণ স্বরূপ :

$ sudo -s whoami
root

অথবা আপনি এখানে স্ট্রিং ব্যবহার করতে পারেন:

$ sudo -s <<<'whoami'
root

আপনার যদি একাধিক আদেশ থাকে তবে আপনি এখানে ডক ব্যবহার করতে পারেন:

$ sudo -s <<'EOF'
> whoami
> hostname
> EOF
root
something--

1
ব্যবহারকারীর শেল পরিবর্তন করার জন্য (বরং দরিদ্র) ধারণা থাকলে sudo -sকেবল এটি ব্যবহার করা ভাল নয় root। এটি সত্যই হওয়া উচিত sudo shযা পরিষ্কারভাবে কোন শেলটি ব্যবহার করতে হবে তা উল্লেখ করে।
মাইকেল লে বার্বিয়ার গ্রেনওয়াল্ড

7

আরেকটি উপায় হ'ল এখানে একটি পূর্ণ বাশ কমান্ড (গুলি) প্রেরণ করা হবে sudo:

#!/bin/bash
sudo bash -c 'command1; command2; command3;'

যাইহোক, একটি ভাল উপায় আরম্ভ হবে স্ক্রিপ্ট সঙ্গে sudoপরিবর্তে। sudoস্ক্রিপ্টের ভিতরে থাকা খুব ভাল ধারণা নয় । মূল স্ক্রিপ্টগুলি ( sudo script.sh) সহ পুরো স্ক্রিপ্টটি চালানো আরও ভাল । প্রয়োজনে আপনি sudoনির্দিষ্ট কমান্ডের জন্য সুবিধাগুলি ছাড়তে ব্যবহার করতে পারেন । উদাহরণ স্বরূপ:

#!/usr/bin/env bash
whoami
echo $HOME
sudo -u terdon whoami  ## drop privileges for specific command.

উপরে স্ক্রিপ্ট চালানো ফিরে আসে:

$ sudo ~/scripts/a.sh
root
/root
terdon

3

বোর্ন শেল টি -cপতাকা যা আপনি শেল একটি অবাধ স্ক্রিপ্ট পাস করতে ব্যবহার করতে পারেন যা আপনার মত কিছু লিখতে পারেন, তাই

sudo sh -c 'something'

যদিও সহজ কমান্ড শুধুমাত্র দরকারী, কারণ এটি খুব কষ্টকর হয় স্ক্রিপ্ট সঠিকভাবে উদ্ধৃত করা এবং অসুবিধার এমনকি উচ্চ হলে তোমাদের উপর একটি দূরবর্তী সার্ভারে কমান্ড পাঠাতে SSH দুইবার কারণ যুক্তি স্ক্রিপ্ট বিশ্লেষণ করা হবে, পাশের একবার স্ক্রিপ্ট প্রেরণ এবং একবার স্ক্রিপ্ট চলমান।

যদি somethingএকটি জটিল স্ক্রিপ্ট হয় বা একটি হ্রদ পার করা প্রয়োজন SSH লাইন, এটা সাধারণ চর্চা একটি ফাংশন লিখতে হয় prepare_something_scriptযার কাজের লিপি 'কিছু' লিখতে হয় stdout- এ । এর সহজতম ফর্মটিতে, এই ফাংশনটি আউটপুট উত্পন্ন করতে এখানে-নথি ব্যবহার করতে পারে:

prepare_something_script()
{
  cat <<EOF
something
EOF
}

prepare_something_scriptএরপরে উত্পাদিত স্ক্রিপ্টটি স্থানীয়ভাবে স্থানীয়ভাবে sudo দ্বারা প্রদত্ত সুবিধাগুলি দিয়ে কার্যকর করা যেতে পারে :

prepare_something_script | sudo sh

দৃশ্যকল্প যেখানে স্ক্রিপ্ট দ্বারা অনুমোদিত অধিকারসহ দূরবর্তী অবস্থান থেকে মৃত্যুদন্ড কার্যকর করা আবশ্যক উবুন্টু এটা বেস 64 স্ক্রিপ্ট সঙ্কেতাক্ষরে লিখা মান ইনপুট পুনঃনির্দেশিত এড়াতে করতে হয় SSH , এভাবে:

something64=$(prepare_something_script | base64)
ssh usesr@remote-host "echo ${something64} | base64 --decode | sudo sh"

আপনি যদি কোনও ফাংশনে সেই কোডটি ব্যবহার করেন তবে কোনও কিছু 64 ভেরিয়েবল স্থানীয় হিসাবে চিহ্নিত করতে ভুলবেন না । বেস 64 এর কিছু বাস্তবায়ন -dডিকোড করার জন্য একটি পতাকা সরবরাহ করে, যা ভার্বোস --decodeভেরিয়েন্টের চেয়ে কম ভাল সমর্থিত । কিছু বাস্তবায়নের জন্য -w 0উদ্দীপক লাইন বিরতি এড়াতে এনকোডিং কমান্ডটিতে একটি যুক্ত করা প্রয়োজন ।


0

পরের লাইনের পরিবর্তে আপনার কমান্ডটি sudo -s এর আগে যোগ করতে হবে।

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