এসএসএইচ সংযোগের সময় ডকার পাত্রে স্বয়ংক্রিয়ভাবে ব্যাশ চালায়


0

আমার কাছে ডকার একটি এডাব্লুএস ইসি 2 ইভেন্টে চলছে (ইলাস্টিক বিয়ানস্টালক)। আমি ইন্টারেক্টিভ কন্টেইনারে ব্যাশ চালানোর জন্য চাই স্বয়ংক্রিয়ভাবে একটি স্ক্রিপ্ট আমি সব কমান্ড প্রত্যেক সময় টাইপ মাধ্যমে যাওয়া ছাড়া আমার শেল থেকে চালানো হয়।

রেজেক্সের ভিত্তিতে স্বতন্ত্র যুক্তিগুলি মুদ্রণ সম্পর্কে একটি সুপারভাইজার উত্তর ব্যবহার করে এটি তৈরি করেছি। আমি যদি টাইপ বা এডাব্লুএস-এ লগ ইন করার সময় এটি আটকে দিই তবে এটি ঠিক আছে।

sudo docker exec -it $(sudo docker ps | awk '{for(i=1;i<=NF;i++){if($i~/ecs-awseb-mything-.*/){print $i}}}') bash

এটি আমার এসএসএইচ সংযোগ "স্ক্রিপ্ট":

#!/usr/bin/env bash
ssh -i /path/to/my.pem awsuser@myhost

আমি উভয়কে ssh -t ব্যবহার করে কোনও উপকারের সাথে একত্রিত করার চেষ্টা করেছি:

#!/usr/bin/env bash
ssh -i /path/to/my.pem awsuser@myhost -t "sudo docker exec -it $(sudo docker ps | awk '{for(i=1;i<=NF;i++){if($i~/ecs-awseb-mything-.*/){print $i}}}') bash"

তবে ভাগ্য নেই। কনসোল সেশনের প্রতিলিপিটি এখানে:

myuser@MYCOMPUTER:~$ ./myscript.sh
sudo: unable to resolve host MYCOMPUTER
[sudo] password for myuser:

myuser@MYCOMPUTER:~$

দেখে মনে হচ্ছে এটি কমান্ডটি কার্যকর করার চেষ্টা করছে এবং তারপরে সংযোগ স্থাপন করবে? সুতরাং আমি এটি এটিকে পরিবর্তন করেছিলাম:

#!/usr/bin/env bash
ssh -i /path/to/my.pem -t "sudo docker exec -it $(sudo docker ps | awk '{for(i=1;i<=NF;i++){if($i~/ecs-awseb-mything-.*/){print $i}}}') bash" awsuser@myhost

এখনও ঠিক একই সমস্যা। সাহায্যের জন্য ধন্যবাদ!

উত্তর:


0

আপনার দাবিতে আপনি ঠিক বলেছেন যে এসএসএস হওয়ার আগে সাবকম্যান্ডটি চলছে। এর কারণ আপনার শেলটি পাঠ্যটি ভিতরে দেখে $( ... )এবং এটি প্রথমে কার্যকর করে। পুরো কমান্ডটি 'ডাবল কোটের পরিবর্তে একক উদ্ধৃতিতে সংযুক্ত করে এটির চারপাশে কাজ করা সম্ভব "তবে নেস্টেড উদ্ধৃতি দেওয়ার চেষ্টা করার সাথে এটি জটিল হয়ে যায়। ভাগ্যক্রমে একটি সহজ উপায় আছে।

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

docker rename dc66a6ad31ca container_shell

dc66a6ad31caআপনার চলমান ধারকটির নাম দিয়ে প্রতিস্থাপন করুন (যা আপনি চালিয়ে পেতে পারেন docker ps)

একবার আপনি এটি করার পরে, আপনার ssh কমান্ডটি এভাবে চালান:

ssh -i /path/to/my.pem awsuser@myhost -t "sudo docker exec -it container_shell bash"

এবং এটি করা উচিত। -tSSH কমান্ড বিকল্পটি তারপর Docker কমান্ড উপর -t ধারক ভিতরে একই আছে, একটি Pty বরাদ্দ বাধ্য করা প্রয়োজন।

আপনি যদি নিজের ব্যবহারকারীকে ডকার গ্রুপে রাখেন তবে কমান্ডে সুডো সরিয়ে নেওয়াও সম্ভব, তবে এটি একটি optionচ্ছিক পদক্ষেপ।

সম্পাদনা

@ অর্গনল ডেভ উল্লেখ করেছেন যে ইলাস্টিক বিয়ানস্টালক একটি ধারকটির নাম পরিবর্তন করতে দেয় না, সুতরাং এটির জন্য গ্রেপ করা দরকার। তার সমাধানটি হ'ল:

ssh -i /path/to/my.pem myuser@host -t 'sudo docker exec -it $(sudo docker ps | grep -o ecs-awseb-mything-.*) bash'

প্যাটার্নের সাথে মেলে এমন একাধিক পাত্রে থাকা অবস্থায় গ্রেপের আউটপুট কেবলমাত্র প্রথম ম্যাচে সীমাবদ্ধ রাখতে কার্যকর হতে পারে। এটি -m 1গ্রেপ কমান্ডে যুক্ত করে কমান্ড লাইনের চেহারা তৈরি করে করা যেতে পারে :

ssh -i /path/to/my.pem myuser@host -t 'sudo docker exec -it $(sudo docker ps | grep -om1 ecs-awseb-mything-.*) bash'

দুর্ভাগ্যক্রমে ইলাস্টিক বিয়ানস্টালকের নাম পাতাগুলি যা খুশি তাই নাম লেখার জন্য আমাকে সত্যিই একটি রেইজেক্স বা অন্য কোনও প্যাটার্নের সাথে মেলে। আমি যদিও নেস্টেড একক উদ্ধৃতিগুলি সন্ধান করব, ধন্যবাদ
OrgnlDave

একক উদ্ধৃতিতে কমান্ডটি কোথায় लपेटতে হবে তা নির্ধারণ করতে পারছি না। পুরো জিনিসটি কাজ করে না, কেবল $ () বিভাগটি কাজ করে না, "" টু-টু '' পরিবর্তন করে কাজ করে না (সঠিকভাবে পালিয়ে যাওয়া '
অ্যাডাব্লুকের

আমি আপনার উত্তরটি ব্যবহার করেছি তবে পরিবর্তে গ্রেপ ব্যবহার করেছি যাতে আমি সিঙ্গেল-কোটগুলির জন্য অ্যাডকের প্রয়োজন এড়াতে পারি। উত্তর এখানে। আপনি যদি এতে নিজের পরিবর্তন করেন তবে আমি তা গ্রহণ করব। 2 দিন বা আমি নিজেই জবাব দেব :-D ssh -i /path/to/my.pem myuser @ host -t 'sudo docker exec -it it (sudo docker ps | grep -o ecs-awseb-mything -। * ) বাশ '
OrgnlDave

-1

আপনার একটি টিটিআই-এর দরকার নেই, কেবল স্যুইচ ছাড়াই রিমোট কমান্ড যুক্ত করুন।

#!/usr/bin/env bash
ssh -i /path/to/my.pem awsuser@myhost "sudo docker exec -it $(sudo docker ps | awk '{for(i=1;i<=NF;i++){if($i~/ecs-awseb-mything-.*/){print $i}}}') bash" 

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