স্ক্রিপ্টে টাইমআউট সহ এসএসএস কীভাবে করবেন?


173

আমি একটি দূরবর্তী হোস্টে পাসওয়ার্ড-কম এসএসএইচের মাধ্যমে সংযুক্ত একটি স্ক্রিপ্ট সম্পাদন করছি। আমি একটি টাইমআউট সেট করতে চাই, যাতে দূরবর্তী হোস্ট যদি চালাতে অসীম সময় নেয়, আমি সেই এসএসএস অধিবেশন থেকে বেরিয়ে আসতে চাই এবং আমার sh স্ক্রিপ্টের অন্যান্য লাইনগুলি চালিয়ে যেতে চাই।

কীভাবে করবেন এটি সম্পর্কে কোনও ধারণা?



আপনি যদি কেবলমাত্র "আপনার sshঅধিবেশনে আরও বেশি সময় থাকতে " (এখানে "এসএসএইচ সংযোগের সময়সীমা বাড়াতে কীভাবে?") প্রশ্নটিতে পুনঃনির্দেশিত হন , তবে এটি ভুল জায়গা । উত্তরটি ssh-timeout সম্পর্কে এই লিঙ্কে রয়েছে
পিটার ক্রাউস

উত্তর:


288
ssh -o ConnectTimeout=10  <hostName>

যেখানে 10 সেকেন্ডে সময় হয়। এই টাইমআউটটি কেবলমাত্র সংযোগ তৈরির ক্ষেত্রে প্রযোজ্য।


4
কানেক্টটাইমআউট কেবল সংযোগ সেটআপে একটি টাইমআউট সেট করে, তাই না?
অরুলিয়ান ওমস

10
এটি আসলে "রিমোট হোস্ট চালানোর জন্য অসীম সময় নিচ্ছে" এর জন্য কাজ করে না: "ssh -o কান্টটাইমআউট = 5 হোস্ট 'স্লিপ 10'" 5 নয়, 10 সেকেন্ডের জন্য অপেক্ষা করে
ফেরি বোয়েন্ডার

109

-o ConnectTimeoutএবং ব্যবহার করুন -o BatchMode=yes -o StrictHostKeyChecking=no

ConnectTimeout ঝুলন্ত থেকে স্ক্রিপ্ট, রাখে BatchMode হোস্ট অজানা সঙ্গে ঝুলন্ত থেকে এটা রাখে, হ্যাঁ known_hosts জুড়তে, এবং StrictHostKeyChecking ফিঙ্গারপ্রিন্ট স্বয়ংক্রিয়ভাবে যোগ করা হয়েছে।

**** দ্রষ্টব্য **** "স্ট্রাইকটহস্টকিচেকিং" কেবলমাত্র এমন অভ্যন্তরীণ নেটওয়ার্কগুলির জন্যই হয়েছিল যেখানে আপনি নিজের হোস্টকে বিশ্বাস করেন। এসএসএইচ ক্লায়েন্টের সংস্করণ অনুসারে, "আপনি কি নিজের আঙুলের ছাপ যুক্ত করার বিষয়ে নিশ্চিত" ক্লায়েন্টকে অনির্দিষ্টকালের জন্য স্তব্ধ করতে পারে (মূলত পুরানো সংস্করণগুলি এআইএক্স-এ চলছে)। বেশিরভাগ আধুনিক সংস্করণ এই সমস্যাটিতে ভুগছে না। যদি আপনাকে একাধিক হোস্টের সাথে ফিঙ্গারপ্রিন্টগুলি মোকাবেলা করতে হয় তবে আমি জেনে রাখা_প্রেমী ফাইলটি পুতুল / উত্তরযোগ্য / শেফ / নুন / ইত্যাদি জাতীয় কনফিগারেশন পরিচালন সরঞ্জামের সাথে বজায় রাখার পরামর্শ দিচ্ছি।


11
কেবল -o StrictHostKeyChecking=noপ্রশ্নটিকেই সম্বোধন করে না, তবে আপনি সুরক্ষা সম্পর্কে চিন্তা করলে এটি একটি ভয়াবহ ধারণা, এটিই কারণ যে আপনি প্রথম স্থানে এসএসএইচ ব্যবহার করছেন।
ডলফ

9
স্ট্রিটহস্টকি চেকিং = না এর সম্ভাব্য সুরক্ষা সম্পর্কিত প্রভাবগুলি উল্লেখ করা ভাল good তবে এটি কার্যকর করার সময় স্ক্রিপ্টটি ঝুলতে বাধা দেবে।
ডগ

2
সতর্কতামূলক !!!! @ ডল্ফ যেমন লিখেছেন, StrictHostKeyChecking=noআপনি যদি সুরক্ষা সম্পর্কে মোটেই চিন্তা করেন তবে ব্যবহার করবেন না । @ ডাওগ: স্ক্রিপ্টটি হ্যাং করবে না - এটি কেবলমাত্র জোর করবে যে আপনি প্রথমবারের মতো ম্যানুয়ালি দূরবর্তী হোস্টের কাছে চলে আসুন, সুতরাং এটি হোস্টকে জানতে পারে। তবে এটি আপনাকে এমআইটিএম আক্রমণ থেকে রক্ষা করবে। এটি প্রতিফলিত করতে দয়া করে এই উত্তরটি সম্পাদনা করুন কারণ এটি দাঁড়ানো যেমন একটি বিপজ্জনক পরামর্শ। এমনকি এটির জন্যও বলা হয়নি।
jhndodo

2
আমার উত্তর আপডেট। আমার অভিজ্ঞতা থেকে এটি কিছু ক্লায়েন্টকে হ্যাং করতে পারে।
ডগ

50

এটা চেষ্টা কর:

timeout 5 ssh user@ip

সময়সীমা ssh কমান্ড (আরগস সহ) কার্যকর করে এবং sshterM প্রেরণ করে যদি ssh 5 সেকেন্ডের পরে না আসে। সময়সীমা সম্পর্কে আরও তথ্যের জন্য, এই নথিটি পড়ুন : http://man7.org/linux/man-pages/man1/timeout.1.html

অথবা আপনি ssh এর পরম ব্যবহার করতে পারেন:

ssh -o ConnectTimeout=3 user@ip

4
আপনি যদি কোনও ম্যাকের জন্য এই আদেশটি সন্ধান করছেন brew install coreutilsতবে চেষ্টা করুন এবং তারপরে ব্যবহার করুন gtimeout (উত্স: stackoverflow.com/questions/3504945/timeout-command-on-mac-os-x )।
লার্চার

3
এটি আপনার যা ইচ্ছা তা করতে পারে না। কমান্ডটি বিবেচনা timeout 3s ssh user@server 'sleep 5; echo blarg >> /tmp/blarg' করুন এটি এসএসএইচ ক্লায়েন্টের পক্ষ থেকে প্রক্রিয়াটিকে মেরে ফেলে, তবে / টিএমপি / ব্লারগ এখনও রিমোট সার্ভারে পরিবর্তিত হয়। এর অর্থ হ'ল আপনি যদি রিমোট সার্ভারে পলাতক সিপিইউ-নিবিড় কাজ চালাচ্ছেন তবে আপনি প্রক্রিয়া ফাঁস করবেন।
জেমি ডেভিস

1
@ জামিডিভিএসএসএস ব্যবহারকারী @ সার্ভার 'টাইমআউট 5 এস ঘুম 10' সম্পর্কে কী বলছেন?
ফিলিপআর

18

আপনি পতাকা সঙ্গে সংযোগ করতে পারে

-o সার্ভারএলাইভআইন্টারওয়াল = <সেকস>
সুতরাং এসএসএইচ ক্লায়েন্ট <secs>কেবল সংযোগটি বাঁচিয়ে রাখতে প্রতি সেকেন্ডে একটি নাল প্যাকেট সার্ভারে প্রেরণ করবে । লিনাক্সে এটি বিশ্বব্যাপী /etc/ssh/ssh_configবা প্রতি-ব্যবহারকারীর মধ্যেও সেট করা যেতে পারে ~/.ssh/config


4
এটি প্রশ্নটির অনুরোধটির বিপরীত মত শোনাচ্ছে।
ডিভর কিউবারিক

1

যদি সমস্ত কিছু ব্যর্থ হয় ( timeoutকমান্ড না থাকা সহ ) এই শেল স্ক্রিপ্টের ধারণাটি কাজ করবে:

 #!/bin/bash
 set -u
 ssh $1 "sleep 10 ; uptime" > /tmp/outputfile 2>&1 & PIDssh=$!
 Count=0
 while test $Count -lt 5 && ps -p $PIDssh > /dev/null
 do
    echo -n .
    sleep 1
    Count=$((Count+1))
 done
 echo ""

 if ps -p $PIDssh > /dev/null
 then
    echo "ssh still running, killing it"
    kill -HUP $PIDssh
 else
    echo "Exited"
 fi

0

ঠিক আছে, আপনি 'নন-ব্লকিং মোডে' যা চালাচ্ছেন চালানোর জন্য আপনি নোহুপ ব্যবহার করতে পারেন। সুতরাং আপনি যা চালানোর, চালানো, অন্যথায় প্রস্থান করার কথা ছিল তা পরীক্ষা করেই চালিয়ে যেতে পারেন।

nohup ./my-script-that-may-take-long-to-finish.sh &
./check-if-previous-script-ran-or-exit.sh
প্রতিধ্বনি "স্ক্রিপ্ট 15 ফেব্রুয়ারী, 2011, 9:20 এএম"> /tmp/done.txt এ শেষ হয়েছে

সুতরাং দ্বিতীয়টিতে আপনি কেবল ফাইলটি উপস্থিত আছে কিনা তা পরীক্ষা করে দেখুন।


বোধ হয়। তবে, যে স্ক্রিপ্টটি চলছে তা আমাকে কিছু আউটপুট দেয় যা কনসোলে প্রদর্শিত হয় .. কীভাবে আমার পূর্ববর্তী স্ক্রিপ্টটি চলেছে বা প্রস্থান হবে তা যাচাই করবেন? $? বা অন্য কিছু?
user57421

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