আমি কি একটি সার্ভারে স্ট্যান্ডআউটকে অন্য সার্ভারে স্টিডিনে পাইপ করতে পারি?


74

stdoutএকটি CentOS সার্ভারে stdinঅন্য CentOS সার্ভারে পাইপ করা দরকার । এটা কি সম্ভব?

হালনাগাদ

স্কটপ্যাক, মাইকিবি এবং জোফেলের সবার বৈধ উত্তর রয়েছে। আমি স্কটকে উত্তরটি পুরষ্কার দিয়েছি কারণ, যদিও আমার প্রশ্নটি সুরক্ষাটিকে প্রয়োজনীয়তা হিসাবে নির্দিষ্ট করে নি, তবে নিরাপদ থাকা সবসময়ই চমৎকার। তবে অন্য দুটি ফেলোদের পরামর্শও কার্যকর হবে।


1
এটি লক্ষণীয় যে নন-এসএসএস পদ্ধতির (কেবলমাত্র) প্রধান সুবিধা হ'ল থ্রুপুট গতি; যদি আপনি একটি দ্রুত নেটওয়ার্কে থাকেন এবং সুরক্ষা অপ্রয়োজনীয় হয় তবে এটি দুটি উইন্ডোতে দুটি কমান্ড টাইপ করার অতিরিক্ত অসুবিধার জন্য উপযুক্ত হতে পারে।
র্যান্ডম 832

উত্তর:


94

এটি একটি অপ্রকাশিত হ্যাঁ।

যখন কেউ sshরিমোট সার্ভারে একটি কমান্ড কার্যকর করতে ব্যবহার করে এটি কোনও ধরণের অভিনব অভ্যন্তরীণ ইনপুট / আউটপুট পুনঃনির্দেশ সম্পাদন করে। আসলে, আমি এটি ওপেনএসএইচ-এর একটি সূক্ষ্ম সুন্দর বৈশিষ্ট্য বলে মনে করি। বিশেষত, আপনি যদি sshরিমোট সিস্টেমে একটি স্বেচ্ছাসেবক কমান্ড প্রয়োগ করতে চান, তবে ssh ম্যাপ করবে STDINএবং STDOUTকমান্ডটি কার্যকর হবে।

উদাহরণের উদ্দেশ্যে, ধরে নেওয়া যাক আপনি একটি ব্যাকআপ টারবাল তৈরি করতে চান, তবে স্থানীয়ভাবে এটি সংরক্ষণ করতে বা করতে চান না। আসুন এই সিনট্যাক্সটিতে একটি গন্ডার আসুন:

$ tar -cf - /path/to/backup/dir | ssh remotehost "cat - > backupfile.tar"

আমরা একটি টারবাল তৈরি করছি এবং এটিতে STDOUTসাধারণ স্টাফ লিখছি । যেহেতু আমরা SSH ব্যবহার করছেন দূরবর্তী কমান্ড চালানো, stdin ম্যাপ পরার STDINএর cat। যা আমরা একটি ফাইলে পুনঃনির্দেশ করি।


11
এটি কোনও ধরণের "অভিনব অভ্যন্তরীণ ইনপুট / আউটপুট পুনঃনির্দেশ" নয় - কেবল সরল, বিরক্তিকর নিয়মিত স্টাফ। এসএসডিএন অন্যান্য সরঞ্জামের মতো এসটিডিএন থেকে পড়ে এবং এটি দূরবর্তী প্রক্রিয়াতে প্রেরণ করে। :)
ড্যানিয়েল পিটম্যান

7
@ ড্যানিয়েলপিটম্যান: তবে এটিকে "অভিনব অভ্যন্তরীণ" আবর্জনা বলা আরও মজাদার
স্কট প্যাক

7
একইভাবে, netcatউভয় প্রান্তে একটি দুর্দান্ত সহজ, সহজ যোগাযোগের চ্যানেল তৈরি করে। tar cf - /path/to/dir | nc 1.2.3.4 5000এক সার্ভার, উপর nc -l -p 5000 > backupfile.tarঅপরের ওপর।
মাইকিবি

1
@ মাইকিবি: ভালো কথা। নেটক্যাট একটি স্পষ্ট-পাঠ্য প্রোটোকল তাই সংবেদনশীল ডেটা সম্পর্কে সতর্ক থাকুন। আমি স্থানীয় ড্রাইভিং অধিগ্রহণ (পোর্টাল স্ক্যান) এবং নেটওয়ার্ক ড্রাইভ অধিগ্রহণ (আলা ডিডি) এর মতো আরও নির্দিষ্ট জিনিসের জন্য নেটকাট ব্যবহার করার ঝোঁক।
স্কট প্যাক

2
@ মাইকিবি: আপনার লোকেরা আপনার উড়ন্ত এবং প্যান্টের আসনগুলির সাথে কী!
স্কট প্যাক

28

হোস্টগুলির মধ্যে ডেটা পাইপ করার একটি সুবিধাজনক উপায় যখন আপনাকে তারের থেকে সুরক্ষার বিষয়ে চিন্তা করতে হবে না netcatতখন সংযোগের উভয় প্রান্তে ব্যবহার করা হচ্ছে ।

এটি আপনাকে অবিচ্ছিন্নভাবে সেট আপ করতে দেয়:

"রিসিভার" (সত্যই, আপনার দ্বি-মুখী যোগাযোগ থাকবে, তবে এটির মতো চিন্তা করা সহজ), চালান:

nc -l -p 5000 > /path/to/backupfile.tar

এবং "প্রেরক" এ, চালান:

tar cf - /path/to/dir | nc 1.2.3.4 5000

জেনে খুব ভাল লাগছে। শারীরিক সংযোগটি সম্ভবত কোনও ব্যাকআপ নেটওয়ার্কের মতো বিশ্বাস করা হয় বা যদি সংযোগটি ইতিমধ্যে টুনেল করা থাকে তবে এটি ভাল।
ওয়েসলি

অথবা যদি ডেটা এমন কিছু হয় যা জনসাধারণ্যে প্রকাশ্য।
স্যামুয়েল এডউইন ওয়ার্ড

1
+1 নেটক্যাট একটি অমূল্য সরঞ্জাম, বিশেষত যখন আপনার কোনও এসএস সার্ভার চলমান থাকে না।
কাওয়ারিক

21

ইউনি-এবং দ্বি নির্দেশমূলক সংযোগ তৈরি করার জন্য একটি খুব শক্তিশালী সরঞ্জাম socat। সম্ভাব্যতার সংক্ষিপ্ত বিবরণের জন্য , এর ম্যানপেজে থাকা উদাহরণগুলি দেখুন ।

এটি netcatসম্পূর্ণরূপে এবং অনুরূপ সরঞ্জামগুলি সম্পূর্ণরূপে প্রতিস্থাপন করে এবং এসএসএল এনক্রিপ্ট হওয়া সংযোগগুলির জন্য সমর্থন করে। নতুনদের জন্য, এটি যথেষ্ট সহজ নাও হতে পারে তবে এটি বিদ্যমান তা জেনে অন্তত ভাল।


1
@ ওয়েসলি ডেভিড: আপনার "আপডেট" - এ কেবলমাত্র সম্পূর্ণতার জন্য, আমি আমার উত্তরে যুক্ত করেছি যে সকেটের এসএসএল সমর্থন রয়েছে, সুতরাং এনক্রিপশনও সোনাত সম্ভব, সম্ভব। তবে, ssh বেশিরভাগ ক্ষেত্রেই আরও ভাল এবং সহজ সমাধান, সুতরাং আমি স্কটপ্যাকের উত্তরটিও বেছে নিতে পারতাম।
জোফেল

5

টি এল; ডিআর

জিনিসগুলি কেবল তখনই আরও জটিল হয়ে যায় যখন আপনার একটি বেসিক সার্ভার ব্যবহার করা আবশ্যক।

  1. আপনি পছন্দ করতে sshআদেশ হিসাবে পাস করতে sshপারেন:

    • cat local_script.sh | ssh -A usera@bastion ssh -A userb@privateserver "cat > remote_copy_of_local_script.sh; bash remote_copy_of_local_script.sh"
  2. সিউডো-টার্মিনালগুলি থেকে সাবধান থাকুন


নোট করুন যে এখানে মূল তাত্পর্যপূর্ণ বিন্দুটি হ'ল sshবেশিরভাগ সরঞ্জামের মতো, কেবলমাত্র ট্রিট করে stdoutএবং stdinডিফল্টরূপে সঠিক।

যাইহোক, আপনি যখন বিকল্পটি দেখতে শুরু করেন Disable pseudo-terminal allocation.এবং Force pseudo-terminal allocation.আপনার কিছুটা ট্রায়াল এবং ত্রুটি করতে হতে পারে। তবে, একটি সাধারণ নিয়ম হিসাবে আপনি ttyযদি কোনও টার্মিনাল এমুলেটরে (কোনও মানবিক ধরণের কী রয়েছে) গার্ডড / বাইনারি জাঙ্কটি ঠিক করার চেষ্টা না করেন তবে আপনি আচরণ পরিবর্তন করতে চান না ।

উদাহরণস্বরূপ, আমার ব্যবহারের প্রবণতা -Atযাতে আমার ওয়ার্কস্টেশনের এসএসএল-এজেন্ট এগিয়ে যায় এবং যাতে টিমাক্স দূরবর্তীভাবে চালানো বাইনারি বাধা না দেয় (যেমন ssh -At bastion.internal tmux -L bruno attach)। এবং, ডকারের জন্যও (এর মতো sudo docker exec -it jenkins bash)।

যাইহোক, -tআমি যখন এই জাতীয় কিছু করার চেষ্টা করি তখন এই দুটি পতাকা ডেটা দুর্নীতির উপর নজর রাখতে কিছুটা শক্ত করে তোলে:

# copy /etc/init from jenkins to /tmp/init in testjenkins running as a container
ssh -A bastion.internal \
ssh -A jenkins.internal \
sudo tar cf - -C /etc init | \
sudo docker exec -i testjenkins \
bash -c 'tar xvf - -C /tmp'

# note trailing slashes to make this oneliner more readable.

2

আপনার ssh পাবলিক কীটি কেবল একটি আদেশ দ্বারা অন্য হোস্টে রাখার চেষ্টা করুন

ssh root@example.com 'cat >> .ssh/authorized_keys' < .ssh/id_rsa.pub

2

আপনি যে কমান্ডটি কমান্ডটি চালাচ্ছেন তার জন্য সার্ভারের মধ্যে কোনও পাসওয়ার্ড হ্যান্ডশেকিং স্থাপন না করার পরে, এটি আমি সবচেয়ে সহজ বলে মনে করি:

uncompressed

tar cf - . | ssh servername "cd /path-to-dir && tar xf -"

উড়তে সংকোচনের

tar czf - . | ssh servername "cd /path-to-dir && tar xzf -"

আপনার ফাইলটি sshইতিমধ্যে সংক্ষেপণের জন্য কনফিগার করা থাকলে ট্যারে ফাইলটিতে সংক্ষেপণ ব্যবহার করা খুব খারাপ ধারণা ।
অ্যান্থন

@ অ্যানটন কেন এত খারাপ, এবং এসএসএস সংক্ষেপণ ইতিমধ্যে সক্ষম হয়েছে কিনা তা কীভাবে পরীক্ষা করা হবে?
টম হেল

1
@ টমহেল আপনার সিস্টেমের গতির উপর নির্ভর করে এটি সামগ্রিক অপারেশনটিকে ধীরে ধীরে কমিয়ে দিতে পারে, কারণ দ্বিতীয় সংক্ষেপণে সময় লাগে, তবে অতিরিক্ত বাইটগুলি শেভ করার সম্ভাবনা কম। Compressionযে কোনও কনফিগার ফাইলে সেট করা যেতে পারে, এর জন্য একটি দ্রুত পরীক্ষা করে দেখা যায় ssh -v localhost exit 2>&1 | fgrep -i compressযে কোনও আউটপুট দেয় কিনা (এএফআইএইকে কনফিগারেশনটি ডাম করার কোনও বিকল্প নেই কারণ এসএসএস এটি পড়েছে)।
অ্যান্থন

tarএকটি -C pathপতাকা রয়েছে যা উভয় cএবং xআদেশের জন্য কাজ করে। আপনাকে cdসেখানে আলাদা কমান্ড লাগাতে হবে না । (তবে এটি লক্ষ্য করা ভাল যে আপনি একটি কমান্ডের চেয়েও বেশি চালনা করতে পারেন))
ব্রুনো ব্রোনোস্কি

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