ssh ওভার sudo করার সঠিক উপায়


150

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

ssh user@server "sudo script"

এটি করার যথাযথ উপায় কী তাই আমি টাইপ করতে পারছি না এমনভাবে এসএসএইচ-এর মাধ্যমে sudo এর জন্য পাসওয়ার্ডটি টাইপ করতে পারি?


2
আমার হিসাবে, ssh এর মাধ্যমে sudoing এর উপায় অনুসন্ধান করার কারণটি হ'ল এটির মতো কিছু চেষ্টা করার সময় কাজ করা হচ্ছিল না ssh <user@server> sudo <script>, কারণ আমি ত্রুটিটি sudo: no tty present and no askpass program specified
পাচ্ছিলাম

উত্তর:


244

অন্য -tউপায়টি এতে স্যুইচটি ব্যবহার করা হয় ssh:

ssh -t user@server "sudo script"

দেখুন man ssh:

 -t      Force pseudo-tty allocation.  This can be used to execute arbi-
         trary screen-based programs on a remote machine, which can be
         very useful, e.g., when implementing menu services.  Multiple -t
         options force tty allocation, even if ssh has no local tty.

2
ভাল, আমি -t বিকল্পটি জানতাম, কেবল এটি জানত না যে এটি সুডো প্রম্পটের জন্য কাজ করেছে।

3
-t বিকল্পটি কী?
ভিন্স


3
এটি এখানে কাজ করছে না: ssh -t localhost <<< "sudo touch file;"সম্পাদনা সম্পাদনা করুন স্পষ্টতই এটি গুরুত্বপূর্ণ যে আপনি আসলে প্যারামিটার হিসাবে কমান্ডটি সরবরাহ করেছিলেন, এটি স্ট্যান্ডার্ডের মাধ্যমে নয় (যা এই ক্ষেত্রে দৃষ্টিগোচর করে তোলে)।
সীমিত প্রায়শ্চিত্ত

-tপদ্ধতি যা স্বাভাবিকভাবে তাই কম্যান্ডের রঙ্গিন আউটপুট প্রদর্শন করবে।
কর্মকাজে

24

আমি নিম্নলিখিত কমান্ডটি দিয়ে এটি সম্পূর্ণ স্বয়ংক্রিয়ভাবে সক্ষম হয়েছি:

echo pass | ssh -tt user@server "sudo script"

সুবিধাদি:

  • কোনও পাসওয়ার্ড প্রম্পট নেই
  • রিমোট মেশিন ব্যাশ ইতিহাসে পাসওয়ার্ড প্রদর্শন করবে না

সুরক্ষা সম্পর্কে: কার্ট যেমন বলেছিলেন, এই কমান্ডটি চালানো আপনার স্থানীয় বাশ ইতিহাসে আপনার পাসওয়ার্ডটি প্রদর্শন করবে এবং পাসওয়ার্ডটি অন্য কোনও ফাইলে সংরক্ষণ করা বা একটি .sh ফাইলে সমস্ত কমান্ড সংরক্ষণ করে কার্যকর করা ভাল। দ্রষ্টব্য: ফাইলটির সঠিক অনুমতি থাকা দরকার যাতে কেবলমাত্র অনুমোদিত ব্যবহারকারীরা এটি অ্যাক্সেস করতে পারে।


8
এটি পাসওয়ার্ড সহ স্থানীয় সিস্টেমের ব্যাশ ইতিহাসে প্রদর্শিত হবে। পাসওয়ার্ডটি কোনও ফাইলে সংরক্ষণ করা এবং ফাইলটি বিড়াল করা ভাল।
কুর্ট ফিটৎসনার

4
ম্যান, আমি জানতাম -t, তবে আমি সঠিকভাবে ম্যানুয়ালটি পড়িনি যে আপনি এটি দুটিবার পাস করতে পারেন! আমি এই কি কয়েক মাস ধরে খুঁজছিলাম ! সুরক্ষা সংযোজন হিসাবে, আমি চালানোর আগে কেবল পাসওয়ার্ড ভেরিয়েবল সেট করেছিলাম read -s -p "Password: " pw, এর পরেও করেছি echo "$pw" | ....। আমি এখন এটি নিজের জন্য একটি সহজ স্ক্রিপ্টে রোল করেছি :) :) :)
কায়েল

আমার জন্য মোহন মত কাজ!
MiKr13

আপনার চালানোর জন্য নির্দিষ্ট ব্যবহারকারী এবং কমান্ডের জন্য আপনি কেবল পাসওয়ার্ডহীন সুডো সেট আপ করবেন না কেন? এটি কোনও এসএসএইচ সমস্যা নয় ...
নাম

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

6

ধরে নিচ্ছি আপনি কোনও পাসওয়ার্ড প্রম্পট চান না :

ssh $HOST 'echo $PASSWORD | sudo -S $COMMMAND'

উদাহরণ

ssh me@localhost 'echo secret | sudo -S echo hi' # outputs 'hi'

14
এটি / খুব / বিপজ্জনক কারণ প্লেইন্টেক্সট পাসওয়ার্ডটি কমান্ড লাইনে শেষ হয় on কমান্ড লাইনগুলি সর্বজনীন এবং সিস্টেমে প্রতিটি ব্যবহারকারী এবং প্রক্রিয়া দ্বারা দেখা যায়। উদাহরণস্বরূপ, একটি অপ্রত্যাশিত ব্যবহারকারী দ্বারা "পিএস অক্সwwwww" প্রতিটি প্রক্রিয়া চলমান এবং তাদের চালানো কমান্ড লাইনগুলি প্রদর্শন করবে ।
কুর্ট ফিটৎসনার

3
Bash_history ফাইলটিতে আপনার পাসওয়ার্ড (প্লেইন টেক্সটে) রাখার উল্লেখ নেই।
লেইন বার্নার্ডো

4

এসএসএইচ পাসওয়ার্ড পাস করে সুদো, কোনও প্রকারের দরকার নেই:

আপনি sudo একটি ইন্টারেক্টিভ পাসওয়ার্ড প্রয়োজন হয় না এবং কেবল স্টিডিন বন্ধ পাসওয়ার্ড দখল করতে suud কে একটি সিউডো-টিটি (ssh "-t" স্যুইচ ব্যবহার না করে) জোর করে ছাড়িয়ে ssh ওভার ssh ব্যবহার করতে পারেন। আপনি sudo অন "-S" স্যুইচ ব্যবহার করে এটি করেন। এটি স্টিডিনে পাসওয়ার্ডের জন্য সুডো শোনায় এবং এটি যখন একটি নতুন লাইন দেখবে তখন শুনা বন্ধ করে দেয়।

উদাহরণ 1 - সাধারণ রিমোট কমান্ড

এই উদাহরণে, আমরা একটি সাধারণ whoamiকমান্ড প্রেরণ করি :

$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root

আমরা sudo কে প্রম্পট জারি না করার জন্য এবং স্ট্যান্ডিনের কাছ থেকে এর ইনপুট নেওয়ার জন্য বলছি। এটি সুডো পাসওয়ার্ডকে সম্পূর্ণ নিঃশব্দে অতিক্রম করে তোলে তাই আপনার ফিরে পাওয়া একমাত্র প্রতিক্রিয়া হ'ল আউটপুট whoami

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

উদাহরণ 2 - রিমোট কমান্ড যা তার নিজস্ব স্টিডিনের প্রয়োজন

নিম্নলিখিত উদাহরণে, দূরবর্তী কমান্ড "ক্যাট" সুডোর মাধ্যমে কার্যকর করা হয় এবং আমরা স্টিমিনের মাধ্যমে দূরবর্তী বিড়ালটি প্রদর্শনের জন্য কিছু অতিরিক্ত লাইন সরবরাহ করছি।

$ ssh user@server cat \| sudo --prompt="" -S -- "cat" << EOF
> <remote_sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2

আউটপুটটি দেখায় যে <remote_sudo_password>লাইনটি sudo দ্বারা গ্রাস করা হচ্ছে এবং দূরবর্তীভাবে কার্যকর করা বিড়ালটি তখন অতিরিক্ত লাইনগুলি প্রদর্শন করছে।

আপনি যদি কমান্ড লাইনটি ব্যবহার না করে কোনও সুবিধাযুক্ত কমান্ডে পাসওয়ার্ড দেওয়ার জন্য ssh ব্যবহার করতে চান তবে এটি কোথায় উপকারী হবে তার একটি উদাহরণ। বলুন, আপনি যদি ssh- র মাধ্যমে কোনও রিমোট এনক্রিপ্ট করা ধারক মাউন্ট করতে চান।

উদাহরণ 3 - একটি দূরবর্তী Verarypt কনটেইনার মাউন্ট করা

এই উদাহরণ স্ক্রিপ্টে, আমরা কোনও অতিরিক্ত প্রম্পটিং পাঠ্য ছাড়াই দূরবর্তীভাবে সুডোর মাধ্যমে ভেরাক্রিপ কনটেইনারটি মাউন্ট করছি:

#!/bin/sh
ssh user@server cat \| sudo --prompt="" -S -- "veracrypt --non-interactive --stdin --keyfiles=/path/to/test.key /path/to/test.img /mnt/mountpoint" << EOF
SudoPassword
VeraCryptContainerPassword
EOF

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

উদাহরণ 1 এ - উদাহরণ 1 স্থানীয় কমান্ড-লাইন পাসওয়ার্ড ছাড়াই

প্রথম উদাহরণটি এইভাবে হয়ে উঠবে:

$ cat text_file_with_sudo_password | ssh user@server cat \| sudo --prompt="" -S -- whoami
root

উদাহরণ 2 এ - উদাহরণ 2 স্থানীয় কমান্ড-লাইন পাসওয়ার্ড ছাড়াই

এবং দ্বিতীয় উদাহরণ হয়ে উঠবে:

$ cat text_file_with_sudo_password - << EOF | ssh va1der.net cat \| sudo --prompt="" -S -- cat
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2

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


Ssh রিমোট কমান্ডে, আপনাকে catফলাফলগুলি কার্যকর করতে এবং সুডোতে পাইপ করা দরকার কেন ? আপনি কি sudoমূল এসএসএস রিমোট কমান্ড হিসাবে ব্যবহার করতে পারেন ?
জোয়ানপাউ

@ জোয়ানপাউ প্রাথমিকভাবে catব্যবহারকারীর পাসওয়ার্ডটি পাইপ করার জন্য অন্যদিকে সুডো করতে ব্যবহৃত হয়। যদি ব্যবহারকারী কোনও পাসওয়ার্ড ছাড়াই সুডো চালাতে পারেন, তবে এটির প্রয়োজন নেই, তবে আমি এই কনফিগারেশনটির পরামর্শ দিচ্ছি না। এটি যেভাবে পাইপ করা হয়েছে তা হ'ল দূরবর্তী সিস্ট্রেমের কমান্ড লাইনে পাসওয়ার্ডটি প্রদর্শিত হতে বাধা দেওয়া। কমান্ড লাইনগুলি সুরক্ষিত নয়, যে কোনও ব্যবহারকারীর সাথে প্রতিটি কমান্ড লাইন দেখতে পাবেন ps auxwww
কুর্ট ফিটৎসনার

আমি catssh কমান্ডের জন্য জিজ্ঞাসা করছি cat \| sudo --prompt="" -S...। স্টিডিন থেকে পাসওয়ার্ড পড়ার জন্য যদি -Sবাহিনী sudo, বিড়াল এবং পাইপ কি আদৌ প্রয়োজনীয়? Ssh কমান্ড সহজভাবে হতে পারে sudo --prompt="" -S...?
জোয়ানপাউ

@ জোনপাউ এই বিড়াল কমান্ডটি সুডো পাসওয়ার্ডটি পাস করার জন্য স্টিডিন নিচ্ছে এবং এটি সুডোর মাধ্যমে পাইপ দিচ্ছে। এটি স্ট্যান্ডিনের মাধ্যমে আপনি কীভাবে sudo পাসওয়ার্ডটি নিরাপদে সুরক্ষিত করতে পারবেন তা প্রদর্শিত হচ্ছে।
কুর্ট ফিৎসনার

1

ssh -t user@server "sudo <scriptname>"উদাহরণস্বরূপ সর্বোত্তম উপায় ssh -t user@server "sudo reboot"। এটি প্রথমে ব্যবহারকারীর জন্য পাসওয়ার্ডের অনুরোধ জানাবে এবং তারপরে রুট হবে (যেহেতু আমরা স্ক্রিপ্টটি চালাচ্ছি বা রুট বিশেষাধিকারের সাথে আদেশ দিচ্ছি)।

আমি আশা করি এটি আপনার সন্দেহকে সহায়তা করেছে এবং সাফ করেছে।


0

NOPASSআপনার টার্গেট মেশিনে কনফিগারেশন হল সমাধান। Http://maestric.com/doc/unix/ubuntu_sudo_without_password এ পড়া চালিয়ে যান


6
এই ক্ষেত্রে আমি আসলে একটি পাসওয়ার্ড চাই এবং এটি সরাসরি টাইপ করতে পারি, সুতরাং এটি আমার পক্ষে কার্যকর হয় না।
অন্ধকাররেখ


-1

আমি একটি সমস্যার মুখোমুখি,

user1@server1$ ssh -q user1@server2 sudo -u user2 rm -f /some/file/location.txt

Output:
sudo: no tty present and no askpass program specified

তারপরে চেষ্টা করেছি

#1
vim /etc/sudoers
Defaults:user1    !requiretty

কাজ হয়নি

#2
user1   ALL=(user2)         NOPASSWD: ALL

যে সঠিকভাবে কাজ!


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

-7

আপনার ব্যবহারের উপর নির্ভর করে, আমি নিম্নলিখিতগুলির সাথে সাফল্য পেয়েছি:

ssh root@server "script"

এটি রুট পাসওয়ার্ডের জন্য অনুরোধ জানাবে এবং তারপরে সঠিকভাবে কমান্ডটি কার্যকর করবে।


26
হাই, এসএসএইচ রুট হিসাবে? এটি বিভিন্ন ধরণের কারণে একটি খারাপ ধারণা।
অন্ধকাররেখা

12
মনে রাখবেন ssh টেলনেট নয়। অন্য ব্যবহারকারী হিসাবে ssh চালানো এবং sudo চালানোর চেয়ে এটি রুট হিসাবে ছিটানো আরও বিপজ্জনক নয়। আপনার পাসওয়ার্ডটি ssh সংযোগের মাধ্যমে একইভাবে এনক্রিপ্ট করা হয়েছে।
স্টাফেন

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