টি এল; ডিআর
ব্যবহার করবেন না -t। -tদূরবর্তী হোস্টে সিউডো-টার্মিনাল জড়িত এবং কেবলমাত্র টার্মিনাল থেকে ভিজ্যুয়াল অ্যাপ্লিকেশন চালানোর জন্য ব্যবহার করা উচিত।
ব্যাখ্যা
লাইনফিড অক্ষর (নিউলাইন হিসাবেও পরিচিত বা \n) টার্মিনালে প্রেরণ করা হলে টার্মিনালটিকে তার কার্সারটি নামিয়ে আনতে বলে।
তবুও, আপনি যখন seq 3কোনও টার্মিনালে চালান , seqসেইখানেই 1\n2\n3\nএমন /dev/pts/0কোনও কিছু লেখেন , আপনি দেখতে পাবেন না:
1
2
3
কিন্তু
1
2
3
তা কেন?
প্রকৃতপক্ষে, যখন seq 3(বা ssh host seq 3সেই বিষয়টির জন্য) লেখেন 1\n2\n3\n, টার্মিনালটি দেখে 1\r\n2\r\n3\r\n। এটি হ'ল লাইন-ফিডগুলি ক্যারিজ-রিটার্নে অনুবাদ করা হয়েছে (যার উপরে টার্মিনালগুলি তাদের কার্সারটিকে স্ক্রিনের বাম দিকে ফিরিয়ে দেয়) এবং লাইন-ফিডে।
এটি টার্মিনাল ডিভাইস ড্রাইভার দ্বারা সম্পন্ন হয়। ঠিক ঠিক, টার্মিনাল (বা সিউডো-টার্মিনাল) ডিভাইসের লাইন-শৃঙ্খলা দ্বারা, একটি সফ্টওয়্যার মডিউল যা কার্নেলের মধ্যে থাকে।
আপনি sttyকমান্ডের সাহায্যে লাইন শৃঙ্খলার আচরণ নিয়ন্ত্রণ করতে পারেন । LF-> এর অনুবাদটি CRLFচালু হয়
stty onlcr
(যা সাধারণত ডিফল্টরূপে সক্ষম হয়)। আপনি এটি দিয়ে এটি বন্ধ করতে পারেন:
stty -onlcr
অথবা আপনি এর সাথে সমস্ত আউটপুট প্রসেসিং বন্ধ করতে পারেন:
stty -opost
আপনি যদি এটি করেন এবং চালনা করেন seq 3তবে আপনি দেখতে পাবেন:
$ stty -onlcr; seq 3
1
2
3
প্রত্যাশিত.
এখন, আপনি যখন করবেন:
seq 3 > some-file
seqএটি এখন টার্মিনালে লেখা হচ্ছে না, এটি একটি ফাইলে লেখা হচ্ছে, কোনও অনুবাদ করা হচ্ছে না। তাই some-fileধারণ করে 1\n2\n3\n। অনুবাদ কেবলমাত্র টার্মিনাল ডিভাইসে লেখার সময় করা হয়। এবং এটি কেবল প্রদর্শনের জন্যই করা হয়েছে।
একইভাবে, আপনি যখন করবেন:
ssh host seq 3
sshআউটপুট যা যায় 1\n2\n3\nতা নির্বিশেষে লিখছেন ssh।
আসলে যা ঘটে তা হ'ল seq 3কমান্ডটি hostতার স্টাইডআউটটি পাইপের দিকে পুনঃনির্দেশিত করে চালানো হয় । sshহোস্ট সার্ভার পাইপের অন্য প্রান্তে পড়ে এবং এটি উপর আপনার টু এনক্রিপটেড চ্যানেলের পাঠাতে sshক্লায়েন্ট এবং sshক্লায়েন্ট এটা তার stdout- এ সম্মুখের দিকে একটি সিউডো-টার্মিনাল ডিভাইস, যেখানে লিখছেন, আপনার ক্ষেত্রে LFগুলি অনুবাদ করা হয় CRLFপ্রদর্শনের জন্য।
অনেকগুলি ইন্টারেক্টিভ অ্যাপ্লিকেশনগুলি তাদের স্টাডআউটটি টার্মিনাল না হলে আলাদা আচরণ করে। উদাহরণস্বরূপ, আপনি যদি চালান:
ssh host vi
viএটি পছন্দ করে না, এটি পাইপতে যাওয়ার ফলাফল পছন্দ করে না। এটি মনে করে যে এটি এমন কোনও ডিভাইসের সাথে কথা বলছে না যা উদাহরণস্বরূপ কার্সার পজিশনিং এস্কেপ সিকোয়েন্সগুলি বুঝতে সক্ষম।
সুতরাং যে জন্য বিকল্প sshআছে -t। এই বিকল্পের সাহায্যে, হোস্টের ssh সার্ভারটি সিউডো-টার্মিনাল ডিভাইস তৈরি করে এবং এর স্টাডআউট (এবং স্টিডিন এবং স্টডার) তৈরি করে vi। কি viযে টার্মিনাল ডিভাইসে লিখেছেন যে দূরবর্তী সিউডো-টার্মিনাল লাইন শৃঙ্খলা মাধ্যমে যায় এবং দ্বারা পড়া হয় sshসার্ভার এবং এনক্রিপ্ট পথের মাধ্যমে পাঠানো sshক্লায়েন্ট। এটি পাইপের ব্যবহারের পরিবর্তে পূর্বের মতোই , sshসার্ভারটি সিউডো-টার্মিনাল ব্যবহার করে ।
অন্য পার্থক্যটি হ'ল ক্লায়েন্টের পাশে sshক্লায়েন্টটি টার্মিনালটি rawমোডে সেট করে । এর অর্থ হ'ল সেখানে কোনও অনুবাদ করা হয়নি ( opostঅক্ষম এবং অন্যান্য ইনপুট-পার্শ্ব আচরণ)। উদাহরণস্বরূপ, আপনি টাইপ Ctrl-Cকরার সময়, বাধা দেওয়ার পরিবর্তে ssh, সেই ^Cঅক্ষরটি দূরবর্তী দিকে প্রেরণ করা হয়, যেখানে দূরবর্তী সিউডো-টার্মিনালের লাইন শৃঙ্খলাটি রিমোট কমান্ডটিতে বাধা প্রেরণ করে ।
যখন তুমি কর:
ssh -t host seq 3
seq 31\n2\n3\nতার স্টডআউটে লিখেছে , যা সিউডো-টার্মিনাল ডিভাইস। কারণ onlcrঅনূদিত পরার যে হোস্ট করার জন্য 1\r\n2\r\n3\r\nএবং এনক্রিপ্ট করা চ্যানেল উপরে পাঠানো হয়েছে। আপনার পক্ষে কোনও অনুবাদ নেই ( onlcrঅক্ষম), সুতরাং 1\r\n2\r\n3\r\nঅচ্ছুত ( rawমোডের কারণে ) এবং সঠিকভাবে আপনার টার্মিনাল এমুলেটরের স্ক্রিনে প্রদর্শিত হবে।
এখন, আপনি যদি:
ssh -t host seq 3 > some-file
উপরে থেকে কোনও পার্থক্য নেই। ssh: একই জিনিস লিখতে হবে 1\r\n2\r\n3\r\n, কিন্তু এই সময় some-file।
সুতরাং মূলত সমস্ত LFআউটপুট এর মধ্যে seqঅনুবাদ করা CRLFহয়েছে some-file।
আপনি যদি করেন তবে এটি একই রকম:
ssh -t host cat remote-file > local-file
সমস্ত LFঅক্ষর (0x0a বাইট) সিআরএলএফ (0x0d 0x0a) তে অনুবাদ করা হচ্ছে।
এটি সম্ভবত আপনার ফাইলটিতে দুর্নীতির কারণ। দ্বিতীয় ছোট ফাইলের ক্ষেত্রে এটি ঠিক ঘটে যে ফাইলটিতে 0x0a বাইট নেই, তাই কোনও দুর্নীতি নেই।
নোট করুন যে আপনি বিভিন্ন টাইটি সেটিংস সহ বিভিন্ন ধরণের দুর্নীতি পেতে পারেন। এর সাথে যুক্ত আরও একটি সম্ভাব্য ধরণের দুর্নীতি -tহ'ল যদি আপনার স্টার্টআপ ফাইলগুলি host( ~/.bashrc, ~/.ssh/rc...) তাদের স্টাডারকে কিছু লিখতে দেয় কারণ -tদূরবর্তী শেলটির স্টাডআউট এবং স্টাডার দিয়ে স্টেডআউটে একত্রিত হয়ে যায় ssh(তারা উভয়ই সিউডোতে যান -টার্মিনাল ডিভাইস)।
আপনি catকোনও টার্মিনাল ডিভাইসে রিমোটটি আউটপুট দিতে চান না ।
তুমি চাও:
ssh host cat remote-file > local-file
আপনি করতে পারেন:
ssh -t host 'stty -opost; cat remote-file` > local-file
এটি কাজ করবে ( উপরে আলোচিত স্ট্ডার দুর্নীতি মামলার লিখন ব্যতীত ) তবে এটি উপ-অনুকূল হবে কারণ আপনার অযৌক্তিক সিউডো-টার্মিনাল স্তরটি চলমান থাকে host।
আরও কিছু মজা:
$ ssh localhost echo | od -tx1
0000000 0a
0000001
ঠিক আছে.
$ ssh -t localhost echo | od -tx1
0000000 0d 0a
0000002
LF অনুবাদ CRLF
$ ssh -t localhost 'stty -opost; echo' | od -tx1
0000000 0a
0000001
আবার ঠিক আছে।
$ ssh -t localhost 'stty olcuc; echo x'
X
এটি আউটপুট পোস্ট-প্রসেসিংয়ের অন্য রূপ যা টার্মিনাল লাইন শৃঙ্খলা দ্বারা করা যেতে পারে।
$ echo x | ssh -t localhost 'stty -opost; echo' | od -tx1
Pseudo-terminal will not be allocated because stdin is not a terminal.
stty: standard input: Inappropriate ioctl for device
0000000 0a
0000001
sshসার্ভারকে সিউডো-টার্মিনালটি ব্যবহার করতে অস্বীকার করে যখন তার নিজস্ব ইনপুট টার্মিনাল নয়। আপনি -ttযদিও এটি দিয়ে জোর করতে পারেন :
$ echo x | ssh -tt localhost 'stty -opost; echo' | od -tx1
0000000 x \r \n \n
0000004
লাইন শৃঙ্খলা ইনপুট দিকে আরও অনেক কিছু করে।
এখানে, echoএর ইনপুটটি পড়েন না বা আউটপুট জিজ্ঞাসা করা হয়নি x\r\n\nতবে তা কোথা থেকে আসে? echoএটি দূরবর্তী সিউডো-টার্মিনালের স্থানীয় ( stty echo)। sshসার্ভার খাওয়ানো হয় x\nএটি দূরবর্তী সিউডো-টার্মিনাল মালিক পাশ থেকে ক্লায়েন্ট থেকে পড়ুন। এবং এর লাইন শৃঙ্খলা এটি আবার প্রতিধ্বনিত করে (আগে stty opostচালানো হয় যার কারণে আমরা একটি দেখতে পাই CRLFএবং না LF)। এটি রিমোট অ্যাপ্লিকেশন স্টিডিনের কাছ থেকে কিছু পড়ে কিনা তা থেকে স্বাধীন।
$ (sleep 1; printf '\03') | ssh -tt localhost 'trap "echo ouch" INT; sleep 2'
^Couch
0x3চরিত্র হিসাবে আবার প্রতিধ্বনিত হয় ^C( ^এবং C) কারণ stty echoctlএবং শেল এবং ঘুম কারণ একটি SIGINT গ্রহণ stty isig।
তাই যখন:
ssh -t host cat remote-file > local-file
যথেষ্ট খারাপ, কিন্তু
ssh -tt host 'cat > remote-file' < local-file
অন্যভাবে ফাইলগুলি স্থানান্তর করা অনেক খারাপ। > এলএফ অনুবাদ, বরং অন্যান্য সকল বিশেষ অক্ষর সঙ্গে সমস্যা (- আপনি কিছু সি আর কিনবো ^C, ^Z, ^D, ^?, ^S...) এবং দূরবর্তী catফাইলের শেষে দেখতে পাবেন না শেষে যখন local-fileএসে যাবে, শুধুমাত্র যখন ^Dপরে পাঠানো হয় \r, \nবা আপনার টার্মিনাল ^Dকরার সময় অন্য কিছু cat > file।
-tবিকল্প, যা স্থানান্তরকে ভেঙে দেয়। আপনার কোনও নির্দিষ্ট কারণে প্রয়োজন না হলে ব্যবহার করবেন না-tবা-T। ডিফল্ট বিস্তৃত ক্ষেত্রে কাজ করে, সুতরাং এই বিকল্পগুলি খুব কমই প্রয়োজন হয়।