সুডোতে দুটি কমান্ড কিভাবে চালানো যায়?


152

কোনও উপায় আছে কীভাবে আমি কমান্ড লাইন থেকে দুটি ডিবি 2 কমান্ড চালাতে পারি? (তাদের একটি পিএইচপি execকমান্ড থেকে ডাকা হবে ।)

  1. db2 connect to ttt (মনে রাখবেন যে দ্বিতীয় কমান্ডের জন্য আমাদের সংযোগটি লাইভ করা দরকার
  2. db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'

আমি এটি চেষ্টা করেছি:

sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'

প্রথম কমান্ডটি সঠিকভাবে শেষ হয়েছে তবে দ্বিতীয়টি ত্রুটি বার্তায় ব্যর্থ হয় SQL1024N A database connection does not exist. SQLSTATE=08003

নোট করুন যে আমার পিএইচপি ব্যবহারকারী হিসাবে এটি চালানো দরকার। পিএইচপি ব্যবহারকারী sudo -u db2inst1 idহিসাবে কমান্ডটি আমাকে সঠিক আউটপুট দেয়।


আপনি কেন এই প্রশ্নটি বন্ধ করতে চান দয়া করে একটি মন্তব্য দিন। ধন্যবাদ.
রাদেক

1
ঘনিষ্ঠ ভোটটি সার্ভারফল্টে স্থানান্তরের জন্য, যেহেতু এটি সিস্টেম প্রশাসনের প্রশ্ন, প্রোগ্রামিং নয়।
বিডনলান

উত্তর:


157

sudo শেল এর মাধ্যমে একাধিক কমান্ড চালাতে পারে, উদাহরণস্বরূপ:

do সুডো-এস - 'হোয়ামি; আমি কে'
মূল
মূল

আপনার আদেশটি এমন কিছু হবে:

sudo -u db2inst1 -s - "tb সাথে db2 সংযুক্ত করুন; db2 আপডেট যোগাযোগ ইমেল_এড.এইচআর = 'mytestaccount@gmail.com'"

যদি আপনার সুডো সংস্করণ সেমিকোলনগুলির সাথে -s সহ কাজ না করে (দৃশ্যত, এটি নির্দিষ্ট বিকল্পগুলির সাথে সংকলিত হয় না) তবে আপনি ব্যবহার করতে পারেন

sudo - sh -c 'হোয়ামি; আমি কে'

পরিবর্তে, যা মূলত একই জিনিসটি করে তবে আপনাকে শেলটির নাম স্পষ্ট করে দেয়।


12
এটি সর্বশেষতম ডিবিয়ান স্থিতিশীল (স্ক্রুজ) বাশ নিয়ে কাজ করে না:sudo -s -- '/usr/bin/whoami; /usr/bin/whoami' /bin/bash: /usr/bin/whoami; /usr/bin/whoami: No such file or directory
বোরোর

11
@ ভালোর আপনি sudo -- sh -c 'whoami; whoami;"সুডো-এস" ভেঙে গেলে কাজের হিসাবে ব্যবহার করতে পারেন । আমি উত্তরও আপডেট করেছি।
wjl

6
সম্পাদিত সংস্করণটির জন্য +1 যা "- sh -c" উদাহরণ দেখায়। ধন্যবাদ!
জেডি।

4
আপনি কেন "-" দরকার তা ব্যাখ্যা করতে পারেন?
ভিক সিডুবলিউ

7
@ ভিসসিডুবলিয়েউ --প্যারামিটারগুলির সমাপ্তি নির্দেশ করে sudo, তাই অন্য সব কিছুই কমান্ডের অংশ; এটি ছাড়া, যুক্তিগুলির মত যুক্তি -cহিসাবে ব্যাখ্যা করা যেতে পারে sudo। এটি বেশিরভাগ (তবে সমস্ত নয়) কমান্ড-লাইন প্রোগ্রামগুলির জন্য কাজ করে। অন্য একটি (অ- sudo) উদাহরণস্বরূপ, নামক কোনও ফাইল সরিয়ে -fআপনি কেবল চালাতে পারবেন না rm -f, তাই না ?! তবে আপনি কল করা rm -- -fফাইলটি মুছতে চালাতে পারেন -f
wjl

176

আপনার কমান্ডের জন্য আপনি নিম্নলিখিত উদাহরণটি উল্লেখ করতে পারেন:

sudo sh -c 'whoami; whoami'


14
আমি এটি একটি আরও নির্ভরযোগ্য বিকল্প পেয়েছি।
নিক


42

আপনি যদি উদ্ধৃতিগুলি পরিচালনা করতে চান:

sudo -s -- <<EOF
id
pwd
echo "Done."
EOF

4
ধন্যবাদ এটি এখানেই সবচেয়ে পরিষ্কার উত্তর। হতে পারে একটি নোট যুক্ত করুন "আপনি এর থেকে একাধিক কমান্ড চালাতে পারবেন না sudo- আপনাকে সর্বদা এটির শেল কার্যকর করার জন্য ট্রিক করতে হবে যা প্যারামিটার হিসাবে চালানোর জন্য একাধিক কমান্ড গ্রহণ করতে পারে"
trs

8

একটি সাবসেলের ব্যবহার evalএতটা এড়ানো ব্যবহার করে একটি বিকল্প :

sudo -s eval 'whoami; whoami'

দ্রষ্টব্য: অন্যান্য উত্তরগুলি sudo -sব্যর্থ হয়েছে কারণ উদ্ধৃতিগুলি বাশকে দেওয়া হচ্ছে এবং একটি একক কমান্ড হিসাবে চালানো হচ্ছে সুতরাং এভ্যাল সহ উদ্ধৃতিগুলি ছাঁটাতে হবে। evalএই উত্তরের উত্তরটি আরও ভালভাবে ব্যাখ্যা করা হয়েছে

কমান্ডের মধ্যে উদ্ধৃতি দেওয়া আরও সহজ:

$ sudo -s eval 'whoami; whoami; echo "end;"'
root
root
end;

আর যদি আধা-কলোনগুলির পরিবর্তে কেউ ডাবল-অ্যাম্পারস্যান্ড ব্যবহার করতে ব্যর্থ হয় তবে কমান্ডগুলি চলমান বন্ধ করতে হবে:

$ sudo -s eval 'whoami && whoamit && echo "end;"'
root
/bin/bash: whoamit: command not found

3

-sবিকল্প আমার জন্য কাজ না করে, -iকরেনি।

আমি কীভাবে আমার বাশ থেকে লগের আকার আপডেট করতে পারি তার একটি উদাহরণ এখানে দেওয়া হয়েছে:

sudo -u [user] -i -- sh -c 'db2 connect to [database name];db2 update db cfg for [database name] using logsecond 20;db2 update db cfg for [database name] using logprimary 20;'

1

টার্মিনালে, টাইপ করুন:

$ sudo bash

তারপরে যত খুশি কমান্ড লিখুন। exitআপনি যখন কাজ টাইপ ।

আপনার যদি এটি স্বয়ংক্রিয়র প্রয়োজন হয় তবে একটি script.shফাইল তৈরি করুন এবং এটি চালান:

$ sudo ./script.sh

1

সামান্য সম্পর্কিত বিষয়ে, আমি এসএসএইচ এর মাধ্যমে একই মাল্টি-কমান্ড সুডো করতে চেয়েছিলাম তবে উপরের কোনওটিই কাজ করেনি।

উবুন্টুর উপর উদাহরণস্বরূপ,

$ ssh host.name sudo sh -c "whoami; whoami"
[sudo] password for ubuntu:
root
ubuntu

এখানে যে কৌশলটি আবিষ্কার হয়েছে তা হ'ল কমান্ডটি দ্বিগুণ করা।

$ ssh host.name sudo sh -c '"whoami; whoami"'
[sudo] password for ubuntu:
root
root

অন্যান্য বিকল্পগুলি যা কাজ করে:

ssh host.name sudo sh -c "\"whoami; whoami\""
ssh host.name 'sudo sh -c "whoami; whoami"'

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


1

যদি আপনি মূল পাসওয়ার্ডটি জানেন তবে আপনি চেষ্টা করতে পারেন

su -c "<command1> ; <command2>"  

যদি আপনি মূল পাসওয়ার্ডটি না জানেন তবে ব্যবহার করুন sudo su -c "<command1> ; <command2>"
দাগ হিডাহল

0

উপরের উত্তরগুলি আপনাকে উদ্ধৃতিগুলির মধ্যে উদ্ধৃতি দেবে না। এই সমাধান করবে:

sudo -su nobody umask 0000 \; mkdir -p "$targetdir"

উভয় umask কমান্ড এবং mkdir- কমান্ড 'কেউ না' ব্যবহারকারীর সাথে চলতে থাকে।


আপনি একক এবং ডাবল উদ্ধৃতি ব্যবহার করতে পারেন এবং সেগুলি থেকে পালাতে পারেন।
Radek

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