सफल होने तक ssh कमांड कैसे चलाएं?


28

कभी-कभी मैं एक उपकरण को पुनरारंभ करता हूं और sshजब यह तैयार होता है, तो इसे वापस करने की आवश्यकता होती है ।

मैं ssh कमांड को हर 5 सेकंड में चलाना चाहता हूं जब तक कि कमांड सफल न हो जाए।

मेरा पहला प्रयास:

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सफलतापूर्वक कनेक्ट होने के बाद गैर-शून्य स्थिति के साथ बाहर निकल सकता है यदि कनेक्शन के लिए कुछ बाहरी सत्र समाप्त होता है, तो उस स्थिति में स्क्रिप्ट पुन: कनेक्ट करने का प्रयास करेगी। यह एक वांछनीय दुष्प्रभाव हो सकता है या नहीं।
ऑस्टिन हेमेलर्गरन


15

ओपनएसएसएच की एक ConnectionAttemptsसेटिंग है जो लगभग वही करती है जो आप चाहते हैं। डिफ़ॉल्ट 1 है, लेकिन आप इसे ssh_configया कमांड-लाइन पर बदल सकते हैं :

ssh -o 'ConnectionAttempts 10' ...

दुर्भाग्य से आप उस प्रयास अंतराल को समायोजित नहीं कर सकते हैं जो 1 सेकंड में तय किया गया है, लेकिन आप उसी तरह से कनेक्शन प्रयास टाइम-आउट ConnectTimeout(सेकंड में) समायोजित कर सकते हैं ।


यह मेरे लिए काम नहीं कर रहा है: /
फ्रीडो

@ फ़्रीडो: क्या आप बता सकते हैं कि वास्तव में आपने क्या कोशिश की और क्या काम नहीं किया? साथ ही, आपके मुद्दे के बारे में एक नया प्रश्न लिखना बेहतर होगा । टिप्पणियों में आ लिंक के माध्यम से मेरा ध्यान आकर्षित करने के लिए आपका स्वागत है।
डेविड फ़ॉस्टर

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सेकंड को ssh लॉन्च करने की कोशिश करेंगे , AUTOSSH_GATETIME=0अगर यह पहली कोशिश विफल हो जाती है (तो निश्चित रूप से आप क्या चाहते हैं), -M 0ऑटोसॉश द्वारा कनेक्शन की जाँच को निष्क्रिय कर देता है, बाद के सभी विकल्प ssh में पास हो जाते हैं। -oयदि कनेक्शन 5s से अधिक के लिए छोड़ देता है, तो दो विकल्प 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.