سؤال

أحاول تشغيل برنامج نصي في العديد من الآلات التي أمتلكها في العمل ، لجمع بعض المعلومات عنها ، مثل نظام التشغيل الذي يقومون بتشغيله ، وما هي الخدمات التي يتم تشغيلها عليها ، وبعض التكوينات ، وما إلى ذلك. لدي جهاز أسجل عليه قبل SSH-ing إلى أي من الآلات الأخرى ، بسبب إعداد المفتاح العام الذي لديها. من هناك ، يمكنني SSH في جميع الآلات الأخرى دون أن أطلب من كلمة المرور الخاصة بي.

ما أريد القيام به هو أتمتة تسجيل الدخول إلى كل هذه الآلات من تلك الآلات ، ولكن البرنامج النصي يعمل على جهاز محلي. لذلك تعلمت للتو عن Ruby-Ssh-Gateway وأحاول ذلك ، لكن لا يبدو لي أن أحصل على مصادقة PubKey في العمل.

أفعل شيئًا كهذا:

gateway = Net::SSH::Gateway.new('gatewaymachine', 'username', :password => 'password')
all_machines.each do |machine|
  gateway.ssh(machine, 'username') do |ssh|
    uname = ssh.exec!('uname -a')
    puts "machine: #{machine}; OS: #{uname}"
  end
end

لكني أحصل على ملف Net::SSH::AuthenticationFailed استثناء.

إذا ، بدلاً من ذلك ، أقوم بتقديم كلمة المرور ، مثل ذلك:

gateway.ssh(machine, 'username', :password => 'password')

إنه يعمل ، لكن هذا ليس قابلاً للتطبيق ، لأن كلمات المرور ليست هي نفسها عبر الآلات.

هل يعرف أحد كيف يمكنني عمل هذا العمل؟

شكرًا.

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

المحلول

هل الآلات التي تتحدث إليها خلف جدار حماية NAT؟ إذا لم يكن الأمر كذلك ، فأنت لا تحتاج إلى روبي-سش غيتواي.

هل قمت بإنشاء مفتاح عام على مربع الأصل ، للمستخدم الذي يدير البرنامج ، وإعطاء هذا المفتاح للمستخدم المستهدف في كل مربع هدف؟

$ ssh-keygen -t dsa    # Only do this once
$ ssh-copy-id -i ~/.ssh/id_dsa.pub user@machine
(enter the password)

والتأكد من أن المفتاح يعمل:

$ ssh user@machine      # should not ask for a password

بمجرد الانتهاء من ذلك ، يكون الأمر بسيطًا مثل استخدام النظام أو backtick للتخلص من SSH:

system('ssh machine "ls -l"')
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top