আমি যদি পাসওয়ার্ড ছাড়াই সুডো করতে পারি তবে সুডো চালাতে আমার টিটিআইয়ের কী দরকার?


226

আমি sudoএকটি পাসওয়ার্ড ছাড়াই চালানোর জন্য কনফিগার করেছি , তবে যখন আমি চেষ্টা ssh 'sudo Foo'করি তখনও ত্রুটি বার্তাটি পাই sudo: sorry, you must have a tty to run sudo

কেন এটি ঘটে এবং আমি কীভাবে এটি ঘিরে কাজ করতে পারি?

উত্তর:


290

এটি সম্ভবত কারণ আপনার /etc/sudoersফাইল (বা এটির অন্তর্ভুক্ত যে কোনও ফাইলের) রয়েছে:

Defaults requiretty

... যার sudoজন্য একটি টিটিওয়াই দরকার। রেড হ্যাট সিস্টেমগুলি (আরএইচইএল, ফেডোরা ...) ডিফল্ট sudoersফাইলে একটি টিটিওয়াই প্রয়োজন বলে জানা গেছে । এটি কোনও আসল সুরক্ষা সুবিধা সরবরাহ করে না এবং নিরাপদে সরানো যেতে পারে।

রেড হ্যাট সমস্যা স্বীকার করেছে এবং এটি ভবিষ্যতে প্রকাশে মুছে ফেলা হবে।

তাহলে সার্ভারের কনফিগারেশন পরিবর্তন একটি কাজ-অ্যারাউন্ড যে ভুল কনফিগারেশনের জন্য যেমন একটি বিকল্প না হয় তবে আপনি ব্যবহার করতে পারে -tবা -ttঅপশন sshযা সিউডো-টার্মিনাল দূরবর্তী পাশ spawns কিন্তু হুঁশিয়ার এটা পাশ একটি নম্বর আছে প্রভাব.

-ttইন্টারেক্টিভ ব্যবহারের জন্য বোঝানো হয়। এটি স্থানীয় টার্মিনালটি rawমোডে রাখে যাতে আপনি দূরবর্তী টার্মিনালের সাথে ইন্টারঅ্যাক্ট করেন। এর অর্থ হ'ল যদি sshI / O টার্মিনাল থেকে / না হয় তবে এর পার্শ্ব প্রতিক্রিয়া হবে। উদাহরণস্বরূপ, সমস্ত ইনপুট ফিরে প্রতিধ্বনিত করা হবে, বিশেষ টার্মিনাল অক্ষর ( ^?, ^C, ^U) বিশেষ প্রক্রিয়াকরণ করব | আউটপুটতে, LFগুলি গুলি এস তে রূপান্তরিত হবে CRLF... (আরও এই তথ্যের জন্য এই বাইনারি ফাইলটি কেন পরিবর্তন করা হচ্ছে তার এই উত্তরটি দেখুন।

প্রভাব কমাতে, আপনি এটি হিসাবে এইভাবে প্রার্থনা করতে পারেন:

ssh -tt host 'stty raw -echo; sudo ...' < <(cat)

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

মনে রাখবেন যেহেতু রিমোট কমান্ডের আউটপুটটি টার্মিনালে যাবে, এটি এখনও এর বাফারিংকে প্রভাবিত করবে (যা অনেক অ্যাপ্লিকেশনগুলির জন্য লাইন-ভিত্তিক হবে) এবং ব্যান্ডউইথ দক্ষতা TCP_NODELAYচালু রয়েছে। এছাড়াও -tt, sshIPQoS এর lowdelayবিপরীতে সেট করে throughput। আপনি উভয়ের সাথে চারপাশে কাজ করতে পারেন:

ssh -o IPQoS=throughput -tt host 'stty raw -echo; sudo cmd | cat' < <(cat)

এছাড়াও, নোট করুন এটির অর্থ হল যে রিমোট কমান্ডটি তার স্টিডিন-এ-ফাইল-এর শেষ সনাক্ত করতে পারে না এবং রিমোট কমান্ডের স্টাডআউট এবং স্টাডার একক প্রবাহে একত্রিত হয়।

সুতরাং, সর্বোপরি এত ভাল কাজ না।

আপনি যদি একটি দূরবর্তী হোস্ট একটি সিউডো-টার্মিনাল ডিম একটি উপায় পেয়েছেন থাকেন (মতো expect, zsh, socat, perlএর IO::Pty...), তাহলে এটি ব্যবহার করতে যে সিউডো-টার্মিনাল সংযুক্ত করতে তৈরি করতে ভাল হবে sudoথেকে (কিন্তু I / O এর জন্য নয়) এবং ব্যবহার sshছাড়াই -t

উদাহরণস্বরূপ, এর সাথে expect:

ssh host 'expect -c "spawn -noecho sh -c {
     exec sudo cmd >&4 2>&5 <&6 4>&- 5>&- 6<&-}
 exit [lindex [wait] 3]" 4>&1 5>&2 6<&0'

অথবা এর সাথে script(এখানে থেকে বাস্তবায়নটি ধরে নিচ্ছেন util-linux):

ssh host 'SHELL=/bin/sh script -qec "
              sudo cmd <&3 >&4 2>&5 3<&- 4>&- 5>&-
            " /dev/null 3<&0 4>&1 5>&2'

(ধরে নিচ্ছি (উভয়ের জন্য) দূরবর্তী ব্যবহারকারীর লগইন শেল বোর্নের মতো)।


30

ডিফল্টরূপে, SUDO টিটিওয়াইয়ের জন্য কনফিগার করা হয়। এটি, লগ-ইন শেল থেকে সুডো চালানো হবে বলে আশা করা হচ্ছে। আপনি -tআপনার এসএসএইচ অনুরোধে স্যুইচটি যুক্ত করে এই প্রয়োজনীয়তাটি হারাতে পারেন :

ssh -t someserver sudo somecommand

-tএকটি সিউডো-TTY বাহিনী বরাদ্দ।

আপনি যদি বিশ্বব্যাপী এটি সম্পাদন করতে চান তবে /etc/sudoersনির্দিষ্ট করতে সংশোধন করুন !requiretty। এটি প্রতি ব্যবহারকারীর জন্য, প্রতি গ্রুপ বা সমস্ত-পরিবেশন স্তরের মাধ্যমে করা যেতে পারে।


5
না, এটি ডিফল্ট নয়। এটি কেবলমাত্র সূডোর রেডহ্যাট বিতরণ যা requirettyএর ডিফল্ট sudoers ছিল। এটি নতুন রিলিজগুলিতে স্থির করা হবে
স্টাফেন চেজেলাস

1
আমাকে আলোকিত করার জন্য @ স্টাফেন চ্যাজেলাস +1 + এটি বর্তমান রেগ হ্যাট এবং এর ভাইবোনদের কাছে আদিবাসী এবং আমি যদি বর্তমান বাগ রিপোর্টটি করতে পারতাম তবে আরও একটি ++!
জেআরফেরগসন

18

Tty বরাদ্দ জোর করতে -tপতাকা ব্যবহার করুন ssh

$ ssh luci tty
not a tty
$ ssh luci -t tty
/dev/ttys003
$

-tবরাদ্দ করার জন্য একটি সেকেন্ড যুক্ত করুন যখনPseudo-terminal will not be allocated because stdin is not a terminal.
সামভিন

11

আমি ডকার এবং সেন্টোস 7 ব্যবহার করে এই সমস্যায় পড়েছি following

yum install -y sudo

sed -i -e 's/Defaults requiretty.*/ #Defaults requiretty/g' /etc/sudoers

আমি এই হ্যাকটি https://hub.docker.com/r/liubin/fluentd-agent/~/dockerfile এ পেয়েছি


1
এই উত্তরটি ডকর এবং সেন্টোস 7 ব্যবহার করেও আমার পক্ষে সবচেয়ে সার্থক করে তুলেছে। এটি অনুলিপি হিসাবে সহজেই কপি / পেস্ট বন্ধুত্বপূর্ণ ছিল!
দাশুন

1

একটি আকর্ষণীয় বিকল্প হ'ল ফ্রিআইপিএ বা আইডিএম চালানো আপনার ব্যবহারকারীদের এবং সুডোর বিধিগুলি কেন্দ্রীয়ভাবে পরিচালনা করতে। তারপরে আপনি sudo বিধি তৈরি করতে পারেন এবং বিকল্পটি নির্ধারণ করতে পারেন

! requiretty

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


0

আমারো একই ইস্যু ছিল. আমার ক্ষেত্রে, সমাধান দুটি লাইন ছিল

myscript=$(cat ssh_test.sh)
ssh -t user@host "$myscript"

ব্যাখ্যা:

  • আপনি যে কমান্ডগুলি চালাতে চান তা (sudo কমান্ড সহ) একটি স্ক্রিপ্টে রাখুন যেমন "ssh_test.sh"।

  • পুরো স্ক্রিপ্টটি "মাইক্রিপ্ট" নামে একটি ভেরিয়েবলে পড়ুন।

  • মাত্র এক-টি দিয়ে এসএসকে আহ্বান করুন এবং কমান্ডের পরিবর্তে ভেরিয়েবল সরবরাহ করুন।

এর আগে, স্টিডিনের পাঠের সংমিশ্রণ এবং হেরডোকগুলি ব্যবহার করে আমি সমস্যার মধ্যে পড়েছিলাম


-1

গুগলিংয়ের সময় আমি এই প্রশ্নটি পেয়েছি এবং সম্পূর্ণ ভিন্ন কারণে আমি এই ত্রুটির মুখোমুখি হয়েছি।

আমার ফিক্সটি হ'ল sudoআমার প্যারেন্ট শেল স্ক্রিপ্ট থেকে ডাউনস্ট্রিম শেল স্ক্রিপ্টগুলি কল করা বন্ধ করা যখন প্যারেন্ট শেল স্ক্রিপ্টটি ইতিমধ্যে কল করা হয়েছিল sudo

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