Ssh এ টার্মিনাল বরাদ্দ না করার সুবিধা কী?


66

প্রতি একবারে একবারে এমন কিছু করব

ssh user@host sudo thing

এবং আমি মনে করিয়ে দিয়েছি যে ssh ডিফল্টরূপে সিউডো-টিটি বরাদ্দ করে না। কেন হয় না? যদি আমি ওরফে আমি কি সুবিধা হারানোর হবে sshথেকে ssh -t?


1
> আমি স্মরণ করিয়ে দিচ্ছি যে ssh কোনও psuedo-tty বরাদ্দ করে না কী হয়? সমস্যাটি কী তা বোঝার জন্য এটি প্রশ্নকে সমৃদ্ধ করবে।
এয়ার

5
@ অ্যার এমন কোনও সমস্যা নেই যা আমি সমাধান করার চেষ্টা করছিলাম। Ssh কীভাবে প্রয়োগ করা হয় তার একটি বিকল্প ছিল যা আমি বুঝতে চেষ্টা করছিলাম। প্রশ্নটি খুব স্পষ্ট এবং অ্যান্ড্রু বিয়ের উত্তরটি প্রশ্নটিকে সুন্দরভাবে সম্বোধন করেছে। উত্তরটির সংক্ষিপ্তসারটি এইভাবে দেওয়া যেতে পারে: দৌড়ানো ssh -tসর্বদা খারাপ কারণ এটি কিছু আদেশকে অদ্ভুত উপায়ে ভাঙ্গতে পারে। অন্যদিকে, PTY- র প্রয়োজন নেই এমন একটি কমান্ড চালনার ফলে একটি পরিষ্কার ত্রুটি বার্তা আসে যে আপনার একটি টার্মিনাল দরকার।
চস 22

উত্তর:


73

প্রাথমিক পার্থক্যটি ইন্টারঅ্যাক্টিভিটির ধারণা । এটি স্ক্রিপ্টের ভিতরে স্থানীয়ভাবে কমান্ডগুলি চালনার অনুরূপ, বনাম সেগুলি নিজেই টাইপ করে। এটি ভিন্ন যে দূরবর্তী কমান্ডটি অবশ্যই একটি ডিফল্ট চয়ন করে এবং অ-ইন্টারেক্টিভ নিরাপদ is (এবং সাধারণত সর্বাধিক সৎ)

stdin

  • যদি কোনও পিটিওয়াই বরাদ্দ করা হয়, অ্যাপ্লিকেশনগুলি এটি সনাক্ত করতে পারে এবং জেনে রাখতে পারে যে জিনিসগুলি ভঙ্গ না করে ব্যবহারকারীকে অতিরিক্ত ইনপুট দেওয়ার জন্য অনুরোধ করা নিরাপদ। এমন অনেক প্রোগ্রাম রয়েছে যা যদি কোনও টার্মিনাল উপস্থিত না থাকে তবে ব্যবহারকারীকে ইনপুট দেওয়ার জন্য অনুরোধ করার পদক্ষেপটি এড়িয়ে যাবে এবং এটি একটি ভাল জিনিস। এটি অন্যথায় অপ্রয়োজনীয়ভাবে স্ক্রিপ্টগুলি স্থির করে দেবে।
  • আপনার ইনপুট আদেশের সময়কালের জন্য রিমোট সার্ভারে প্রেরণ করা হবে। এটি নিয়ন্ত্রণ ক্রম অন্তর্ভুক্ত। যখন Ctrl-cবিরতি সাধারণত ssh কমান্ডের সাথে সাথে একটি লুপ তত্ক্ষণাত্ বিরতি দেয়, আপনার নিয়ন্ত্রণের অনুক্রমগুলি পরিবর্তে দূরবর্তী সার্ভারে প্রেরণ করা হবে। এটি নিয়ন্ত্রণে ssh কমান্ডটি ছেড়ে যাওয়ার পরে তা পৌঁছেছে তা নিশ্চিত করার জন্য কীস্ট্রোকটিকে "হাতুড়ি" দেওয়ার প্রয়োজন হয় , তবে পরবর্তী ssh কমান্ড শুরু হওয়ার আগেই।

ssh -tক্রোনগুলির মতো অপ্রচলিত স্ক্রিপ্টগুলিতে ব্যবহার করার বিরুদ্ধে আমি সতর্কতা অবলম্বন করব। ইনপুট-এর জন্য ইন্টারেক্টিভ আচরণ করার জন্য একটি রিমোট কমান্ডকে জিজ্ঞাসা করে এমন একটি অ-ইন্টারেক্টিভ শেল সব ধরণের ঝামেলা চেয়েছে।

আপনি নিজের শেল স্ক্রিপ্টগুলিতে টার্মিনালের উপস্থিতি পরীক্ষা করতে পারেন। ব্যাশের নতুন সংস্করণ সহ STDIN পরীক্ষা করতে:

# fd 0 is STDIN
[ -t 0 ]; echo $?

stdout- এ

  • যখন এলিয়াস sshকরবেন তখন ssh -tআপনি আশা করতে পারেন আপনার লাইনের শেষের দিকে অতিরিক্ত গাড়ি চালানোর রিটার্ন পাবেন। এটি আপনার কাছে দৃশ্যমান নাও হতে পারে তবে এটি সেখানে রয়েছে; এটি ^Mকখন পাইপ করা হবে তা দেখাবে cat -e। তারপরে আপনাকে অবশ্যই এই নিয়ন্ত্রণ কোডটি আপনার ভেরিয়েবলগুলিতে বরাদ্দ না পেয়েছে তা নিশ্চিত করার জন্য অতিরিক্ত প্রচেষ্টা ব্যয় করতে হবে, বিশেষত যদি আপনি সেই আউটপুটটিকে একটি ডাটাবেসে সন্নিবেশ করতে যাচ্ছেন।
  • এগুলিও ঝুঁকি রয়েছে যে প্রোগ্রামগুলি ধরে নিতে পারে যে তারা আউটপুট রেন্ডার করতে পারে যা ফাইল পুনঃনির্দেশের জন্য বন্ধুত্বপূর্ণ নয়। সাধারণত আপনি যদি কোনও ফাইলে STDOUT পুনর্নির্দেশ করতে চান তবে প্রোগ্রামটি বুঝতে পারে যে আপনার STDOUT কোনও টার্মিনাল নয় এবং কোনও রঙের কোড বাদ দেয়। যদি STDOUT পুনর্নির্দেশটি ssh ক্লায়েন্টের আউটপুট থেকে আসে এবং সেখানে ক্লায়েন্টের দূরবর্তী প্রান্তের সাথে সম্পর্কিত একটি PTY থাকে, দূরবর্তী প্রোগ্রামগুলি এই ধরনের পার্থক্য করতে পারে না এবং আপনি আপনার আউটপুট ফাইলে টার্মিনাল আবর্জনা দিয়ে শেষ করতে পারেন। সংযোগের দূরবর্তী প্রান্তের কোনও ফাইলে আউটপুট পুনর্নির্দেশ করা এখনও প্রত্যাশা মতো কাজ করা উচিত।

এখানে পূর্বের মতো একই বাশ পরীক্ষা দেওয়া হয়েছে তবে স্টাডিআউটের জন্য:

# fd 1 is STDOUT
[ -t 1 ]; echo $?

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

Aliasing sshকরতে ssh -tখুব একটি মামলা যেখানে আপনি নকশা নীতি লঙ্ঘন করা হবে হয় অন্তত বিস্ময় ; লোকেরা এমন সমস্যাগুলির মুখোমুখি হবে যা তারা প্রত্যাশা করে না এবং তারা বুঝতে পারে না যে তাদের কী কারণ ঘটছে।


9
একজনের মনে প্রায়শই ধারণা পাওয়া যায় যে আমি এমন একটি দলে কাজ করেছি যা এই কাজ করেছে ...
অ্যান্ড্রু বি

এই উত্তরের আওতাধীন সুযোগে, এটি দুর্দান্ত। তবে প্রশ্নের একটি বিস্তৃত সুযোগ ছিল, মূলত সমস্ত পার্থক্যগুলি (কী প্রত্যাশা করা উচিত) তা জানতে আগ্রহী। অতিরিক্ত তথ্য: প্রক্রিয়া স্তরে, - প্রথমে একটি টিটিটি বরাদ্দ করা হবে এবং তারপরে একটি শেল চালানো হবে (পথে, সোর্সিং / ইত্যাদি / প্রোফাইল এবং ~ / .bash_profile) এবং তারপরে কমান্ডটি চালানো হবে। -T ছাড়া, ssh বিভিন্ন এনভিলিভ ফাইলগুলি ইনস্টল করে (/etc/bash.bashrc, তারপরে ~ / .bashrc) এবং তখন আপনার কমান্ডটি চালাবে। এর অর্থ আপনি প্রতিটিের মধ্যে খুব আলাদা আচরণ দেখতে পাচ্ছেন: সংক্ষিপ্ত $ পথ, সম্ভবত একটি বাশ 'আনরি' ত্রুটি কারণ আপনি ধরে নিয়েছেন যে ENV ভার সেখানে নেই ...
স্কট প্রাইভ

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

33

এসএসএইচ পালানোর অক্ষর এবং বাইনারি ফাইল স্থানান্তর

একটি সুবিধা আছে যা অন্য উত্তর উল্লেখিত করা হয়েছে যে, যখন অপারেটিং একটি সিউডো-টার্মিনাল ছাড়া , SSH- র অক্ষর অব্যাহতি যেমন ~Cহয় সমর্থিত নয় ; প্রোগ্রামগুলি বাইনারি ফাইলগুলিতে এই সিকোয়েন্সগুলি থাকতে পারে তা স্থানান্তর করতে এটি নিরাপদ করে।

ধারণার প্রমাণ

সিউডো-টার্মিনাল ব্যবহার করে বাইনারি ফাইলটি অনুলিপি করুন:

$ ssh -t anthony@remote_host 'cat /usr/bin/free' > ~/free
Connection to remote_host closed.

সিউডো-টার্মিনাল ব্যবহার না করে একটি বাইনারি ফাইল অনুলিপি করুন:

$ ssh anthony@remote_host 'cat /usr/bin/free' > ~/free2

দুটি ফাইল এক নয়:

$ diff ~/free*
Binary files /home/anthony/free and /home/anthony/free2 differ

সিউডো-টার্মিনালের মাধ্যমে যা অনুলিপি করা হয়েছিল তা দূষিত:

$ chmod +x ~/free*
$ ./free
Segmentation fault

অন্যটি যখন না:

$ ./free2
             total       used       free     shared    buffers     cached
Mem:       2065496    1980876      84620          0      48264    1502444
-/+ buffers/cache:     430168    1635328
Swap:      4128760        112    4128648

এসএসএইচের মাধ্যমে ফাইল স্থানান্তর করা হচ্ছে

এই যেমন প্রোগ্রামের জন্য বিশেষভাবে গুরুত্বপূর্ণ scpবা rsyncকোন ডেটা স্থানান্তরের জন্য, SSH ব্যবহার করুন। এসসিপি প্রোটোকল কীভাবে কাজ করে তার এই বিশদ বিবরণটি ব্যাখ্যা করে যে কীভাবে এসসিপি প্রোটোকল পাঠ্য প্রোটোকল বার্তা এবং বাইনারি ফাইল ডেটার মিশ্রণ ধারণ করে।


ওপেনএসএইচ আপনাকে নিজের থেকে রক্ষা করতে সহায়তা করে

এটি লক্ষণীয় যে -tপতাকাটি ব্যবহৃত হলেও, ওপেনএসএসএইচ sshক্লায়েন্ট একটি সিডো-টার্মিনাল বরাদ্দ করতে অস্বীকার করবে যদি এটি সনাক্ত করে যে এটির stdinস্ট্রিমটি টার্মিনাল নয়:

$ echo testing | ssh -t anthony@remote_host 'echo $TERM'
Pseudo-terminal will not be allocated because stdin is not a terminal.
dumb

আপনি এখনও ওপেনএসএসএইচ ক্লায়েন্টকে সিউডো-টার্মিনাল বরাদ্দ করতে বাধ্য করতে পারেন -tt:

$ echo testing | ssh -tt anthony@remote_host 'echo $TERM'
xterm

উভয় ক্ষেত্রেই, এটি (সংবেদনশীলভাবে) যত্ন করে না stdoutবা stderrপুনঃনির্দেশিত হয়:

$ ssh -t anthony@remote_host 'echo $TERM' >| ssh_output
Connection to remote_host closed.

2
এটি একটি খুব আকর্ষণীয় বিষয় যা আমি বিবেচনা করি নি, এই উত্তরটি যুক্ত করার জন্য ধন্যবাদ!
জেনি ডি

4

রিমোট হোস্টে আমাদের এই সেটিংটি করতে হবে:

/etc/sudoers
...
Defaults requiretty

সুডো ছাড়া

$ ssh -T user@host echo -e 'foo\\nbar' | cat -e
foo$
bar$

এবং sudo সঙ্গে

$ ssh -T user@host sudo echo -e 'foo\\nbar' | cat -e
sudo: sorry, you must have a tty to run sudo

সুডো সহ আমরা অতিরিক্ত গাড়ীর রিটার্ন পাই

$ ssh -t user@host sudo echo -e 'foo\\nbar' | cat -e
foo^M$
      bar^M$
            Connection to localhost closed.

সমাধানটি হ'ল অনুবাদটি নতুনলাইনটি সাথে ক্যারিজ রিটার্ন-নিউলাইনটিতে অক্ষম করাstty -onlcr

$ ssh -t user@host stty -onlcr\; sudo echo -e 'foo\\nbar' | cat -e
foo$
    bar$
        Connection to localhost closed.

1
চমৎকার তবে আউটপুটটি ইন্টেন্টেড /: আপনি কী এটি অটো গাড়ি চালিয়ে দিতে পারবেন কিনা তা জানতে (ইউনিক্সের মতো) কি ঘটতে পারে?
বুধ

1

পিছিয়ে-সামঞ্জস্যতা সম্পর্কে চিন্তা করুন।

এসএসএসের দুটি প্রাথমিক পদ্ধতি হ'ল একটি টিটিটির সাথে ইন্টারেক্টিভ-লগইন এবং টিটিটি ছাড়াই নির্দিষ্ট কমান্ড, কারণ সেগুলি যথাক্রমে rloginএবং এর যথাযথ ক্ষমতা ছিল rsh। প্রতিস্থাপন হিসাবে সফল হতে ssh এর rlogin/ rshবৈশিষ্ট্যগুলির একটি সুপারিট সরবরাহ করতে হবে।

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


0

থেকে 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.

এটি আপনাকে রিমোট সার্ভারে প্রকারের একটি "শেল" পেতে দেয়। সার্ভার যে কি জন্য না শেল অ্যাক্সেসের মঞ্জুরি কিন্তু অনুমতি, SSH, এই পতাকা ব্যবহার কারণ হবে সার্ভার আপনার সংযোগ প্রত্যাখ্যান করার (অর্থাত, গিটহাব এসএফটিপি অ্যাক্সেসের জন্য একটি পরিচিত উদাহরণ)।

শেলটিতে আপনার সমস্ত পরিবেশগত ভেরিয়েবল রয়েছে (যেমন $PATH) তাই কার্যকর স্ক্রিপ্টগুলি কার্যকরভাবে কাজ করার জন্য একটি tty প্রয়োজন।


1
এটি প্রশ্নের উত্তর দেয় না। আমি ইতিমধ্যে জানি যে কীভাবে সিউডো-টিটি বরাদ্দ করতে হয়। আমি কেন জানতে চাই না কেন আমাকে সর্বদা একটি বরাদ্দ দেওয়া উচিত নয়।
চস ওয়েন্স

1
@ চ্যাস.ওভেনস কারণ, আমি উত্তরে উল্লেখ করেছি যে কিছু এসএসএইচ সার্ভার Tty অ্যাক্সেসের অনুমতি দেয় না এবং আপনি যদি সার্ভার থেকে একটি অনুরোধ করেন তবে এটি সংযোগটি নামিয়ে ফেলবে ।
নাথান সি

5
আমি মনে করি আপনি হয়ত আপনার কিছু পরিভাষা বিভ্রান্ত করছেন। এটি কেবল শেল নয় কারণ কোনও পিটিওয়াই এর সাথে যুক্ত। সেখানে সাধারণত শেল তিন ধরনের হয়: non-interactive, interactive, এবং loginloginঅন্যান্য দুটি শেল ধরণের একটি অতিরিক্ত বৈশিষ্ট্য। এই তিনটির ক্রমটি নির্ধারণ করে যে লগইনে কোন ফাইলগুলি উত্সাহিত করা হয়, যা পরিবেশকে কীভাবে আরম্ভ করা হবে তা প্রভাবিত করে। (ভেরিয়েবলগুলি, যেমন আপনি উল্লেখ করেছিলেন)
অ্যান্ড্রু বি

3
@ অ্যান্ড্রুবি আপনি ঠিক বলেছেন ... আমি এই প্রশ্ন থেকেও কিছু শিখেছি। :)
নাথান সি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.