প্রশ্ন (টিএল; ডিআর)
রিমোট ফরওয়ার্ডিং (ওরফে -Rবিকল্প) জন্য গতিশীলভাবে পোর্টগুলি বরাদ্দ করার সময়, দূরবর্তী মেশিনে কোনও স্ক্রিপ্ট (উদাহরণস্বরূপ উত্স থেকে .bashrc) কীভাবে নির্ধারণ করতে পারে যে কোন পোর্টগুলি ওপেনএসএইচ দ্বারা নির্বাচিত হয়েছিল?
পটভূমি
আমি আমাদের কেন্দ্রীয় সার্ভারে সংযোগ রাখতে ওপেনএসএইচ (উভয় প্রান্তে) ব্যবহার করি যা আমি একাধিক অন্যান্য ব্যবহারকারীর সাথে ভাগ করি। আমার দূরবর্তী সেশনের জন্য (এখনের জন্য) আমি এক্স, কাপ এবং পালসওদিও ফরোয়ার্ড করতে চাই।
-Xবিকল্পটি ব্যবহার করে সর্বাধিক তুচ্ছটি ফরওয়ার্ডিং এক্স । বরাদ্দ হওয়া এক্স ঠিকানাটি পরিবেশগত পরিবর্তনশীলতে সঞ্চয় করা হয় DISPLAYএবং সেখান থেকে আমি সংশ্লিষ্ট টিসিপি বন্দরটি নির্ধারণ করতে পারি, বেশিরভাগ ক্ষেত্রেই হোক। তবে আমার খুব কমই দরকার, কারণ এক্সলিব সম্মান দেয় DISPLAY।
কাপ এবং পালসওদিওয়ের জন্য আমার অনুরূপ প্রক্রিয়া দরকার। দুটি পরিষেবার জন্য বুনিয়াদি অস্তিত্ব, পরিবেশগত ভেরিয়েবল আকারে CUPS_SERVERএবং PULSE_SERVERযথাক্রমে। এখানে ব্যবহারের উদাহরণ রয়েছে:
ssh -X -R12345:localhost:631 -R54321:localhost:4713 datserver
export CUPS_SERVER=localhost:12345
lowriter #and I can print using my local printer
lpr -P default -o Duplex=DuplexNoTumble minutes.pdf #printing through the tunnel
lpr -H localhost:631 -P default -o Duplex=DuplexNoTumble minutes.pdf #printing remotely
mpg123 mp3s/van_halen/jump.mp3 #annoy co-workers
PULSE_SERVER=localhost:54321 mpg123 mp3s/van_halen/jump.mp3 #listen to music through the tunnel
সমস্যাটি সেট করা হচ্ছে CUPS_SERVERএবং PULSE_SERVERসঠিকভাবে।
আমরা পোর্ট ফরওয়ার্ডিংগুলি প্রচুর ব্যবহার করি এবং তাই আমার গতিশীল পোর্ট বরাদ্দ প্রয়োজন। স্ট্যাটিক পোর্ট বরাদ্দ কোনও বিকল্প নয়।
রিমোট সার্ভারে গতিশীল পোর্ট বরাদ্দের জন্য ওপেনএসএইচের একটি ব্যবস্থা রয়েছে, 0রিমোট ফরওয়ার্ডিং ( -Rবিকল্প) জন্য বাইন্ড-পোর্ট হিসাবে নির্দিষ্ট করে । নিম্নলিখিত কমান্ডটি ব্যবহার করে, ওপেনএসএইচটি কাপ এবং পালস ফরোয়ার্ডিংয়ের জন্য গতিশীলভাবে পোর্ট বরাদ্দ করবে।
ssh -X -R0:localhost:631 -R0:localhost:4713 datserver
যখন আমি এই কমান্ডটি ব্যবহার sshকরব, নিম্নলিখিতগুলি মুদ্রণ করব STDERR:
Allocated port 55710 for remote forward to 127.0.0.1:4713
Allocated port 41273 for remote forward to 127.0.0.1:631
আমি চাই তথ্য আছে! শেষ পর্যন্ত আমি উত্পন্ন করতে চাই:
export CUPS_SERVER=localhost:41273
export PULSE_SERVER=localhost:55710
তবে "বরাদ্দকৃত বন্দর ..." বার্তা আমার স্থানীয় মেশিনে তৈরি হয়েছে এবং প্রেরণ করা হয়েছে STDERR, যা আমি দূরবর্তী মেশিনে অ্যাক্সেস করতে পারি না। অদ্ভুতভাবে যথেষ্ট যে ওপেনএসএইচ-এর কাছে পোর্ট ফরওয়ার্ডিং সম্পর্কিত তথ্য পুনরুদ্ধার করার উপায় আছে বলে মনে হয় না।
পর্যাপ্তভাবে সেট করতে CUPS_SERVERএবং PULSE_SERVERদূরবর্তী হোস্টে শেল স্ক্রিপ্টে রাখার জন্য আমি কীভাবে এই তথ্যটি আনব?
মৃত শেষ
sshdলগগুলি থেকে তথ্যটি পড়া না পাওয়া পর্যন্ত আমি খুঁজে পেলাম কেবলমাত্র সহজ জিনিস ver এটি বাস্তবসম্মত নয় কারণ তথ্যটি অ-রুট ব্যবহারকারীদের অ্যাক্সেসযোগ্য করার চেয়ে বোধগম্যতার চেয়ে অনেক বেশি তথ্য প্রকাশ করে।
আমি অতিরিক্ত এস্কেপ সিকোয়েন্সকে সমর্থন করার জন্য ওপেনএসএইচ প্যাচিংয়ের কথা ভাবছিলাম যা অভ্যন্তরীণ কাঠামোর একটি দুর্দান্ত উপস্থাপনা মুদ্রণ করে permitted_opens, তবে এটি আমি চাইলেও, আমি এখনও সার্ভার দিক থেকে ক্লায়েন্টের পালানোর ক্রমগুলি অ্যাক্সেস করতে স্ক্রিপ্ট করতে পারি না।
আরও ভাল উপায় থাকতে হবে
নিম্নলিখিত পদ্ধতিটি খুব অস্থির বলে মনে হচ্ছে এবং ব্যবহারকারী হিসাবে এই জাতীয় একটি এসএসএইচ সেশনের মধ্যে সীমাবদ্ধ। তবে, আমার কমপক্ষে দুটি একই ধরণের সেশন এবং অন্যান্য ব্যবহারকারীদের আরও বেশি প্রয়োজন need তবে আমি চেষ্টা করেছিলাম ...
তারকারা যখন সঠিকভাবে সারিবদ্ধ হয়, একটি মুরগী বা দুটি বলি উত্সর্গ করার পরে, আমি এই বিষয়টি sshdআমার ব্যবহারকারী হিসাবে শুরু করা হয়নি তা অপব্যবহার করতে পারি, তবে এটি সফল করার জন্য সফল লগইনের পরে সুযোগগুলি বাদ দেয়:
আমার ব্যবহারকারীর অন্তর্ভুক্ত সমস্ত শ্রোতা সকেটের জন্য পোর্ট নম্বরের একটি তালিকা পান
netstat -tlpen | grep ${UID} | sed -e 's/^.*:\([0-9]\+\) .*$/\1/'আমার ব্যবহারকারী শুরু হওয়া প্রক্রিয়াগুলির সাথে সম্পর্কিত সমস্ত শ্রবণকারী সকেটের জন্য পোর্ট নম্বরের একটি তালিকা পান
lsof -u ${UID} 2>/dev/null | grep LISTEN | sed -e 's/.*:\([0-9]\+\) (LISTEN).*$/\1/'সমস্ত পোর্ট যে প্রথম সেটে আছে, কিন্তু দ্বিতীয় সেটে একটি উচ্চ likelyhood আমার ফরওয়ার্ডিং পোর্ট, এবং প্রকৃতপক্ষে সেট উৎপাদনের বিয়োগ হতে না
41273,55710এবং6010; যথাক্রমে কাপ, ডাল এবং এক্স।6010এক্স বন্দর ব্যবহার করে চিহ্নিত করা হয়DISPLAY।41273কাপ কাপ, কারণlpstat -h localhost:41273 -aফিরে0।55710নাড়ি বন্দর, কারণpactl -s localhost:55710 statফিরে আসে0। (এটি এমনকি আমার ক্লায়েন্টের হোস্টনামটিও প্রিন্ট করে!)
(আমি সেট বিয়োগের কাজটি করতে sort -uএবং উপরের কমান্ড লাইনগুলি থেকে আউটপুট সঞ্চয় commকরতে এবং বিয়োগফলটি করতে ব্যবহার করুন ))
পালসোদিও আমাকে ক্লায়েন্ট সনাক্ত করতে দেয় এবং সমস্ত উদ্দেশ্য এবং উদ্দেশ্যে, এটি এসএসএইচ সেশনগুলির পৃথককরণের জন্য নোঙ্গর হিসাবে কাজ করতে পারে। যাইহোক, আমি গিঁট একটি উপায় খুঁজে পেলাম না 41273, 55710এবং 6010একই sshdপ্রক্রিয়া। netstatঅ-রুট ব্যবহারকারীদের কাছে সেই তথ্য প্রকাশ করবে না। আমি তো পেতে -মধ্যে PID/Program nameকলাম যেখানে আমি পড়তে চাই 2339/54(এই বিশেষ ইনস্ট্যান্সের মধ্যে)। খুব কাছে ...
netstatএটি আপনার নিজের নয় এমন প্রসেসের জন্য পিআইডি প্রদর্শন করবে না যা কার্নেল-স্পেস। উদাহরণস্বরূপ