كيفية إنشاء برنامج نصي باش للتحقق من اتصال SSH؟

StackOverflow https://stackoverflow.com/questions/1405324

  •  05-07-2019
  •  | 
  •  

سؤال

وأنا في عملية إنشاء برنامج نصي باش التي من شأنها أن تسجيل الدخول إلى الأجهزة البعيدة وخلق المفاتيح الخاصة والعامة.

ومشكلتي هي أن الأجهزة البعيدة ليست موثوقة جدا، وأنها ليست دائما. أحتاج السيناريو باش التي من شأنها أن تحقق إذا كان الاتصال SSH متروك. قبل إنشاء فعلا مفاتيح لاستخدامها في المستقبل.

هل كانت مفيدة؟

المحلول

ويمكنك التحقق من ذلك مع سه عودة القيمة يعطيك:

$ ssh -q user@downhost exit
$ echo $?
255

$ ssh -q user@uphost exit
$ echo $?
0

وتحرير: هناك نهج آخر يتمثل في استخدام NMAP (أنك لن تحتاج إلى مفاتيح أو الدخول الاشياء):

$ a=`nmap uphost -PN -p ssh | grep open`
$ b=`nmap downhost -PN -p ssh | grep open`

$ echo $a
22/tcp open ssh
$ echo $b
(empty string)

ولكن سيكون لديك على البقرى الرسالة (NMAP لا يستخدم القيمة عودة لإظهار إذا كان تصفيتها ميناء، مغلقة أو مفتوحة).

وEDIT2:

إذا كنت مهتما في الحالة الفعلية للسه الميناء، يمكنك استبدال grep open مع egrep 'open|closed|filtered':

$ nmap host -PN -p ssh | egrep 'open|closed|filtered'

ولمجرد أن تكون كاملة.

نصائح أخرى

ssh -q -o "BatchMode=yes" -i /home/sicmapp/.ssh/id_rsa <ID>@<Servername>.<domain> "echo 2>&1" && echo $host SSH_OK || echo $host SSH_NOK

ويمكنك استخدام شيء من هذا القبيل

$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)

وهذا سوف يظهر "موافق" إذا كان الاتصال سه على ما يرام

واستكمالا للاستجابة @Adrià Cidre يمكنك القيام به:

status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)

if [[ $status == ok ]] ; then
  echo auth ok, do something
elif [[ $status == "Permission denied"* ]] ; then
  echo no_auth
else
  echo other_error
fi

وجرب:

echo quit | telnet IP 22 2>/dev/null | grep Connected

وفقط في حالة شخص يرغب فقط للتحقق ما إذا كان المنفذ 22 مفتوح على جهاز بعيد، هذا الأمر أداة netcat بسيط هو مفيد. اعتدت عليه بسبب NMAP وتلنت لم تكن متاحة بالنسبة لي. وعلاوة على ذلك، يستخدم التكوين سه بلدي لوحة المفاتيح كلمة المرور المصادقة.

ووهو البديل من الحل الذي تقترحه GUESSWHOz.

nc -q 0 -w 1 "${remote_ip}" 22 < /dev/null &> /dev/null && echo "Port is reachable" || echo "Port is unreachable"

إذا كنت ترغب في التحقق من وجود مجلد عن بعد، أو أي ملف اختبار حقا:

if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then
    # exists
else
    # doesn't exist
fi

لا تنس أن يستشهد في "$(ssh ...)".

لربط إلى ملقم مع واجهات متعددة

ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.61;[ $? = 1 ] || ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.51

وعلى سبيل المثال عن طريق BASH 4+ النصي:

# -- ip/host and res which is result of nmap (note must have nmap installed)
ip="192.168.0.1"
res=$(nmap ${ip} -PN -p ssh | grep open)

# -- if result contains open, we can reach ssh else assume failure) --
if [[ "${res}" =~ "open" ]] ;then
    echo "It's Open! Let's SSH to it.."
else
    echo "The host ${ip} is not accessible!"
fi

وأشعر كما لو كنت تحاول حل المشكلة خاطئة هنا. لا ينبغي أن يكون محاولة لجعل الشياطين سه أكثر استقرارا؟ حاول تشغيل شيء من هذا القبيل MONIT ، والتي سوف تحقق لمعرفة ما إذا كان يتم تشغيل البرنامج الخفي وإعادة تشغيله إذا كان يسن ' ر (مما يتيح لك الوقت للعثور على جذور المشكلة وراء سشد اغلاق عليك). أو هو خدمة شبكة مزعجة؟ حاول تبحث في man ifup. لا شيء لعنة كامل تماما مثل لاغلاق عليك؟ حسنا، وهذا هو المشكلة الأكبر ... حاول البحث في السجلات الخاصة بك (بداية مع سجل النظام) للعثور على فشل الأجهزة أو الخدمات التي يتم اغلاق boxen الخاص بك إلى أسفل (ربما بدرجة حرارة مراقبة؟).

وجعل البرامج النصية التسامح عظيم، لكنك قد ترغب أيضا في جعل خطأ boxen بك تسامحا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top