শেল স্ক্রিপ্টিং: ইন্টারনেট সংযোগের জন্য পরীক্ষা করার সঠিক উপায়?


26

আমি এমন স্ক্রিপ্ট পেয়েছি যেগুলি বলে যে তারা ইন্টারনেট সংযোগের জন্য পরীক্ষা করে। ইন্টারফেসটি শেষ হলে কেউ আইপি ঠিকানাটি পরীক্ষা করে তবে এটি ইন্টারনেট সংযোগের জন্য যাচাই করে না। আমি এমন কিছু পাই যা এই জাতীয় পিং ব্যবহার করে: if [ 'ping google.com -c 4 | grep time' != "" ]; thenতবে কখনও কখনও এটি অবিশ্বাস্য হতে পারে কারণ পিং নিজেই কোনও কারণে ঝুলতে পারে (যেমন কিছু আটকে যাওয়া আইওয়ের জন্য অপেক্ষা করা)।

স্ক্রিপ্টগুলি ব্যবহার করে ইন্টারনেট সংযোগের জন্য যাচাই করার সঠিক / নির্ভরযোগ্য উপায় সম্পর্কে কোনও পরামর্শ? আমার কি কিছু প্যাকেজ ব্যবহার করতে হবে?

cronউদাহরণস্বরূপ এটি পর্যায়ক্রমে পরীক্ষা করতে সক্ষম হওয়া প্রয়োজন , তারপরে, সংযোগটি অনুরোধের মতো নেমে যাওয়ার পরে কিছু করুনifup --force [interface]

উত্তর:


29

আইপিভি 4 সংযোগের পরীক্ষা করা হচ্ছে

যদি আপনার নেটওয়ার্ক পিংগুলি যেতে দেয় তবে 8.8.8.8 (গুগল দ্বারা চালিত একটি সার্ভার) পিং করার চেষ্টা করুন।

if ping -q -c 1 -W 1 8.8.8.8 >/dev/null; then
  echo "IPv4 is up"
else
  echo "IPv4 is down"
fi

আইপি সংযোগ এবং ডিএনএস পরীক্ষা করা হচ্ছে Test

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

if ping -q -c 1 -W 1 google.com >/dev/null; then
  echo "The network is up"
else
  echo "The network is down"
fi

ওয়েব সংযোগ পরীক্ষা করা হচ্ছে

কিছু ফায়ারওয়াল পিংস ব্লক করে। কিছু জায়গায় ফায়ারওয়াল রয়েছে যা ওয়েব প্রক্সি বাদে সমস্ত ট্র্যাফিককে ব্লক করে। আপনি যদি ওয়েব সংযোগ পরীক্ষা করতে চান তবে আপনি একটি HTTP অনুরোধ করতে পারেন।

case "$(curl -s --max-time 2 -I http://google.com | sed 's/^[^ ]*  *\([0-9]\).*/\1/; 1q')" in
  [23]) echo "HTTP connectivity is up";;
  5) echo "The web proxy won't let us through";;
  *) echo "The network is down or very slow";;
esac

আপনি যে কোনও ওএসআই স্তর 3 চেকের আগে ইথোল ব্যবহার করে কোনও শারীরিক সংযোগের (ওএসআই স্তর 1) বৈধতা যুক্ত করতে চাইতে পারেন; $ ethtool <dev> | awk '$0 ~ /link detected/{print $3}'
জাস-

আপনি দয়া করে এটি যুক্ত করার উদ্দেশ্যটি ব্যাখ্যা করতে পারেন>/dev/null
আমিন হরবাউই

@ আমিনহর্বাউই - >/dev/nullমানক আউটপুটটিকে পুনর্নির্দেশ করে /dev/null, নাল ডিভাইসটি , যা এটিকে অপসারণ করে যেহেতু এটি ক্ষেত্রে পছন্দসই নয় (আমরা যে সমস্ত বিষয় যত্ন করি সেগুলি হ'ল আদেশগুলির প্রস্থান মান)। পরিবর্তে, আরও প্রয়োগযোগ্য আউটপুট echoলাইনগুলি থেকে নেওয়া হয় ।
অ্যাডাম কাটজ

27

আমি সংযোগটি নির্ধারণের জন্য ব্যবহারের বিরুদ্ধে অত্যন্ত প্রস্তাব দিই ping। অনেকগুলি নেটওয়ার্ক প্রশাসক রয়েছে যা তাদের নেটওয়ার্ক থেকে উত্সাহিত বন্যার আক্রমণ সম্পর্কিত উদ্বেগের কারণে আইসিএমপি (এটি ব্যবহার করে এমন প্রোটোকল) অক্ষম করে।

পরিবর্তে, আমি কোনও বন্দরে নির্ভরযোগ্য সার্ভারের একটি দ্রুত পরীক্ষা ব্যবহার করি যা আপনি আশা করতে পারেন:

if nc -zw1 google.com 443; then
  echo "we have connectivity"
fi

এই ব্যবহারের netcat ( nc) তার মধ্যে বন্দর স্ক্যান মোড, একটি দ্রুত অকর্মা ( -zহয় শূন্য, I / O মোড [স্ক্যানিং জন্য ব্যবহৃত] একটি দ্রুত সময়সীমার (সঙ্গে) -w 1অপেক্ষা করছে সর্বাধিক এক সেকেন্ড)। এটি 443 পোর্টে (এইচটিটিপিএস) গুগল চেক করে।

বন্দী পোর্টাল এবং স্বচ্ছ প্রক্সিগুলির বিরুদ্ধে সুরক্ষার প্রয়াস হিসাবে আমি HTTP এর পরিবর্তে এইচটিটিপিএস ব্যবহার করেছি যা কোনও হোস্টের জন্য 80 (HTTP) পোর্টে উত্তর দিতে পারে। 443 বন্দর ব্যবহার করার সময় এটির কম সম্ভাবনা রয়েছে যেহেতু সেখানে শংসাপত্রের সাথে মেলে না does

আপনি যদি এর বিপরীতে নিজেকে প্রমাণ করতে চান তবে আপনাকে এই সংযোগের সুরক্ষাটি বৈধতা দিতে হবে:

test=google.com
if nc -zw1 $test 443 && echo |openssl s_client -connect $test:443 2>&1 |awk '
  handshake && $1 == "Verification" { if ($2=="OK") exit; exit 1 }
  $1 $2 == "SSLhandshake" { handshake = 1 }'
then
  echo "we have connectivity"
fi

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


5
আমি গিলিজকে শ্রদ্ধা করি তবে এটি সঠিক উত্তর।
gwillie

3
-dউদাহরণস্বরূপ যুক্ত করুন nc -dzw1যাতে এটি STDIN না শুনায় এবং কোনও স্ক্রিপ্টে অনির্দিষ্টকালের জন্য ঝুলতে পারে। এবং সম্ভবত কোনও অনুসন্ধান সংরক্ষণ করতে google.com এর পরিবর্তে 8.8.8.8 ব্যবহার করুন। nc -dzw1 8.8.8.8 443
dezza

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

1
@ ডিজ্জা - -w 1কোনও সংযোগ না থাকাতে এখনও এক সেকেন্ড ব্যয় হয়, যদিও আপনার সম্ভবত ncকিছুটা অস্পষ্ট সমস্যা রয়েছে om আপনার যদি এনএম্যাপের সাম্প্রতিক সংস্করণ ইনস্টল করা থাকে তবে আপনি ncat --send-only --recv-only -w 334msব্যর্থতার সময়টি এক তৃতীয়াংশে কেটে ফেলতে পারেন nc(আমি খুঁজে পেয়েছি যে 334ms একটি ভাল অপেক্ষা করার সময়)।
অ্যাডাম কাটজ

1
@ ডিজ্জা - আমি জানি না যে সেই ব্যবস্থার জন্য এনএম্যাপের এনসিএটি এবং নেটক্যাট (এনসি) উভয় ক্ষেত্রেই আপনার সাথে এটি কেন ঘটছে। আপনার নেটওয়ার্ক বা বিএসডি সিস্টেমে কিছু অদ্ভুত ঘটনা ঘটতে পারে। একটি নতুন ইউনিক্স.সটাকেক্সচেঞ্জ প্রশ্ন তৈরি করতে নির্দ্বিধায় এবং এই সমস্যাটির দিকে আমার চোখের চেয়ে আরও বেশি কিছু পান। যদি আপনি তা করেন তবে দয়া করে এখানে মন্তব্যে এটি লিঙ্ক করুন এবং এই থ্রেডটিকে আপনার নতুন প্রশ্নের সাথে যুক্ত করুন।
অ্যাডাম কাটজ

9

আমি একটি স্ক্রিপ্ট তৈরি করেছি যা ইন্টারনেট সংযোগ (পিং, এনসি এবং কার্ল, অ্যাডাম কাটজ, গিলস এবং আরচেমারকে ধন্যবাদ) চেক করতে একাধিক উপায় ব্যবহার করে। আমি আশা করি যে কেউ এই দরকারী খুঁজে পেয়েছে। এটিকে আপনার পছন্দ অনুসারে সম্পাদনা করতে / নিখুঁত করতে পারেন।

আপনার গেটওয়ে, ডিএনএস এবং ইন্টারনেট সংযোগ পরীক্ষা করে (কার্ল, এনসি এবং পিং ব্যবহার করে)। এটিকে একটি ফাইলে রাখুন এবং এটিকে এক্সিকিউটেবল করে তুলুন (সাধারণত sudo chmod +x filename)

#!/bin/bash

GW=`/sbin/ip route | awk '/default/ { print $3 }'`
checkdns=`cat /etc/resolv.conf | awk '/nameserver/ {print $2}' | awk 'NR == 1 {print; exit}'`
checkdomain=google.com

#some functions

function portscan
{
  tput setaf 6; echo "Starting port scan of $checkdomain port 80"; tput sgr0;
  if nc -zw1 $checkdomain  80; then
    tput setaf 2; echo "Port scan good, $checkdomain port 80 available"; tput sgr0;
  else
    echo "Port scan of $checkdomain port 80 failed."
  fi
}

function pingnet
{
  #Google has the most reliable host name. Feel free to change it.
  tput setaf 6; echo "Pinging $checkdomain to check for internet connection." && echo; tput sgr0;
  ping $checkdomain -c 4

  if [ $? -eq 0 ]
    then
      tput setaf 2; echo && echo "$checkdomain pingable. Internet connection is most probably available."&& echo ; tput sgr0;
      #Insert any command you like here
    else
      echo && echo "Could not establish internet connection. Something may be wrong here." >&2
      #Insert any command you like here
#      exit 1
  fi
}

function pingdns
{
  #Grab first DNS server from /etc/resolv.conf
  tput setaf 6; echo "Pinging first DNS server in resolv.conf ($checkdns) to check name resolution" && echo; tput sgr0;
  ping $checkdns -c 4
    if [ $? -eq 0 ]
    then
      tput setaf 6; echo && echo "$checkdns pingable. Proceeding with domain check."; tput sgr0;
      #Insert any command you like here
    else
      echo && echo "Could not establish internet connection to DNS. Something may be wrong here." >&2
      #Insert any command you like here
#     exit 1
  fi
}

function httpreq
{
  tput setaf 6; echo && echo "Checking for HTTP Connectivity"; tput sgr0;
  case "$(curl -s --max-time 2 -I $checkdomain | sed 's/^[^ ]*  *\([0-9]\).*/\1/; 1q')" in
  [23]) tput setaf 2; echo "HTTP connectivity is up"; tput sgr0;;
  5) echo "The web proxy won't let us through";exit 1;;
  *)echo "Something is wrong with HTTP connections. Go check it."; exit 1;;
  esac
#  exit 0
}


#Ping gateway first to verify connectivity with LAN
tput setaf 6; echo "Pinging gateway ($GW) to check for LAN connectivity" && echo; tput sgr0;
if [ "$GW" = "" ]; then
    tput setaf 1;echo "There is no gateway. Probably disconnected..."; tput sgr0;
#    exit 1
fi

ping $GW -c 4

if [ $? -eq 0 ]
then
  tput setaf 6; echo && echo "LAN Gateway pingable. Proceeding with internet connectivity check."; tput sgr0;
  pingdns
  pingnet
  portscan
  httpreq
  exit 0
else
  echo && echo "Something is wrong with LAN (Gateway unreachable)"
  pingdns
  pingnet
  portscan
  httpreq

  #Insert any command you like here
#  exit 1
fi

সুন্দর! ধন্যবাদ ! আমাদের প্রবেশদ্বারটি কী সেট করা উচিত $GW?
সিপরিয়ান টমোয়াগ

@ সিপ্রিয়ানটোমিয়াগা দরকার নেই, /sbin/ip route | awk '/default/ { print $3 }'(আশাকরি) প্রাথমিক ইন্টারফেস থেকে প্রবেশদ্বার ঠিকানা পান। আপনি যদি চান তবে আপনি গেটওয়ে আইপি ঠিকানাটি নিজেরাই সেট করতে পারেন।
পিএনডিএ

এর জন্য ধন্যবাদ! তবে আমি যা মিস করছি তা হ'ল একটি টেক্সট ফাইলে ইন্টারনেট ব্যাহত হওয়া এবং আমার আইএসপিতে একটি স্বয়ংক্রিয় ইমেল।
rhand

2

ইন্টারনেটে অনেকগুলি আইপি রয়েছে, তাদের কয়েকটি পিং করার জন্য একটি হালকা পদ্ধতির উপায়

 if ping -c 4 google.com ; then OK ; else KO ; fi
 if ping -c 4 facebook.com ; then OK ; else KO ; fi
 if ping -c 4 nsa.gov ; then OK ; else KO ; fi # <- this one might not reply

আরও একটি সম্পূর্ণ উত্তর হতে পারে পৃষ্ঠা ব্যবহার করা wget

 wget google.com -o google.txt
 if parse google.txt ; then OK ; else KO ; fi

কোথায়

  • পার্স হ'ল এমন একটি প্রোগ্রাম যা আপনি লিখেছেন যে google.txt google.com এর একটি (খুব পুরানো) ক্যাশেড সংস্করণ নয়

1

প্রতিটি ব্যবহারকারী এবং অন্যান্য ওয়েব থেকে আপনার অবদানের জন্য ধন্যবাদ, আমি এই স্ক্রিপ্টটি 3 দিনের মধ্যে শেষ করতে সক্ষম হয়েছি। এবং আমি এটি ব্যবহারের জন্য বিনামূল্যে ছেড়ে দেব।

এই স্ক্রিপ্টটি আইপি ঠিকানার পুনর্নবীকরণ স্বয়ংক্রিয়ভাবে সংযোগটি হারিয়ে গেলে এটি অবিরামভাবে করে।

#!/bin/bash

# Autor: John Llewelyn
# FB: fb.com/johnwilliam.llewelyn
# Twitter: twitter.com/JWLLEWELYN
# TLF: +584-1491-011-15
# Its use is free.
# Description: Connection Monitor for ADSL modem.
# Requirements:
# Copy this code or save to /home/administrator/ConnectionMonitor.sh
# It requires the installed packages fping beep and cron
# Comment the blacklist pcspkr snd-pcsp in /etc/modprobe.d/blacklist.conf
# Give execute permissions: chmod +x /home/administrator/ConnectionMonitor.sh
# Add this line in crontab -e with root user
# @reboot sleep 120 && /home/administrator/MonitorDeConexion.sh

#################################################################################
# SETTINGS
TEST="8.8.8.8"       # TEST PING
ADAPTER1="enp4s0"    # EXTERNAL ETHERNET ADAPTER

# Report
LOGFILE=/home/administrator/Documentos/ReportInternet.log

# Messages
MESSAGE1="Restoring Connectivity..."
MESSAGE2="Wait a moment please..."
MESSAGE3="No Internet connectivity."
MESSAGE4="Yes, there is Internet connectivity."
#################################################################################

# Time and Date
TODAY=$(date "+%r %d-%m-%Y")

# Show IP Public Address
IPv4ExternalAddr1=$(ip addr list $ADAPTER1 |grep "inet " |cut -d' ' -f6|cut -d/ -f1)
IPv6ExternalAddr1=$(ip addr list $ADAPTER1 |grep "inet6 " |cut -d' ' -f6|cut -d/ -f1)

# Alarm
alarm() {
    beep -f 1500 -l 200;beep -f 1550 -l 200;beep -f 1500 -l 200;beep -f 1550 -l 200;beep -f 1500 -l 200;beep -f 1550 -l 200;beep -f 1500 -l 200;beep -f 1550$
}

# Restoring Connectivity
resolve() {
    clear
    echo "$MESSAGE1"
    sudo ifconfig $ADAPTER1 up;sudo dhclient -r $ADAPTER1;sleep 5;sudo dhclient $ADAPTER1
    echo "$MESSAGE2"
    sleep 120
}

# Execution of work
while true; do
    if [[ "$(fping -I $ADAPTER1 $TEST | grep 'unreachable' )" != "" ]]; then
        alarm
        clear
        echo "================================================================================" >> ${LOGFILE}
        echo "$MESSAGE3 - $TODAY"                                                               >> ${LOGFILE}
        echo "$MESSAGE3 - $TODAY"
        echo "================================================================================" >> ${LOGFILE}
        sleep 10
        resolve
    else
        clear
        echo "================================================================================"   >> ${LOGFILE}
        echo "$MESSAGE4 - $TODAY - IPv4 Addr: $IPv4ExternalAddr1 - IPv6 Addr: $IPv6ExternalAddr1" >> ${LOGFILE}
        echo "$MESSAGE4 - $TODAY - IPv4 Addr: $IPv4ExternalAddr1 - IPv6 Addr: $IPv6ExternalAddr1"
        echo "================================================================================"   >> ${LOGFILE}
        sleep 120
    fi
done

পেস্টবিন: https://pastebin.com/wfSkpgKA


এই উত্তরটি কী আরও ভাল করে তুলবে: (1) স্ক্রিপ্টটি কীভাবে কাজ করে তা ব্যাখ্যা করা। (দেখে মনে হচ্ছে ব্যবহারকারীকে যদি তার নেটওয়ার্ক ইন্টারফেস ব্যতীত অন্য কোনও কিছু বলা হয় তবে স্ক্রিপ্টটি সম্পাদনা করতে হবে eth0, তবে এটি উল্লেখ করা হয়নি।) (২) ইংরেজি ব্যবহার করে। (3) সমস্ত শেল ভেরিয়েবল (যেমন "$HOST", "$LINE1"এবং "$LOG") ডাবল উদ্ধৃতিতে রেখে দেওয়া। (4) হয় সেট করুন LINE2বা এটি ব্যবহার করবেন না। (আমি সন্দেহ করি যে আপনি LINE1 / এর সাথে  LINE2বিভ্রান্ত হয়েছেন inet4 /  inet6) ... (চালিয়ে যাওয়া)
জি-ম্যান বলেছেন

(চালিয়ে যাওয়া) ... (৫) আসলে আপনি বর্তমান সময়টি প্রদর্শন করছেন যখন আপনি বলছেন যে আপনি বর্তমান সময়টি প্রদর্শন করছেন, বরং স্ক্রিপ্ট শুরু হওয়ার সময়টিকে ক্যাপচার করার পরিবর্তে এবং স্ক্রিপ্টের আজীবন জুড়ে প্রদর্শন করা। ()) আমার মনে হয় অন্য কিছু ছিল তবে আমি এখন এটি দেখতে পাচ্ছি না।
জি-ম্যান

এটি স্প্যানিশ ভাষায় কারণ এটি আমার ভাষায়, তবে আমি এটি ইংরেজিতে সংশোধন করতে পারি। $ HOST হল চেষ্টা করার ঠিকানা। $ লাইন 1 হল ইন্টারনেট সংযোগ যা এথ0 অ্যাডাপ্টারের মাধ্যমে সংযুক্ত থাকে। $ লাইন 2 হ'ল ইন্টারনেট সংযোগ যা এথ 1 অ্যাডাপ্টারের মাধ্যমে সংযুক্ত থাকে যদি আপনার কাছে 2 টি ইন্টারনেট লাইন থাকে তবে এটি আপনাকে অক্ষম রেখে দেওয়ার পরামর্শ দেওয়া হয়। তারিখটি, যদি আমি যাচাই করি যে আমি স্ক্রিপ্টটি শুরু করার পরে এটি একই সময় এবং তারিখ বজায় রাখে, আমাকে সেই সমস্যাটি সংশোধন করতে হবে। এই সপ্তাহান্তে আমি সমস্যাটি সংশোধন করছি।
জন ল্লেওলিন

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