সংযোগ বন্ধ হয়ে গেলে কীভাবে দূরবর্তীভাবে "টেল-ফ" নামক সমাপ্তি করবেন?


24

আমি কেবল লক্ষ্য করেছি যে যদি আমি মৃত্যুদণ্ড কার্যকর করি ssh user@remote_host tail -f /some/fileতবে tail -f /some/fileএসএসএস সংযোগ বন্ধ থাকলেও রিমোট_হোস্টে চালিয়ে যায়!

সুতরাং, বেশ কয়েকটি সংযোগ এবং সংযোগ বিচ্ছিন্ন হওয়ার পরে, দৌড়ানোর সংখ্যা tail -f /some/fileবেড়ে যায়। tail -fএসএসএস সংযোগ বন্ধ হয়ে আসলে কীভাবে শেষ করতে হয়?

উত্তর:


33

মধ্যে

ssh host tail -f file

sshক্লায়েন্টের সাথে সংযোগ করে sshdউপর সার্ভার hostএকটি TCP সংযোগের মাধ্যমে। এটি একটি স্ট্রাউট একটি পাইপে পুনঃনির্দেশিত সঙ্গে sshdচালিত tail -fsshdপাইপের অপর প্রান্ত থেকে কী আসছে তা sshক্লায়েন্টকে প্রেরণের জন্য এটি এসএসডিডি প্রোটোকলে অন্তর্ভুক্ত করে । (সঙ্গে rshd, tailstdout- এ সকেট সরাসরি হত, কিন্তু sshdএনক্রিপশন যোগ করা হয়েছে এবং একটি একক TCP সংযোগ উপর (পোর্ট / প্রতিনিধি / ব্যবহারে X11 / সুড়ঙ্গ ফেরৎ, দ্বারা stderr মত বিভিন্ন স্ট্রিম) মাল্টিপ্লেক্স তাই পাইপ অবলম্বন করা হয়েছে সক্ষম হয়)।

আপনি যখন CTRL-C টিপেন, sshক্লায়েন্টের কাছে একটি সাইন ইন প্রেরণ করা হয় । যার ফলে sshমৃত্যু হয়। মারা যাওয়ার পরে টিসিপি সংযোগ বন্ধ হয়ে যায়। আর তাই, উপর host, sshdপাশাপাশি ডাইস। tailনিহত হয় না, তবে এর স্টাডাউট এখন অন্য প্রান্তে পাঠকবিহীন একটি পাইপ। সুতরাং, পরের বার যখন এটি তার স্টাডআউটকে কিছু লিখবে, এটি একটি সাইনপাইপ পাবে এবং মারা যাবে।

ইন:

ssh -t host 'tail -f file'

এটি একই জিনিসটি ব্যতীত পাইপের সাথে থাকার পরিবর্তে, sshdএবং tailসিউডো-টার্মিনালের মাধ্যমে যোগাযোগ হয় । tailএর স্টাডাউট হ'ল একটি স্লেভ সিউডো-টার্মিনাল (যেমন /dev/pts/12) এবং যা কিছু tailলেখা আছে তা readমাস্টার সাইডে রয়েছে (সম্ভবত টিটি লাইনের শৃঙ্খলা দ্বারা সংশোধিত) দ্বারা sshdএবং sshক্লায়েন্টকে এনক্যাপসুলেটেড প্রেরণ করা হয়েছে ।

ক্লায়েন্ট পক্ষের সাথে -t, sshটার্মিনালটি rawমোডে রাখে । বিশেষত, এটি টার্মিনাল ক্যানোনিকাল মোড এবং টার্মিনাল সিগন্যাল হ্যান্ডলিং অক্ষম করে।

সুতরাং, যখন আপনি টিপে Ctrl+Cক্লায়েন্টের টার্মিনাল লাইন শৃঙ্খলা পরিবর্তে কাজের জন্য একটি সাইন ইন sshপ্রেরণ করেন, এটি কেবল ^Cসংযোগের জন্য অক্ষরটি প্রেরণ করে sshdএবং sshdসেটিকে ^Cদূরবর্তী টার্মিনালের প্রধান দিকে লিখে দেয় । এবং রিমোট টার্মিনালের লাইন শৃঙ্খলা এতে প্রেরণ SIGINTকরে tailtailতারপরে মারা যায়, এবং sshdপ্রস্থানটি বন্ধ হয়ে যায় এবং সংযোগটি বন্ধ করে দেয় এবং ssh(যদি তা অন্যথায় পোর্ট ফরওয়ার্ডিং বা অন্য কোনও ক্ষেত্রে ব্যস্ত না হয়)।

এছাড়াও, সাথে -t, যদি sshক্লায়েন্ট মারা যায় (উদাহরণস্বরূপ আপনি প্রবেশ করেন ~.), সংযোগ বন্ধ হয়ে sshdযায় এবং মারা যায়। ফলস্বরূপ, একটি সাইনআপ পাঠানো হবে tail

এখন, সাবধান যে ব্যবহারের -tপার্শ্ব প্রতিক্রিয়া রয়েছে। উদাহরণস্বরূপ, ডিফল্ট টার্মিনাল সেটিংসের সাথে \nঅক্ষর রূপান্তরিত হয় \r\nএবং রিমোট সিস্টেমের উপর নির্ভর করে আরও অনেকগুলি ঘটতে পারে, তাই আপনি stty -opostযদি দূরবর্তী হোস্টে একটি (আউটপুট পোস্ট-প্রক্রিয়াকরণ অক্ষম করতে) ইস্যু করতে চাইতে পারেন যদি আউটপুটটির উদ্দেশ্যে না হয় একটি টার্মিনাল:

$ ssh  localhost 'echo x' | hd
00000000  78 0a                                             |x.|
00000002
$ ssh -t localhost 'echo x' | hd
00000000  78 0d 0a                                          |x..|
00000003
$ ssh -t localhost 'stty -opost; echo x' | hd
00000000  78 0a                                             |x.|
00000002

-t/ ব্যবহারের আর একটি অপূর্ণতা -ttহ'ল ক্লায়েন্টের উপর স্টাডাউট এবং স্টার্ডার পৃথক নয়। দূরবর্তী কমান্ডের stdout এবং stderr উভয়ই sshক্লায়েন্টের stdout এ লেখা হবে :

$ ssh localhost ls /x  | wc -l
ls: cannot access /x: No such file or directory
0
$ ssh -t localhost ls /x | wc -l
1

এই ধরণের বিস্তারিত ব্যাখ্যার জন্য আপনাকে অনেক ধন্যবাদ! আমি আশা করি আমি দুটি উত্তর গ্রহণ করতে পারি ..
দিমিত্রি ফ্র্যাঙ্ক

"সহ -t, যদি sshক্লায়েন্ট মারা যায় (উদাহরণস্বরূপ আপনি প্রবেশ করেন ~.)" ~.আবার কী ?
এক্স-ইউরি

1
@ এক্স-ইউরি, ~.ক্লায়েন্টকে সংযোগ বিচ্ছিন্ন করার জন্য আপনি যে পলায়ন ক্রমটি প্রবেশ করেন তা হ'ল। দেখুন man sshবিস্তারিত জানার জন্য।
স্টাফেন চেজেলাস

11

আপনার দূরবর্তী দিকে টার্মিনাল বরাদ্দ দরকার:

ssh -t user@remote_host tail -f /some/file

অথবা এমনকি

ssh -tt user@remote_host tail -f /some/file

1
ধন্যবাদ, উভয়ই -tবা -ttকাজ করে। তবে আমি এর আসল কারণটি এখনও বুঝতে পারি না: বলুন, যখন আমি শেলকে দূর থেকে কল করি এবং সংযোগটি বন্ধ করি, তখন শেলটি সমাপ্ত হয়। তবে tail -fহয় না। অবশ্যই আমি -tবিকল্প সম্পর্কে ইতিমধ্যে পড়েছি man ssh, কিন্তু এটি খুব একটা কার্যকর হয়নি। দেখে মনে হচ্ছে আমি কিছু জেনেরিক বুঝতে পারি না, এবং আপনি যদি এটি সম্পর্কে কিছু ডক্স পড়ার পরামর্শ দেন বা সম্ভবত এটি নিজে ব্যাখ্যা করেন তবে আমি খুশি হব। ধন্যবাদ!
দিমিত্রি ফ্র্যাঙ্ক

2
@ দিমিত্রিফ্রঙ্ক আমার বোঝার বিষয়টি হ'ল: যদি সংযোগটি ভেঙে যায় তবে sshdএকটি পাঠায় SIGHUP। তবে যেখানে কোনও টার্মিনাল নেই সেখানে কোনও টার্মিনাল সংযোগ হ্যাঙ্গআপ হতে পারে না ...
হউক লেগিং

ধন্যবাদ, আমি SIGHUPএবং অন্যান্য সংকেতগুলি সম্পর্কে পড়ব , এখনও এটি সম্পর্কে প্রায় কিছুই জানি না।
দিমিত্রি ফ্র্যাঙ্ক

ফাই: আমি কেবল দৌড়ানোর চেষ্টা tail -fকরেছি, তারপরে আমি এটি খুলতে htopএবং পাঠিয়েছি SIGHUP( F9-> 1-> টিপে Enter), এবং tail -fবন্ধ হয়ে যায়! সুতরাং, কারণটি কিছু আলাদা হতে হবে ..
দিমিত্রি ফ্রাঙ্ক

3
@ দিমিত্রিফ্রঙ্ক আপনি সমস্যাটি ভুল বুঝে গেছেন। সমস্যা না যে tailপ্রতিক্রিয়া ব্যক্ত না SIGHUP। সমস্যাটি হ'ল SIGHUP** প্রেরিত নয় se tailসিউডো টার্মিনাল ছাড়া। আপনি দেখতে পারেন যে যুক্ত করে straceকরতে tailউভয় ক্ষেত্রেই।
হউক লেগেইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.