আমি কীভাবে ব্যবহারকারীরূপে বাকশ স্ক্রিপ্টের বাকী অংশটি প্রয়োগ করতে su ব্যবহার করব?


126

আমি একটি স্ক্রিপ্ট লিখেছি যা আর্গুমেন্ট হিসাবে একটি স্ট্রিং নেবে যা একটি ব্যবহারকারীর নাম এবং প্রকল্পের সংক্ষিপ্ত রূপ। স্ক্রিপ্টটি ব্যবহারকারীর নাম, সিডিকে প্রকল্পের স্ট্রিংয়ের উপর ভিত্তি করে একটি নির্দিষ্ট ডিরেক্টরিতে স্যুইচ করতে হবে।

আমি মূলত এটি করতে চাই:

su $USERNAME;  
cd /home/$USERNAME/$PROJECT;  
svn update;  

সমস্যাটি হ'ল একবার আমি একটি su করি ... এটি কেবল সেখানে অপেক্ষা করে। মৃত্যুদন্ড কার্যকর করার প্রবাহটি ব্যবহারকারীর সাথে স্যুইচিংয়ে চলে যাওয়ার পর থেকে এটি বোঝা যায়। একবার আমি প্রস্থান করার পরে, বাকি জিনিসগুলি কার্যকর করা হয় তবে এটি পছন্দসইভাবে কাজ করে না।

আমি এসএনএন কমান্ডে su চাপলাম কিন্তু কমান্ডটি ব্যর্থ হয়েছে (যেমন এটি পছন্দসই ডিরেক্টরিতে svn আপডেট করে না)।

আমি কীভাবে এমন স্ক্রিপ্ট লিখব যা ব্যবহারকারীর ব্যবহারকারীর স্যুইচ করতে এবং এসএনএন (অন্যান্য জিনিসগুলির মধ্যে) আবেদন করতে পারে?

উত্তর:


86

কৌশলটি হ'ল "su" এর পরিবর্তে "sudo" কমান্ড ব্যবহার করা

আপনার এটি যোগ করার প্রয়োজন হতে পারে

username1 ALL=(username2) NOPASSWD: /path/to/svn

আপনার / ইত্যাদি / sudoers ফাইল

এবং আপনার স্ক্রিপ্ট এতে পরিবর্তন করুন:

sudo -u username2 -H sh -c "cd /home/$USERNAME/$PROJECT; svn update" 

যেখানে ব্যবহারকারীর নাম 2 হ'ল ব্যবহারকারী আপনি এসভিএন কমান্ডটি চালাতে চান এবং ব্যবহারকারী নাম 1 হ'ল স্ক্রিপ্টটি চালাচ্ছেন।

এই স্ক্রিপ্টটি চালানোর জন্য আপনার যদি একাধিক ব্যবহারকারীর প্রয়োজন %groupnameহয় তবে ব্যবহারকারীর নাম 1 এর পরিবর্তে একটি ব্যবহার করুন


আমারও একই সমস্যা রয়েছে তবে আমি chshঅন্য ব্যবহারকারীদের জন্য চালাতে চেয়েছিলাম । আমার ইস্যু এখানে স্ট্যাকওভারফ্লো . com/q/15307289/80353 এ তালিকাবদ্ধ আছে আমি কীভাবে আমার পরিস্থিতিতে আপনার উত্তরটি মানিয়ে নেব?
কিম স্ট্যাকস

আমি এটি করেছি - তবে এটি এখনও আমাকে একটি পাসওয়ার্ড চেয়েছিল।
হিপ্পিজিম

@ হিপ্পিজিম আপনি কি নিশ্চিতরূপে ব্যবহারকারী নামগুলি পেয়েছেন?
কিমভাইস

1
আমি করেছি - এটি সক্রিয় যে আমাকে / বিন / ব্যাশ ব্যবহারের অনুমতিও দিতে হবে।
হিপ্পিজিম

3
আপনি ব্যবহার করেন sudoবা suতা গৌণ গুরুত্বের বিষয়, যদিও sudoএটি অনেক বেশি সুরক্ষিত এবং সুবিধাজনক।
ট্রিপলি

105

অনেক সহজ: sudoশেল চালাতে ব্যবহার করুন এবং কমান্ডগুলি খাওয়ানোর জন্য হেরডোক ব্যবহার করুন ।

#!/usr/bin/env bash
whoami
sudo -i -u someuser bash << EOF
echo "In"
whoami
EOF
echo "Out"
whoami

(উত্তর মূলত সুপার ইউজারে )


5
এই উত্তরটি সবচেয়ে ভাল কাজ করেছে। আমি প্রত্যাশিত পরিবেশ -iপাওয়ার জন্য বিকল্পটি ব্যবহার করার পরামর্শ দিচ্ছি someuser
not2savvy

2
sudoসুবিধাজনক হতে পারে তবে এটি বক্সের বাইরে না থাকলে ভাল নয় (এআইএক্সের মতো)। su -c 'commands'সঠিক উত্তর।
চালিত

1
মহাকাব্য সমাধান!
3bdalla

হার্ডকের সুযোগে ভেরিয়েবলগুলি কীভাবে উপলব্ধ করবেন?
ডটস্ল্যাশলু

এআইএক্স-এ এটি এই ত্রুটিটি ছুঁড়ে দেয় ksh: sh: 0403-006 মৃত্যুদন্ড কার্যকর করার অনুমতি অস্বীকার করা হয়েছে।
আহমেদরানা

54

অন্য ব্যবহারকারীর অধীনে স্ক্রিপ্টের বাকী অংশ বা অংশটি কার্যকর করতে নীচের মতো একটি স্ক্রিপ্ট ব্যবহার করুন:

#!/bin/sh

id

exec sudo -u transmission /bin/sh - << eof

id

eof

11
Su হোমের মতো জিনিস সঠিকভাবে সেট করা আছে তা নিশ্চিত করতে আপনি "sudo -i -u ..." ব্যবহার করতে চাইতে পারেন।
ব্রায়ান লারসেন

নুব প্রশ্নের জন্য দুঃখিত, তবে এখানে একটি আইডি কি?
নীতিন যাদব

1
@ নিতিনজাদব, তিনি এটি কেবলমাত্র বর্তমান ব্যবহারকারীর আইডি দেখানোর জন্য ব্যবহার করেছেন, মূলের আইডি 0 হয়, সুতরাং প্রথম আইডি আপনাকে কিছু নম্বর দেখায়, তবে দ্বিতীয়টি অবশ্যই 0 দেখায় (কারণ দ্বিতীয়টি ভিতরে প্রবেশ করা হয়েছিল মূল দ্বারা চালিত একটি ব্লক)। আপনি যার whoamiপরিবর্তে ব্যবহারকারী id
আইডিটির

@ মোহাম্মদ নুরাল্ডিন ​​ধন্যবাদ!
নীতিন যাদব

sudoসুবিধাজনক হতে পারে তবে এটি বক্সের বাইরে না থাকলে ভাল নয় (এআইএক্সের মতো)। su -c 'commands'সঠিক উত্তর।
চালিত

52

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

su -c "cd /home/$USERNAME/$PROJECT ; svn update" -m "$USERNAME" 

4
এটিই একমাত্র সঠিক উত্তর। এই জন্য sudo প্রয়োজন হয় না।
হেলভেট

1
আপনার শেল সরবরাহ করার প্রয়োজনও থাকতে পারে su -s /bin/bash
মিশ্র

রুট ব্যবহারকারীদের জন্য সেরা সমাধান
rfinz

ডিফল্টরূপে যাদের সুডো ইনস্টল নেই তাদের পক্ষে সেরা উত্তর (আমি আপনাকে এআইএক্সের দিকে দেখছি)
ট্রিকি

46

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

#!/bin/bash
if [ $UID -eq 0 ]; then
  user=$1
  dir=$2
  shift 2     # if you need some other parameters
  cd "$dir"
  exec su "$user" "$0" -- "$@"
  # nothing will be executed beyond that line,
  # because exec replaces running process with the new one
fi

echo "This will be run from user $UID"
...

6
আমি কেন এটিকে বেশি রেট দেয় না তা অবাক করি। সব কিছু বাশে রাখার সময় এটি মূল প্রশ্নটি সবচেয়ে ভাল সমাধান করছে।
স্যারভের

বা runuser -u $user -- "$@", যেমন
সূ

1
exec su "$user" "$0" -- "$@"
macieksk

1
ধন্যবাদ @ ম্যাসিক্স্ক, দুর্দান্ত ক্যাচ আপডেট হবে। --সত্যিই দরকারী।
মারসফট

1
উপস্থাপিত পদ্ধতি সকলের মধ্যে সেরা এবং সম্পূর্ণ। সবগুলি একক স্ক্রিপ্টের ভিতরে লেখা এবং সমস্ত ব্যাশ ব্যবহার করে। কার্যকরভাবে, এই স্ক্রিপ্টটি দু'বার চালানো হয়। প্রথম স্ক্রিপ্ট পরীক্ষায় এটি রুট, তারপরে পরিবেশ প্রস্তুত করুন, এবং su দ্বারা ব্যবহারকারী পরিবর্তন করুন। তবে এটি এক্সিকিউট কমান্ড দিয়ে করুন, তারপরে কেবলমাত্র একক স্ক্রিপ্ট উদাহরণ রয়েছে। দ্বিতীয় লুপের সাথে, বাক্যাংশ যদি / ফাই বাদ দেওয়া হয়, তবে স্ক্রিপ্ট সরাসরি প্রস্তুত ক্রিয়া করে। এই উদাহরণে এটি প্রতিধ্বনিত হয়। অন্যান্য সমস্ত পদ্ধতির সমস্যার সমাধান কেবল আংশিক। অবশ্যই এই স্ক্রিপ্টটি sh bash এর অধীনে চালানো যেতে পারে তবে আমাদের অবশ্যই test ইউআইডি নয়, special হোম স্পেশাল ভেরিয়েবল পরীক্ষা করতে হবে
Znik

7

sudoপরিবর্তে ব্যবহার করুন

সম্পাদনা : হিসাবে ডগলাস নির্দিষ্ট, আপনি ব্যবহার করতে পারবেন না cdsudoযেহেতু এটি একটি নয় বহিরাগত কমান্ড। cdকাজটি করতে আপনাকে সাব-শেলের কমান্ডগুলি চালাতে হবে ।

sudo -u $USERNAME -H sh -c "cd ~/$PROJECT; svn update"

sudo -u $USERNAME -H cd ~/$PROJECT
sudo -u $USERNAME svn update

আপনাকে সেই ব্যবহারকারীর পাসওয়ার্ডটি ইনপুট করতে বলা হতে পারে তবে কেবল একবার।


এটি যদিও কাজ করবে না - প্রথম সুডোর সম্পাদন শেষ হওয়ার পরে সিডি হারিয়ে যাবে।
ডগলাস লিডার

আসলে, আপনি সরাসরি সিডি কল করতে পারবেন না কারণ এটি কোনও বাহ্যিক আদেশ নয়।
আইয়াম্যাক

sudoসুবিধাজনক হতে পারে তবে এটি বক্সের বাইরে না থাকলে ভাল নয় (এআইএক্সের মতো)। su -c 'commands'সঠিক উত্তর।
চালিত

6

শেল স্ক্রিপ্টের মধ্যে ব্যবহারকারীর পরিবর্তন সম্ভব নয়। অন্যান্য উত্তরে বর্ণিত সুডো ব্যবহার করে কাজের দিকগুলি সম্ভবত আপনার সেরা বেট are

আপনি যদি পার্ল স্ক্রিপ্টগুলি রুট হিসাবে চালাতে যথেষ্ট পাগল হন তবে আপনি $< $( $> $) আসল / কার্যকর uid / gid ধারণ করে এমন ভেরিয়েবলগুলির সাহায্যে এটি করতে পারেন , যেমন:

#!/usr/bin/perl -w
$user = shift;
if (!$<) {
    $> = getpwnam $user;
    $) = getgrnam $user;
} else {
    die 'must be root to change uid';
}
system('whoami');

-1 যেমন এটা IS সম্ভব উবুন্টু সঙ্গে সাময়িকভাবে অন্যান্য ব্যবহারকারীর অধিকার লাভ করার।
কিমভাইস

4
যে শেল স্ক্রিপ্টটি ব্যবহারকারী নিজেই চালিত হতে পারে তেমনটি পরিবর্তন করা যায় না (এটি মূল প্রশ্নটি জিজ্ঞাসা করেছিল) এই অর্থে এটি সম্ভব নয়। সুডোর সাথে অন্যান্য প্রক্রিয়াগুলি চালনা করা স্ক্রিপ্ট নিজেই কার হিসাবে চলছে তা পরিবর্তন করে না।
পি-বাদাম

2

এটি আমার পক্ষে কাজ করেছে

আমি আমার "প্রভিশন" কে আমার "স্টার্টআপ" থেকে আলাদা করব split

 # Configure everything else ready to run 
  config.vm.provision :shell, path: "provision.sh"
  config.vm.provision :shell, path: "start_env.sh", run: "always"

তারপরে আমার start_env.sh এ

#!/usr/bin/env bash

echo "Starting Server Env"
#java -jar /usr/lib/node_modules/selenium-server-standalone-jar/jar/selenium-server-standalone-2.40.0.jar  &
#(cd /vagrant_projects/myproj && sudo -u vagrant -H sh -c "nohup npm install 0<&- &>/dev/null &;bower install 0<&- &>/dev/null &")
cd /vagrant_projects/myproj
nohup grunt connect:server:keepalive 0<&- &>/dev/null &
nohup apimocker -c /vagrant_projects/myproj/mock_api_data/config.json 0<&- &>/dev/null &

-2

@ মারসফট থেকে ধারণাটি দ্বারা অনুপ্রাণিত হয়েছিল কিন্তু আমি নীচের মত লাইনগুলি পরিবর্তন করেছি:

USERNAME='desireduser'
COMMAND=$0
COMMANDARGS="$(printf " %q" "${@}")"
if [ $(whoami) != "$USERNAME" ]; then
  exec sudo -E su $USERNAME -c "/usr/bin/bash -l $COMMAND $COMMANDARGS"
  exit
fi

আমি sudoকোনও পাসওয়ার্ডকে স্ক্রিপ্টটির কম প্রয়োগের অনুমতি দিতে ব্যবহার করেছি । আপনি যদি ব্যবহারকারীর জন্য একটি পাসওয়ার্ড লিখতে চান তবে এটি সরিয়ে দিন sudo। আপনার যদি পরিবেশের পরিবর্তনশীলগুলির প্রয়োজন না হয় তবে সরান-E হয় তবে sudo থেকে ।

/usr/bin/bash -lনিশ্চিত, যে profile.dস্ক্রিপ্ট একটি সক্রিয়া পরিবেশের জন্য মৃত্যুদন্ড কার্যকর করা হয়।


sudoসুবিধাজনক হতে পারে তবে এটি বক্সের বাইরে না থাকলে ভাল নয় (এআইএক্সের মতো)। su -c 'commands'সঠিক উত্তর।
চালাকি

@ ট্রিকি সম্ভবত পুরো উত্তরটি পড়ুন, এটি ইতিমধ্যে অপসারণের পরামর্শ দেয় sudo। আসলে, সুডো এত সহজ নয়, প্রচুর ক্ষেত্রে আপনার এমনকি sudo -Eসমঝোতা প্রয়োজন এবং sudoers.d এ কনফিগারেশন এন্ট্রি প্রয়োজন যাতে tty ছাড়াই মৃত্যুদণ্ড কার্যকর করা যায় !requiretty। তবে অনেকগুলি কেস রয়েছে, যেখানে স্বয়ংক্রিয় কল হওয়া স্ক্রিপ্টগুলির জন্য sudo প্রয়োজনীয়, যেখানে একটি পাসওয়ার্ড ডায়ালগ হস্তক্ষেপ করতে পারে। সুতরাং আমি এটি একটি স্ট্যান্ডার্ড সমাধান থেকে সরাব না।
ট্রেন্ডফিশার

প্রশ্নে থাকা কোডটি সম্পূর্ণ বগিযুক্ত - এটি স্ক্রিপ্টের নাম বা স্থানগুলির সাথে যুক্তিগুলি ভেঙে দেবে; মনে রাখবেন যে রাখা"$@" একটি স্ট্রিংয়ের ভিতরে অর্থ প্রথমটির অতীতের যুক্তিগুলি পৃথক স্ট্রিংয়ে যুক্ত করা হয়, যুক্তিতে অন্তর্ভুক্ত নয়-c । আপনি যদি এটি নিরাপদ করতে চান, আপনি printf -v arg_q '%q ' "$0" "$@"এবং তারপরে ব্যবহার করতে পারেনsu "$USERNAME" -c "/usr/bin/bash -l $arg_q"
চার্লস ডাফি

পছন্দ করুন আমি এই উত্তরটির জন্য আমার প্রযোজনীয় স্ক্রিপ্টটি খুব সরল করে দিয়েছি :-( কেবলমাত্র একটি যুক্ত করা COMMANDARGS=$@সমস্যা সমাধান করে -cs ফাঁকা স্থানগুলির সাথে যুক্তিগুলি আগে কোনও সমস্যা ছিল না, তবে আমি আপনার ভাল ইনপুটটি প্রয়োগ করেছি it এটি কার্যকর করার জন্য আমাকে কিছু পরীক্ষা-নিরীক্ষা করতে হয়েছিল I 'প্রশ্নটি সম্পাদনা করেছেন এবং আশা করছি আমি আর কোনও বাগ
আটকে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.