سؤال

مشكلتي هي كما يلي:أنا أكتب نصًا غرضه تشغيل نصوص برمجية معينة على خوادم مختلفة بالتوازي.على سبيل المثال، أريد تسجيل الدخول إلى خادم بعيد، وإدخال كلمة المرور (هذا غير قابل للتفاوض لأن الرئيس)، وبدء البرنامج النصي، وإغلاق الاتصال بينما لا يزال البرنامج النصي قيد التشغيل، والاتصال بالخادم التالي والقيام بالرقصة بأكملها مرة أخرى.كيف فعلتها؟

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

المحلول

بافتراض أن bash هو الغلاف المستهدف على جميع الأجهزة البعيدة، يمكنك القيام بذلك لجهاز واحد:

ssh user@host /path/to/script '&>/dev/null' '</dev/null' '&' disown

بالنسبة لأجهزة متعددة، يمكنك بعد ذلك كتابة هذا النص كما يلي:

hosts='user1@host1 user2@host2'

for host in $hosts
do
  ssh $host /path/to/script '&>/dev/null' '</dev/null' '&' disown
done

هذا يجب أن يجعلك تكتب كلمات المرور فقط.

وبدلاً من ذلك، إذا كان بإمكانك استخدام نفس كلمة المرور لأجهزة متعددة، فإنني أوصي بالبحث عنها الكتلةSSH.باستخدام هذا، يمكنك تسجيل الدخول إلى أجهزة متعددة في وقت واحد وكتابة الأوامر ليتم إرسالها إليها جميعًا في نافذة واحدة أو بشكل فردي في كل نافذة xterm.وهذا من شأنه أن يوفر عليك كتابة نفس كلمة المرور بشكل متكرر.بمجرد تسجيل الدخول، يمكنك تشغيل الأمر على النحو الوارد أعلاه (بدون الملف ssh user@host جزء) والخروج.

تحديث

زوجان من الأفكار الإضافية هنا.أولاً، ربما لا تكون فكرة جيدة أن تتجاهل مخرجات البرنامج النصي تمامًا، لأنك لن تعرف أبدًا ما حدث إذا حدث خطأ ما.يمكنك فقط وضعه في ملف للنظر فيه لاحقًا عن طريق الاستبدال '&>/dev/null' مع '&>filename'.هناك طريقة أخرى تتمثل في إرسال الجهاز البعيد إليك عبر البريد الإلكتروني (شريطة أن يتم إعداده بشكل صحيح للقيام بذلك):

host=user@host
ssh $host \(/path/to/script '2>&1' \| mail -s "$host output" me@me.com\) \
  '&>/dev/null' '</dev/null' '&' disown

ثانيًا، إذا كان البرنامج النصي موجودًا على المضيف المحلي، فيمكنك نسخه وتنفيذه في أمر واحد.يفترض وجود برنامج نصي لشل، إن لم يكن استبداله فقط sh مع الترجمان الصحيح)

</path/to/script ssh user@host \
  cat \>script \; sh ./script '&>/dev/null' '</dev/null' '&' disown

نصائح أخرى

بعد تسجيل الدخول، يمكنك استخدام الأداة المساعدة للشاشة لبدء جلسة طرفية جديدة وفصلها لاحقًا، على سبيل المثال:

[user@local]$ ssh machine
[user@machine]$ screen -S my_session
# you are now switched to new terminal session named "my_session"
# now you can start long operation, that you want to keep in background
[user@machine]$ yes
# press "Ctrl-a d" to detach, you will go back to original session
[detached from 11271.my_session]
# now you can leave ssh (your session with "yes" running will be kept in background)
# to list existing screen sessions run:
[user@machine]$ screen -list
There is a screen on:
11271.my_session    (Detached)
1 Socket in /var/run/screen/S-user.
# to re-attach use -r
[user@machine]$ screen -r my_session
# you will be back to session with "yes" still running (press Ctrl-C to stop it)

بمجرد أن تفهم كيفية عمل الشاشة، يمكنك محاولة كتابتها؛هذه هي الطريقة التي تبدأ بها جلسة الشاشة في حالة منفصلة بتشغيل my_command:

$ screen -d -m my_command

expect يمكن أتمتة هذا بسهولة تامة:

#!/usr/bin/expect -f

set hosts {your list of hosts goes here ...}
foreach host $hosts {
    spawn ssh -t user@$host screen ./script.sh
    expect "assword:"
    send -- "secret\r"
    sleep 1
    send -- "d"
    expect eof
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top