এসএসএইচকে একটি নির্দিষ্ট শেল ব্যবহার করতে বাধ্য করুন


29

ব্যবহারকারীর ডিফল্ট শেলটি নির্বিশেষে দূরবর্তী প্রান্তে এসএসএইচকে কোনও নির্দিষ্ট শেল ব্যবহার করতে বাধ্য করার কোনও উপায় আছে কি?

আমি সমাধানগুলির অনুরূপ সমাধানগুলি চেষ্টা করেছি:

ssh host.domain.com /bin/bash -c 'complicated, multi-line command'

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


উত্তর:


8

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


1
আমি শেষ পর্যন্ত এটিই করেছি, তবে স্কিপ ব্যবহার করছি। খুবই ভালো ধারনা.
পলাইনহান

16

একটি বংশগত ব্যবহার করুন:

ssh host.domain.com /bin/bash << EOF
big ugly commands
lots of them
EOF

স্ট্যাডিনের আদেশগুলি পড়ার জন্য আপনার কি "-s" ব্যবহার করা উচিত নয়?
ওয়েবোয়েড

এটি সর্বদা প্রয়োজন হয় না।
Ignacio Vazquez-Abram

আমি যদি এটি করতে পারি তবে আমি এটিকে ভোট দিয়ে দেব কারণ এটি স্ট্যান্ডিনে প্রবেশের আদেশগুলি রোধ করে এবং প্রশ্নটি একটি নির্দিষ্ট শেলটি চাওয়ার বিষয়ে ছিল।
এরিক

3
@ এরিকউড্রুফ, ... একটি নির্দিষ্ট শেল (এই ক্ষেত্রে বাশ) আহ্বান করা ঠিক এটি কীভাবে করবেন তা দেখায়।
চার্লস ডাফি

1
এফওয়াইআই আপনিও করতে পারেন cat /tmp/tempfile_containing_your_script ssh ${hostname} /bin/bash। তাই এক ধাপ এর পরিবর্তে আপনি দুই ধাপ আছে: ধাপ 1 একটি ফাইল, ধাপ 2 আপনার স্ক্রিপ্টের কপি catকরার স্ক্রিপ্ট ssh
ট্রেভর বয়েড স্মিথ

10

কী-ভিত্তিক লগইনগুলি ব্যবহার করুন, পাসওয়ার্ড ভিত্তিক নয়। তারপরে আপনি সার্ভারে ইনস্টল করা ( SSH1 এর জন্য 1 / .ssh / अधिकृत_keys ফাইলে ) আপনার সর্বজনীন ssh কী ( SSH1 এর ক্ষেত্রে "বিকল্পগুলি" ক্ষেত্রে ) একটি "জোরপূর্বক কমান্ড (গুলি)" যুক্ত করতে পারেন SS , H / .ssh2 / এসএসএইচ 2 এর জন্য অনুমোদন )।

আপনার বাধ্যতামূলক কমান্ডটি তৈরি করুন যাতে আপনার কাঙ্ক্ষিত শেলটি ...

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

গুগলের মাধ্যমে "জোরপূর্বক আদেশগুলি" সম্পর্কে পড়ুন ।


ভাল জিনিস. ও'রিলি পৃষ্ঠায় সেই গ্রাফিকটি খুব সুন্দর। আমার বিশেষ ক্ষেত্রে, তবে আমি যে কোনও ব্যবহারকারীর জন্য এটি জোর করতে সক্ষম হতে চাই, কেবলমাত্র তাদের ব্যবহারকারীদের জন্য নয় যারা নিজের কীগুলি সঠিকভাবে সেট আপ করেছেন। সার্ভার মেশিনেও আমার রুট নেই, তাই আমি পছন্দ মতো ফাইলগুলি সম্পাদনা করতে পারি না /etc/sshrc
পলাইনহান

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

ক্লায়েন্ট যদি নির্বিচারে কমান্ড চালাতে পারে তবে ক্লায়েন্ট একটি কমান্ড হিসাবে একটি স্বেচ্ছাসেবী শেলও চালাতে পারে।
এরিক উডরুফ

@ কুর্টফেফিল যে ও'রিলির লিঙ্কটি নষ্ট হয়েছে
ব্রায়ান ভ্যান্ডেনবার্গ

@ ব্রায়ানভেনডেনবার্গ: ইঙ্গিতটির জন্য ধন্যবাদ আমি এখন সেই লিঙ্কটি সরিয়েছি।
কুর্ট ফেফিল

2

আপনি -tযে প্রোগ্রামটি শুরু করতে চান তার জন্য সিডো-টিটির বরাদ্দ করার জন্য বিকল্পটি ব্যবহার করতে পারেন , যেন আপনি স্ট্যান্ডার্ড শেলটি চালাচ্ছেন। তারপরে আপনি যে শেলটি চান তা প্লেইন পুরানো আর্গুমেন্ট হিসাবে পাস করুন।

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

me@my-machine $ ssh root@myhost -t bash
root@myhost:~# exit
Connection to myhost closed.
me@my-machine $ ssh root@myhost -t sh
# exit
Connection to myhost closed.
me@my-machine $ 

এটি লগইন শেল কিনা তা নিশ্চিত নন তবে লগইন শেলের মতো ব্যাশ অ্যাক্ট করার বিকল্প রয়েছে, যাতে আপনার শেলটিতেও এটি থাকতে পারে।


1

আশ্চর্যজনকভাবে আমি নিম্নলিখিতগুলির সাথে বিভিন্ন ফলাফল দেখি:

ড্যাশ চালানো:

ssh eric@172.17.1.241 /bin/bash -c "echo <(cat)"                                              
sh: 1: Syntax error: "(" unexpected

বনাম বাশ:

ssh eric@172.17.1.241 '/bin/bash -c "echo <(cat)"'                                            
/dev/fd/63

সম্পূর্ণ উদ্ধৃত কমান্ডটি প্রত্যাশা অনুযায়ী কাজ করা দেখানো হচ্ছে।


1
মোটেও অবাক হওয়ার কিছু নেই। রিমোট ssh ডিমন কার্যকরভাবে চলমান sh -c "$*"। এইভাবে, আপনি দৌড়াচ্ছেন sh -c "/bin/bash -c echo <(cat)"; echoকমান্ড নিজেই শুধুমাত্র যুক্তি প্রেরণ করা -c, এবং <(cat)একটি পৃথক যুক্তি পুরাপুরি হয়।
চার্লস ডাফি

0

আমি কিছুক্ষন আগে একই ধরণের পরিস্থিতির মুখোমুখি হয়েছিলাম যেখানে স্ক্যালপ্লাসের জন্য আমাকে ksh কোপ্রোসেস ব্যবহার করার প্রয়োজন ছিল এবং আমার কেবল একটি এসএসএস ছিল যার মাধ্যমে পড়তে এবং লিখতে হবে অবশ্যই।

এটি করার একটি উপায় হ'ল দূরবর্তী মেশিনে আপনার সমস্ত নির্ভরশীল কমান্ডকে এক লাইনে (ব্যবহার;) থেকে / usr / bin / ksh টি পাইপ করা। উদাহরণ স্বরূপ:

host="user@host"

db_conn="ora_user/passwd"

a="select * from dual;"

frmt="set heading off echo off feedback off verify off pagesize 0 termout off"

var=$(ssh ${host} "echo 'sqlplus -silent /nolog |&; sql_pid=\$!; print -p \"conn ${db_conn}\"; print -p \"${frmt}\"; print -p \"${a}\"; print -p \"exit\"; wait \$sql_pid' > /remote_dir/kshcmd.txt; awk '{print \$0}' /remote_dir/kshcmd.txt | /usr/bin/ksh")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.