প্রশ্ন কিভাবে ssho উপর sudo ব্যবহার করে আমি ইচ্ছাকৃতভাবে জটিল কমান্ড চালাতে পারেন?


আমার একটি সিস্টেম আছে যা আমি কেবলমাত্র আমার ব্যবহারকারীর নাম (মাইউসার) এর অধীনে লগ ইন করতে পারি, তবে আমাকে অন্য ব্যবহারকারী (স্ক্রিপ্টসার) হিসাবে কমান্ড চালাতে হবে। এতদূর, আমি প্রয়োজনীয় কমান্ডগুলি চালানোর জন্য নিম্নলিখিতগুলি দিয়ে এসেছি:

ssh -tq myuser@hostname "sudo -u scriptuser bash -c \"ls -al\""

তবে, যখন আমি আরো জটিল কমান্ড চালানোর চেষ্টা করি, যেমন [[ -d "/tmp/Some directory" ]] && rm -rf "/tmp/Some directory" আমি দ্রুত উদ্ধৃত সঙ্গে সমস্যা মধ্যে পেতে। আমি এই উদাহরণ জটিল কম্যান্ড পাস করতে পারে কিভাবে নিশ্চিত নই bash -c, কখন \" ইতোমধ্যে আমি যে কমান্ডটি প্রেরণ করছি তার সীমানাগুলিকে সীমিত করে ফেলেছি (এবং তাই আমি জানি না কিভাবে / quote / tmp / কিছু ডিরেক্টরি উদ্ধৃত করবেন, যা একটি স্পেস অন্তর্ভুক্ত করে।

উদ্ধৃত করা কোনও জটিল / পাগল হওয়া কোনও আদেশ ছাড়াই আমাকে কোনও আদেশ দেওয়ার অনুমতি দেওয়া একটি সাধারণ সমাধান আছে, নাকি আমি এই ধরণের সীমাবদ্ধতা পৌঁছেছি? অন্য সম্ভাব্য এবং সম্ভবত আরও পঠনযোগ্য সমাধান আছে?


76
2017-09-02 09:21


উত্স


একটি স্ক্রিপ্ট $ রিমোট অন কপি করুন তারপর এটি চালানো। - Iain
এটি কাজ করবে, তবে আমি এমন একটি সমাধান খুঁজে পাই যা কোনও স্ক্রিপ্ট ফাইলকে পিছনে ফেলে না (কিছু ক্ষেত্রে ব্যর্থ হলে ইত্যাদি) একটু ক্লিনার হবে। - VoY
প্রতিটি রান শেষে স্ক্রিপ্ট রম নিজেই আছে - thanasisk
ফ্যাব্রিক ব্যবহার বিবেচনা করুন fabfile.org। আপনি দূরবর্তী অনেক sudo আছে যদি আপনি জীবন অনেক সহজ করতে পারেন। - Nils Toedtmann
আপনার যদি আনসইবল ইনস্টল করা থাকে তবে এই কমান্ডটি আপনার ব্যবহারের ক্ষেত্রে ডকুমেন্টেশন দেখায়: ansible-doc স্ক্রিপ্ট - bbaassssiiee


উত্তর:


কখনও কখনও আমি ব্যবহার করা একটি কৌশল কমান্ড এনকোড করতে base64 ব্যবহার করা হয়, এবং অন্য সাইটে bash এটি পাইপ:

MYCOMMAND=$(base64 -w0 script.sh)
ssh user@remotehost "echo $MYCOMMAND | base64 -d | sudo bash"

এটি একটি নিরাপদ স্ট্রিংয়ের ভিতরে কোনও কমা, ব্যাকস্ল্যাশ, কোট এবং ভেরিয়েবলগুলির সাথে স্ক্রিপ্ট এনকোড করবে এবং এটি অন্য সার্ভারে পাঠাবে। (-w0 লাইন মোড়ানো নিষ্ক্রিয় করা প্রয়োজন, ডিফল্টরূপে কলাম 76 এ ঘটবে)। অন্যদিকে, $(base64 -d) স্ক্রিপ্ট decode এবং মৃত্যুদন্ড কার্যকর করা হবে এটি চালানো হবে।

স্ক্রিপ্টটি কতটুকু জটিল ছিল তা নিয়ে আমার কোন সমস্যা হয় নি। Escaping সঙ্গে সমস্যা সমাধান, কারণ আপনি কিছু পালানোর প্রয়োজন হয় না। এটি রিমোট হোস্টে একটি ফাইল তৈরি করে না এবং আপনি সহজেই জটিল জটিল স্ক্রিপ্টগুলি চালাতে পারেন।


138
2017-09-02 13:10



অথবা এমনকি: ssh user@remotehost "echo `base64 -w0 script.sh` | base64 -d | sudo bash" - Niklas B.
বেশিরভাগ ক্ষেত্রেই আপনি দ্রুত স্থানান্তর সময়ের জন্য বেস 64 এর জন্য lzop বা gzip প্রতিস্থাপন করতে পারেন। তবে, প্রান্তের ক্ষেত্রে হতে পারে। YMMV। - CodeGnome
ভাল নোট, কিন্তু এটি একটি স্ক্রিপ্ট যদি, আমি কোন স্থানান্তর কয়েক কেবি চেয়ে বেশি হতে আশা করি না। - ThoriumBR
এখানেও ইকো এর একটি নিরর্থক ব্যবহার আছে। base64 script | ssh remotehost 'base64 -d | sudo bash' যথেষ্ট হবে :) - hobbs
আজ পরীক্ষা এবং পুরোপুরি কাজ। ধন্যবাদ লোকেরা। - Soham Chakraborty


দেখুন -tt বিকল্প? পর এটা ssh(1) ম্যানুয়াল।

ssh -tt root@host << EOF
sudo some # sudo shouldn't ask for a password, otherwise, this fails. 
lines
of
code 
but be careful with \$variables
and \$(other) \`stuff\`
exit # <- Important. 
EOF

এক জিনিস আমি প্রায়শই ব্যবহার vim ব্যবহার এবং ব্যবহার :!cat % | ssh -tt somemachine কৌতুক।


32
2017-09-02 13:01



অবশ্যই :!cat % | (command) হিসাবে কাজ করা যেতে পারে :w !(command) অথবা :!(command) < %। - Scott
হ্যাঁ। আমার লাইন একটি বিড়াল অপব্যবহার - moebius_eye


আমি মনে করি সবচেয়ে সহজ সমাধান @ থানাসিস এর মন্তব্যের একটি সংশোধন।

একটি স্ক্রিপ্ট তৈরি করুন, scp এটা মেশিন, তারপর চালানো।

স্ক্রিপ্ট আছে rm নিজেই শুরুতে। শেলটি ফাইলটি খুলেছে, তাই এটি লোড করা হয়েছে, এবং তারপর সমস্যা ছাড়াই মুছে ফেলা যেতে পারে।

এই আদেশে জিনিস করে (rm প্রথম, অন্যান্য উপাদান দ্বিতীয়) এটি এমনকি কিছু সময়ে ব্যর্থ হলে এটি মুছে ফেলা হবে।


9
2017-09-02 11:26





আপনি ব্যবহার করতে পারেন %q বিন্যাস স্পেসিফিকেশন সঙ্গে printf পরিবর্তনশীল আপনার জন্য escaping যত্ন নিতে:

cmd="ls -al"
printf -v cmd_str '%q' "$cmd"
ssh user@host "bash -c $cmd_str"

printf -v একটি পরিবর্তনশীল আউটপুট লিখেছেন (এই ক্ষেত্রে, $cmd_str)। আমার মনে হয় এটি করার সবচেয়ে সহজ উপায়। কোন ফাইল স্থানান্তরিত করার জন্য বা কমান্ড স্ট্রিং এনকোড করার প্রয়োজন নেই (যতটা আমি কৌশলটি পছন্দ করি)।

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

$ ssh user@host "ls -l test"
-rw-r--r-- 1 tom users 0 Sep  4 21:18 test
$ cmd="[[ -f test ]] && echo 'this really works'"
$ printf -v cmd_str '%q' "$cmd"
$ ssh user@host "bash -c $cmd_str"
this really works

আমি এটা দিয়ে পরীক্ষা করে নি sudo কিন্তু এটি সহজ হিসাবে হওয়া উচিত:

ssh user@host "sudo -u scriptuser bash -c $cmd_str"

যদি আপনি চান, আপনি একটি পদক্ষেপ এড়িয়ে যেতে পারেন এবং মধ্যবর্তী পরিবর্তনশীল এড়াতে পারেন:

$ ssh user@host "bash -c $(printf '%q' "$cmd")"
this really works

অথবা এমনকি একটি পরিবর্তনশীল সম্পূর্ণরূপে এড়ানো এড়াতে:

ssh user@host "bash -c $(printf '%q' "[[ -f test ]] && echo 'this works as well'")"

7
2017-09-04 20:10



এটি একটি দুর্দান্ত সমাধান। আমি আসলে অনুরূপ পরিস্থিতির জন্য printf ব্যবহার করতে হয়েছে, কিন্তু আমি সবসময় এটি সম্পর্কে ভুলে। এই পোস্ট করার জন্য ধন্যবাদ :-) - Jon L.


এখানে ব্যাশে এমন কিছু চালানোর "সঠিক" (সিনট্যাক্টিক) উপায় রয়েছে:

ssh user@server "$( cat <<'EOT'
echo "Variables like '${HOSTNAME}' and commands like $( uname -a )"
echo "will be interpolated on the server, thanks to the single quotes"
echo "around 'EOT' above.
EOT
)"

ssh user@server "$( cat <<EOT
echo "If you want '${HOSTNAME}' and $( uname -a ) to be interpolated"
echo "on the client instead, omit the the single quotes around EOT."
EOT
)"

এই কাজ কিভাবে একটি পুঙ্খানুপুঙ্খ ব্যাখ্যা জন্য, দেখুন https://stackoverflow.com/a/21761956/111948


6
2018-05-28 17:48





আপনি ব্যবহার করতে পারেন যে সচেতন sudo আপনি একটি শেল দিতে যেখানে আপনি নির্বাচিত ব্যবহারকারী হিসাবে কমান্ড চালাতে পারেন?

-আই, - লোগিন

লগইন শেল হিসাবে টার্গেট ব্যবহারকারীর পাসওয়ার্ড ডাটাবেস এন্ট্রি দ্বারা নির্দিষ্ট শেলটি চালান। এর অর্থ লগইন-নির্দিষ্ট সংস্থান ফাইল যেমন                    .profile বা .login শেল দ্বারা পড়া হবে। একটি কমান্ড নির্দিষ্ট করা হলে, shell--c বিকল্পের মাধ্যমে সঞ্চালনের জন্য শেলটিতে প্রেরণ করা হয়। যদি না                    কমান্ড নির্দিষ্ট করা হয়, একটি ইন্টারেক্টিভ শেল নির্বাহ করা হয়। শেল চালানোর আগে sudo ব্যবহারকারীর হোম ডিরেক্টরিতে পরিবর্তন করার প্রচেষ্টা করে। কম-                    ম্যান্ড একটি ব্যবহারকারীর সাথে লগ ইন করে একটি পরিবেশের অনুরূপ পরিবেশের সাথে চালিত হয়। sudoers (5) ম্যানুয়াল ডকু-কমান্ড পরিবেশ বিভাগের কমান্ড এনভায়রনমেন্ট বিভাগ                    sudoers নীতি ব্যবহার করা হয় যখন একটি কমান্ড চালানো হয় যেখানে পরিবেশ -i বিকল্প পরিবেশ প্রভাবিত করে কিভাবে।


4
2017-09-03 09:22



এই আমার সুস্পষ্ট সমাধান মত মনে হয়। > সুডো-ই-ব্র ব্রিয়ান - code_monk
রিমোট অ্যাক্সেস ক্ষেত্রে "ssh -t" এর সাথে মিলিত হলে এটি সর্বোত্তম কাজ করে। যা প্রশ্ন অন্তর্ভুক্ত করা হয়, কিন্তু "আমি এই / পুরো / পাতা" পড়তে পারেন না জন্য পুনরাবৃত্তি বহন। :) - dannysauer


আপনি আপনার স্থানীয় মেশিনে এবং তারপর স্ক্রিপ্ট সংজ্ঞায়িত করতে পারেন cat এবং রিমোট মেশিনে এটি পাইপ:

user@host:~/temp> echo "echo 'Test'" > fileForSsh.txt
user@host:~/temp> cat fileForSsh.txt | ssh localhost

Pseudo-terminal will not be allocated because stdin is not a terminal.
stty: standard input: Invalid argument
Test

3
2017-09-02 09:39



UUOC আপনি ব্যবহার করতে পারেন < - Iain
আপনি অন্তর্ভুক্ত উদাহরণ পরিবর্তন করতে পারেন sudo -u scriptuser? আমি হিপডোক ব্যবহারযোগ্য হতে চাই, কেননা স্ক্রিপ্টে ভেরিয়েবল থাকা দরকার আমি মেশিনে পাইপ করতে চাই? - VoY
আমি চেষ্টা করছিলাম: echo "sudo `cat fileForSsh.txt`" | ssh ... কিন্তু আমি পেয়ে রাখা sudo: sorry, you must have a tty to run sudo। - jas_raj
যদিও এই প্রশ্ন যদি আপনি পেতে পারেন সাহায্য করতে পারেন /etc/sudoers ফাইল পরিবর্তন - jas_raj
এটি আমার জন্য কাজ করে: ssh -tq user@host "sudo bash -s" < test.sh - AVee


সহজ এবং সহজ।

ssh user @ servidor "bash -s" <script.sh


1
2017-09-03 20:15