টি এল; ডিআর
ব্যবহার করবেন না -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 3
1\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
। ডিফল্ট বিস্তৃত ক্ষেত্রে কাজ করে, সুতরাং এই বিকল্পগুলি খুব কমই প্রয়োজন হয়।