আমি sudo
একটি পাসওয়ার্ড ছাড়াই চালানোর জন্য কনফিগার করেছি , তবে যখন আমি চেষ্টা ssh 'sudo Foo'
করি তখনও ত্রুটি বার্তাটি পাই sudo: sorry, you must have a tty to run sudo
।
কেন এটি ঘটে এবং আমি কীভাবে এটি ঘিরে কাজ করতে পারি?
আমি sudo
একটি পাসওয়ার্ড ছাড়াই চালানোর জন্য কনফিগার করেছি , তবে যখন আমি চেষ্টা ssh 'sudo Foo'
করি তখনও ত্রুটি বার্তাটি পাই sudo: sorry, you must have a tty to run sudo
।
কেন এটি ঘটে এবং আমি কীভাবে এটি ঘিরে কাজ করতে পারি?
উত্তর:
এটি সম্ভবত কারণ আপনার /etc/sudoers
ফাইল (বা এটির অন্তর্ভুক্ত যে কোনও ফাইলের) রয়েছে:
Defaults requiretty
... যার sudo
জন্য একটি টিটিওয়াই দরকার। রেড হ্যাট সিস্টেমগুলি (আরএইচইএল, ফেডোরা ...) ডিফল্ট sudoers
ফাইলে একটি টিটিওয়াই প্রয়োজন বলে জানা গেছে । এটি কোনও আসল সুরক্ষা সুবিধা সরবরাহ করে না এবং নিরাপদে সরানো যেতে পারে।
রেড হ্যাট সমস্যা স্বীকার করেছে এবং এটি ভবিষ্যতে প্রকাশে মুছে ফেলা হবে।
তাহলে সার্ভারের কনফিগারেশন পরিবর্তন একটি কাজ-অ্যারাউন্ড যে ভুল কনফিগারেশনের জন্য যেমন একটি বিকল্প না হয় তবে আপনি ব্যবহার করতে পারে -t
বা -tt
অপশন ssh
যা সিউডো-টার্মিনাল দূরবর্তী পাশ spawns কিন্তু হুঁশিয়ার এটা পাশ একটি নম্বর আছে প্রভাব.
-tt
ইন্টারেক্টিভ ব্যবহারের জন্য বোঝানো হয়। এটি স্থানীয় টার্মিনালটি raw
মোডে রাখে যাতে আপনি দূরবর্তী টার্মিনালের সাথে ইন্টারঅ্যাক্ট করেন। এর অর্থ হ'ল যদি ssh
I / O টার্মিনাল থেকে / না হয় তবে এর পার্শ্ব প্রতিক্রিয়া হবে। উদাহরণস্বরূপ, সমস্ত ইনপুট ফিরে প্রতিধ্বনিত করা হবে, বিশেষ টার্মিনাল অক্ষর ( ^?
, ^C
, ^U
) বিশেষ প্রক্রিয়াকরণ করব | আউটপুটতে, LF
গুলি গুলি এস তে রূপান্তরিত হবে CRLF
... (আরও এই তথ্যের জন্য এই বাইনারি ফাইলটি কেন পরিবর্তন করা হচ্ছে তার এই উত্তরটি দেখুন।
প্রভাব কমাতে, আপনি এটি হিসাবে এইভাবে প্রার্থনা করতে পারেন:
ssh -tt host 'stty raw -echo; sudo ...' < <(cat)
< <(cat)
স্থানীয় টার্মিনাল সেটিং (যদি থাকে) মধ্যে এড়াতে হবে raw
মোড। এবং আমরা stty raw -echo
দূরবর্তী টার্মিনালের লাইন শৃঙ্খলাটি সেট করার জন্য ব্যবহার করছি (কার্যকরভাবে এটি পাইপের মতো আচরণ করে যা সিউডো-টার্মিনালের পরিবর্তে ব্যবহৃত হবে -tt
, যদিও এটি কেবল সেই আদেশটি চালানোর পরে প্রযোজ্য, সুতরাং আপনার প্রয়োজন এটি না হওয়া পর্যন্ত ইনপুটটির জন্য কিছু প্রেরণে বিলম্ব করা)।
মনে রাখবেন যেহেতু রিমোট কমান্ডের আউটপুটটি টার্মিনালে যাবে, এটি এখনও এর বাফারিংকে প্রভাবিত করবে (যা অনেক অ্যাপ্লিকেশনগুলির জন্য লাইন-ভিত্তিক হবে) এবং ব্যান্ডউইথ দক্ষতা TCP_NODELAY
চালু রয়েছে। এছাড়াও -tt
, ssh
IPQoS এর 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'
(ধরে নিচ্ছি (উভয়ের জন্য) দূরবর্তী ব্যবহারকারীর লগইন শেল বোর্নের মতো)।
ডিফল্টরূপে, SUDO টিটিওয়াইয়ের জন্য কনফিগার করা হয়। এটি, লগ-ইন শেল থেকে সুডো চালানো হবে বলে আশা করা হচ্ছে। আপনি -t
আপনার এসএসএইচ অনুরোধে স্যুইচটি যুক্ত করে এই প্রয়োজনীয়তাটি হারাতে পারেন :
ssh -t someserver sudo somecommand
-t
একটি সিউডো-TTY বাহিনী বরাদ্দ।
আপনি যদি বিশ্বব্যাপী এটি সম্পাদন করতে চান তবে /etc/sudoers
নির্দিষ্ট করতে সংশোধন করুন !requiretty
। এটি প্রতি ব্যবহারকারীর জন্য, প্রতি গ্রুপ বা সমস্ত-পরিবেশন স্তরের মাধ্যমে করা যেতে পারে।
আমি ডকার এবং সেন্টোস 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 এ পেয়েছি
একটি আকর্ষণীয় বিকল্প হ'ল ফ্রিআইপিএ বা আইডিএম চালানো আপনার ব্যবহারকারীদের এবং সুডোর বিধিগুলি কেন্দ্রীয়ভাবে পরিচালনা করতে। তারপরে আপনি sudo বিধি তৈরি করতে পারেন এবং বিকল্পটি নির্ধারণ করতে পারেন
! requiretty
নিয়মে কমান্ডটি তখন প্রত্যাশার মতো চলবে। আপনার একক কনফিগারেশন থেকে সমস্ত সার্ভার এবং ব্যবহারকারীদের পরিচালনা করার সুবিধাও রয়েছে।
আমারো একই ইস্যু ছিল. আমার ক্ষেত্রে, সমাধান দুটি লাইন ছিল
myscript=$(cat ssh_test.sh)
ssh -t user@host "$myscript"
ব্যাখ্যা:
আপনি যে কমান্ডগুলি চালাতে চান তা (sudo কমান্ড সহ) একটি স্ক্রিপ্টে রাখুন যেমন "ssh_test.sh"।
পুরো স্ক্রিপ্টটি "মাইক্রিপ্ট" নামে একটি ভেরিয়েবলে পড়ুন।
মাত্র এক-টি দিয়ে এসএসকে আহ্বান করুন এবং কমান্ডের পরিবর্তে ভেরিয়েবল সরবরাহ করুন।
এর আগে, স্টিডিনের পাঠের সংমিশ্রণ এবং হেরডোকগুলি ব্যবহার করে আমি সমস্যার মধ্যে পড়েছিলাম
requiretty
এর ডিফল্ট sudoers ছিল। এটি নতুন রিলিজগুলিতে স্থির করা হবে