অস্থায়ী এসএসএইচ টানেল সেট আপ করতে স্ক্রিপ্টটি বাশ করুন


132

সাইগউইনে, আমি একটি বাশ স্ক্রিপ্ট চাই:

  1. রিমোট সার্ভারে একটি এসএসএইচ টানেল তৈরি করুন।
  2. স্থানীয়ভাবে এমন কিছু কাজ করুন যা টানেলটি ব্যবহার করে।
  3. তারপরে টানেলটি বন্ধ করে দিন।

শাটডাউন অংশটি আমাকে বিভ্রান্ত করেছে।

বর্তমানে, আমার একটি খোঁড়া সমাধান রয়েছে। একটি শেলটিতে আমি একটি টানেল তৈরি করতে নিম্নলিখিতটি চালিত করি:

# Create the tunnel - this works! It runs forever, until the shell is quit.
ssh -nNT -L 50000:localhost:3306 jm@sampledomain.com

তারপরে, অন্য শেল উইন্ডোতে, আমি আমার কাজটি করি:

# Do some MySQL stuff over local port 50000 (which goes to remote port 3306)

অবশেষে, যখন আমার কাজ শেষ হয়, আমি প্রথম শেল উইন্ডোটি টানেলটি মারার জন্য বন্ধ করি।

আমি এই সমস্ত একটি স্ক্রিপ্টে করতে চাই:

# Create tunnel
# Do work
# Kill tunnel

আমি কীভাবে টানেল প্রক্রিয়াটি ট্র্যাক করব, তাই আমি জানি কোনটি মারতে হবে?


আমি একটি স্ক্রিপ্ট লিখেছি যা এসএসএস
নাম

উত্তর:


324

আপনি এটি কোনও ssh 'কন্ট্রোল সকেট' দিয়ে পরিষ্কারভাবে করতে পারেন। ইতিমধ্যে চলমান এসএসএইচ প্রক্রিয়াটির সাথে কথা বলার জন্য এবং এটি পিড পেতে, এটি হত্যা করুন follows 'কন্ট্রোল সকেট' (মাস্টারের জন্য এম এবং সকেটের জন্য এস) ব্যবহার করুন:

$ ssh -M -S my-ctrl-socket -fnNT -L 50000:localhost:3306 jm@sampledomain.com
$ ssh -S my-ctrl-socket -O check jm@sampledomain.com
Master running (pid=3517) 
$ ssh -S my-ctrl-socket -O exit jm@sampledomain.com
Exit request sent. 

মনে রাখবেন যে আমার-সিটিআরএল-সকেটটি একটি আসল ফাইল তৈরি হবে।

আমি ওপেনএসএসএইচ মেলিং তালিকার খুব আরটিএফএম জবাব থেকে এই তথ্যটি পেয়েছি ।


6
আমি এখন পর্যন্ত এই বিষয়টিতে দেখা সবচেয়ে ভাল উত্তর। আপনাকে অনেক ধন্যবাদ, এটি গ্রহণযোগ্য হওয়া উচিত। আমি আমার ভ্যাগ্র্যান্ট ভিএম এর সাথে সংযোগ করতে এবং একটি ফ্লাইওডিবি আপডেট স্ক্রিপ্ট চালানোর জন্য এটি ব্যবহার করি।
খ্রিস্টান

2
স্পষ্টতই নিয়ন্ত্রণ সকেট সর্বত্র কাজ করে না। উদাহরণস্বরূপ, আমি Operation not permittedড্রোন.অবিচ্ছিন্ন ইন্টিগ্রেশন পরিবেশে muxserver_listen: link mux listener ssh-ctrl-socket.wsASkszgSBlK7kqD => ssh-ctrl-socket: Operation not permitted
উঠি

সুতরাং my-ctrl-socketএই রান করার পরে ফাইলের কি হয় ? আমি যখন ls -laবর্তমান ফোল্ডারে করি তখন ফাইলটি আর দেখতে পাচ্ছি না।
sachinruk

2
আপনি যদি এটি কোনও স্ক্রিপ্টে ব্যবহার করেন আপনার কন্ট্রোল সকেটের উপলব্ধ হওয়ার জন্য কয়েক সেকেন্ড অপেক্ষা করতে হবে। আমার সমাধান:while [ ! -e $ctrl_socket ]; do sleep 0.1; done
অ্যাডাম ওয়ালনার

যখন আমি এটি করি আমি পাচ্ছি open failed: administratively prohibited: open failedএবং আমি মনে করি না এটি টানেলটি
অ্যান্ডি রে

21

আপনি এসএইচকে -f বিকল্পের সাথে ব্যাকগ্রাউন্ডে বলতে পারেন তবে আপনি পিআইডি পাবেন না! এছাড়াও আপনি আপনার স্ক্রিপ্টটি টানেলটি ব্যবহার করার আগে একটি নির্বিচার সময় ঘুমানোর পরিবর্তে, আপনি -o ExitOnwardwardFailure = হ্যাঁ ব্যবহার করতে পারেন এবং এসএসএইচটি সমস্ত রিমোট পোর্ট ফরওয়ার্ড সাফল্যের সাথে ব্যাকগ্রাউন্ডে রাখার অপেক্ষা রাখে। আপনি পিআইডি পেতে পিএস এর আউটপুট গ্রেপ করতে পারেন। উদাহরণস্বরূপ আপনি ব্যবহার করতে পারেন

...
ssh -Cfo ExitOnForwardFailure=yes -NL 9999:localhost:5900 $REMOTE_HOST
PID=$(pgrep -f 'NL 9999:')
[ "$PID" ] || exit 1
...

এবং নিশ্চিত হয়ে নিন যে আপনি পছন্দসই পিআইডি পাচ্ছেন


আপনি এটি উপলব্ধি করতে পারেন না, কিন্তু এটি প্রতিভা একটি ধরণের। আমি এসএসএইচ টানেল পিআইডি ট্র্যাক করার জন্য একটি উপায় সন্ধান করছিলাম এবং সিস্টেমড সার্ভিস স্ক্রিপ্টগুলি ব্যবহার করে প্রায় শেষ হয়েছিল। আর নয়: আমি এসএসএইচ প্রক্রিয়াটি গ্রেপ করতে পারি যা আমার টানেলের নামটি ব্যবহার করতে হবে। এই ধারণাটি কোনওভাবে আমাকে পুরোপুরি এড়িয়ে গেছে। অনেক ধন্যবাদ!
এক্সেক্স

19
  • আপনি কমান্ড লাইনের পতাকা সহ অন্যদিকে শেল তৈরি না করে (কেবল টানেলটি খুলুন) সাথে sshব্যাকগ্রাউন্ডে যেতে এবং বলতে পারেন যে &আপনি ইতিমধ্যে এটি সম্পন্ন করেছেন -N)।
  • পিআইডি দিয়ে সংরক্ষণ করুন PID=$!
  • আপনার জিনিস না
  • kill $PID

সম্পাদনা: স্থির $? থেকে $! এবং যুক্ত &


3
আমার স্ক্রিপ্টটি কেআইএলএল হওয়ার আগে যদি কোথাও মারা যায়, আমাকে এটি পরিচালনা করতে সতর্ক থাকতে হবে।
জেএম

2
@ জেএম: trap 'kill $PID' 1 2 15স্ক্রিপ্ট ব্যর্থতার অনেকগুলি বিষয় কভার করবে।
নরম্যান রামসে

3
এটি নির্ভরযোগ্যভাবে কাজ করার জন্য, টানেলটি তৈরি করার পরে আমাকে "ঘুম" করতে হয়েছিল, তবে এটি ব্যবহারের আগে।
জেএম

@ নোরম্যান র্যামসে আমার ধারণা আপনার অর্থ trap "kill $PID", কারণ বাশ কেবলমাত্র ডাবল উদ্ধৃত স্ট্রিংয়ের
ভিতরেই

1
@ জুয়ানসিএসিডো পার্থক্যটি কেবল তখনই গুরুত্বপূর্ণ হবে যদি PIDপরে ভেরিয়েবলটির নতুন সংজ্ঞা দেওয়া হয়। ভেরিয়েবলটি প্রসারিত হয় যখন trapবিল্ট-ইন বলা হয় (ওপির পদ্ধতির) বা যখন কোনও সিগন্যাল ধরা পড়ে (আপনার পদ্ধতির); উভয় পন্থা এখানে একই ফলাফল উত্পাদন করে।
উইটিকো

4

আমি পৃথক কাজের জন্য একটি নতুন শেল চালু করতে পছন্দ করি এবং আমি প্রায়শই নিম্নলিখিত কমান্ড সংমিশ্রণটি ব্যবহার করি:

  $ sudo bash; exit

বা কখনও কখনও:

  $ : > sensitive-temporary-data.txt; bash; rm -f sensitive-temporary-data.txt; exit

এই কমান্ডগুলি একটি নেস্টেড শেল তৈরি করে যেখানে আমি আমার সমস্ত কাজ করতে পারি; আমি শেষ হয়ে গেলে আমি সিটিআরএল-ডি আঘাত করি এবং পিতামাতার শেলটি পরিষ্কার হয়ে যায় এবং পাশাপাশি বেরিয়ে আসে। অংশের bash;ঠিক আগে আপনি সহজেই আপনার এসএস টানেলের স্ক্রিপ্টে ফেলে দিতে পারেন killযাতে আপনি যখন নেস্টেড শেলটি থেকে লগ আউট করেন তখন আপনার টানেলটি বন্ধ হয়ে যাবে:

#!/bin/bash
ssh -nNT ... &
PID=$!
bash
kill $PID

খুব আকর্ষণীয়. এটি "ফাঁদ" সমস্যাটি আরও ভালভাবে পরিচালনা করতে পারে। এটি চেষ্টা করতে হবে।
জেএম

2

আপনি এটিকে একটি প্রান্ত sshদিয়ে লঞ্চ &করতে পারেন, এটি পটভূমিতে রাখতে এবং এটি করার সময় এটির আইডি ধরতে পারে। তারপরে আপনার killকাজ শেষ হয়ে গেলে আপনাকে সেই আইডিটির একটি করতে হবে।


অ্যাম্পারস্যান্ড ("&") ব্যবহার করে সচেতন হন। এটি একটি কুরুচিপূর্ণ পদ্ধতির যেহেতু আপনাকে নিজের জন্য প্রতিষ্ঠিত প্রকৃত সংযোগটি নির্ধারণ করতে হবে। এটি আরও কোড কার্যকর করতে পারে যা প্রকৃত সংযোগটি সম্পূর্ণরূপে প্রতিষ্ঠিত হওয়ার অপেক্ষায় নেই। এছাড়াও স্ক্রিপ্টটি ভেঙে গেলে সংযোগটি স্বয়ংক্রিয়ভাবে মারা যাবে না।
জোনাথন

2

আর একটি সম্ভাব্য বিকল্প - যদি আপনি প্রত্যাশিত প্যাকেজটি ইনস্টল করতে পারেন তবে আপনার পুরো জিনিসটি স্ক্রিপ্ট করতে সক্ষম হওয়া উচিত। কিছু ভাল উদাহরণ এখানে: http://en.wikedia.org/wiki/Expect

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.