সফল হওয়া অবধি ssh কমান্ড কিভাবে চালানো যায়?


28

কখনও কখনও আমি কোনও ডিভাইস পুনরায় চালু করি এবং sshএটি প্রস্তুত হয়ে গেলে আবার ফিরে আসার প্রয়োজন ।

কমান্ডটি সফল না হওয়া পর্যন্ত আমি প্রতি 5 সেকেন্ডে ssh কমান্ড চালাতে চাই।

আমার প্রথম প্রচেষ্টা:

watch -n5 ssh me@device.local && exit 1

কিভাবে আমি এটি করতে পারব?


আপনি কি ইন্টারেক্টিভ এসএসএইচ সেশন চান?
কেউ নেই

@ নোডি হ্যাঁ আমি করি
ফিলিপ কির্কব্রাইড

ঠিক আছে, আমি প্রথমে ভেবেছিলাম আমার ধারণাটি ইন্টারেক্টিভভাবে কাজ করবে না, তবে একটি সংক্ষিপ্ত পরীক্ষা দেখিয়েছে যে এটি তাই হয় আমি যাইহোক উত্তর লিখলাম। :)
কেউই নয়

উত্তর:


30

আরেকটি বিকল্প ব্যবহার করা হবে until

until ssh me@device.local; do
    sleep 5
done

আপনি যদি বার বার এটি বেশ কয়েকটি হোস্টের জন্য করেন তবে এটি আপনার একটি ফাংশনে রাখুন ~/.bashrc

repeat()
{
read -p "Enter the hostname or IP of your server :" servername
until ssh $servername; do
    sleep 5
done
}

1
ধন্যবাদ, আমি পুনরাবৃত্তি স্ক্রিপ্টটি ব্যবহার করতে যাচ্ছি তবে $প্রম্পটের পরিবর্তে :-)
ফিলিপ কার্কব্রাইড

14
এটি লক্ষণীয় যে sshসংযোগের বাহ্যিক কিছু সেশনটি সমাপ্ত করে যদি সাফল্যের সাথে সংযুক্ত হওয়ার পরে একটি শূন্য-স্থিতি স্থিতির সাথে প্রস্থান করতে পারে তবে সেই ক্ষেত্রে স্ক্রিপ্টটি আবার সংযোগ করার চেষ্টা করবে will এটি বাঞ্ছনীয় পার্শ্ব প্রতিক্রিয়া হতে পারে বা নাও পারে।
অস্টিন হেমেলগারন


15

ওপেনএসএইচ-এর একটি ConnectionAttemptsসেটিংস রয়েছে যা আপনি যা চান প্রায় তা করে। ডিফল্টটি 1 হয় তবে আপনি ssh_configএটি কমান্ড-লাইনে বা এটিকে পরিবর্তন করতে পারেন :

ssh -o 'ConnectionAttempts 10' ...

দুর্ভাগ্যক্রমে আপনি প্রয়াসের ব্যবধানটি ঠিক করতে পারবেন না যা 1 সেকেন্ডে স্থির করা হয়েছে, তবে আপনি ConnectTimeoutএকই ফ্যাশনে সংযোগের চেষ্টা টাইম আউট (সেকেন্ডে) সামঞ্জস্য করতে পারেন ।


এটি আমার পক্ষে কাজ করছে বলে মনে হচ্ছে না: /
ফ্রিডো

@ ফ্রিডো: আপনি ঠিক কী চেষ্টা করেছেন এবং কোনটা কার্যকর হয়নি তা আপনি দয়া করে ব্যাখ্যা করতে পারেন? এছাড়াও, আপনার সমস্যা সম্পর্কে একটি নতুন প্রশ্ন লেখার চেয়ে ভাল হবে be মন্তব্যগুলিতে এএ লিঙ্কের মাধ্যমে এটিতে আমার দৃষ্টি আকর্ষণ করতে আপনাকে স্বাগতম welcome
ডেভিড ফোস্টার

14
while ! ssh user@host.example.com true; do
    sleep 5
done; echo "Host is back up at $(date)!"

2
অথবা, যদি আপনি পরিষেবাটি শেষ না হওয়া পর্যন্ত আসলে লগ ইন করতে না চান while ! nc -w5 -z host.example.com 22; do [...],।
ডোপঘোটি

4

autosshssh সেশনগুলি বাঁচিয়ে রাখে। ডান প্যারামিটারগুলির সাহায্যে আপনি এটি চালু করতে পারবেন যখন এটি সংযোগ করা বর্তমানে অসম্ভব এবং এটি সফল না হওয়া পর্যন্ত এটি চেষ্টা করবে। এটি দুর্দান্ত কাজ করে তবে আপনি যদি পুনরায় সংযোগ অংশটি ইন্টারেক্টিভ সেশনগুলির সাথে সুন্দরভাবে কাজ করতে চান তবে আপনাকে এটির সাথে একত্রিত করতে হবেscreen সমতুল্য বা সমমানের প্রয়োজন।

আমি এটি সুপারিশ:

AUTOSSH_POLL=5 AUTOSSH_GATETIME=0 autossh -M 0 -o ServerAliveInterval=5 -o ServerAliveCountMax=1 user@host

তবে বিশদটির জন্য এর ম্যান পৃষ্ঠাটি দেখুন। উপরের প্যারামিটারগুলির সাথে autosshপ্রতি AUTOSSH_POLLসেকেন্ডে এসএসএস চালু করার চেষ্টা করবে , AUTOSSH_GATETIME=0যদি প্রথম চেষ্টা ব্যর্থ হয় (তবে অবশ্যই আপনি যা চান) ব্যর্থ -M 0হয়, অটোশ দ্বারা সংযোগ পরীক্ষা অক্ষম করে, পরে সমস্ত বিকল্পগুলি এসএস-এ প্রেরণ করা হবে। -oসংযোগগুলি 5-এর বেশি হয়ে গেলে দুটি বিকল্পই ssh প্রস্থান করে।


2

একটি উত্তরে কেবল কোড নিক্ষেপের ঝুঁকিতে, এই স্ক্রিপ্টটি প্রতিদিনের জন্য আমার জন্য কাজ করে। আমি এটিকে ডাকি resshএবং এটি যেমন সহজভাবে ressh {hostname}বা যত্ন সহ ব্যবহার করা যেতে পারে ,ressh -S {session_name} {hostname}

#!/bin/bash
#
# Repeatedly attempt to reconnect to a remote ssh server
########################################################################
#
prefix="${0/*\/}"
port=
session=
action=ssh              # How to connect remotely

while getopts 'l:Lp:P:S:' OPT
do
    case "$OPT" in
        l)      [[ s == "$OPTARG" ]] && action=list ;;
        L)      action=list ;;
        [Pp])   port="$OPTARG" ;;
        S)      session="$OPTARG";; ## ; [[ $session =~ ^[0-9]+$ ]] && session="${prefix}-$session" ;;
    esac
done
shift $(($OPTIND - 1))

host="$1"
shift

if [[ -z "$host" ]]
then
    echo "ERROR: Missing hostname" >&2
    exit 1
fi


if [[ list == "$action" ]]
then
    ssh ${port:+-p $port} "$host" "screen -ls"
    exit 0
fi

# Connect repeatedly to the target host system
#
[[ -z "$session" ]] && session="${prefix}-$$.$host"

while :
do
    ssh -tt ${port:+-p $port} "$host" "screen -dr $session || screen -S $session $*"
    ss=$?
    [[ 0 -eq $ss ]] && break

    [[ 255 -eq $ss ]] && sleep 4
    sleep 1
    echo "Reconnecting to session $session on $host..."
done


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