كيفية إنشاء برنامج نصي باش للتحقق من اتصال SSH؟
-
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 بك تسامحا.