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

السابق)

echo password | ssh [email protected]

هذا لا يعمل.

أتذكر أنني فعلت هذا ببعض الحيل التي أرشدني بها شخص ما ، لكن لا يمكنني تذكر الحيلة التي استخدمتها الآن ...

answer

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

إذا كان لديك بالفعل مفتاح SSH ، فيمكنك تخطي هذه الخطوة ... فقط اضغط Enterعلى المفتاح وعبارات المرور:

$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.

انسخ مفاتيحك إلى الخادم الهدف:

$ ssh-copy-id [email protected]
[email protected]'s password:

حاول الآن تسجيل الدخول إلى الجهاز باستخدام ssh '[email protected]'وتسجيل الوصول:

.ssh/authorized_keys

Note: If you don't have .ssh dir and authorized_keys file, you need to create it first

للتأكد من أننا لم نضف مفاتيح إضافية لم تكن تتوقعها.

أخيرًا ، تحقق من تسجيل الدخول ...

$ ssh [email protected]

[email protected]:~$

قد ترغب أيضًا في النظر في استخدام ssh-agentإذا كنت ترغب في محاولة الحفاظ على مفاتيحك محمية بعبارة مرور.

$ sudo apt-get install sshpass
$ sshpass -p your_password ssh [email protected]

بينما الإجابة الصحيحة عن سؤالك هي sshpass ( انظر الإجابة الأخرى للحصول على التفاصيل ) ، هناك طريقة أكثر أمانًا - مفاتيح SSH. أنت على بعد ثلاث خطوات سهلة من الحل:

يتم تشغيل جميع الأوامر التالية من جانب العميل ، أي جهازك

أدخل الأمر التالي لبدء إنشاء زوج مفاتيح rsa :

# ssh-keygen

عندما تظهر الرسالة "أدخل الملف الذي تريد حفظ المفتاح فيه" ، فقط اترك اسم الملف فارغًا بالضغط على Enter.

عندما تطلب منك المحطة إدخال عبارة مرور ، اتركها فارغة أيضًا واضغط على Enter.

ثم انسخ زوج المفاتيح إلى الخادم بأمر واحد بسيط :

# ssh-copy-id [email protected]

يمكنك الآن تسجيل الدخول بدون كلمة مرور :

# ssh [email protected]

توقع الاستخدام:

#!/usr/bin/expect -f
#  ./ssh.exp password 192.168.1.11 id
set pass [lrange $argv 0 0]
set server [lrange $argv 1 1]
set name [lrange $argv 2 2]

spawn ssh [email protected]$server
match_max 100000
expect "*?assword:*"
send -- "$pass\r"
send -- "\r"
interact

مثال:

# ./1.ex password localhost ooshro
spawn ssh [email protected]
[email protected]'s password: 
Linux ubuntu-1010-server-01 2.6.35-25-generic-pae #44-Ubuntu SMP Fri Jan 21 19:01:46 UTC 2011 i686 GNU/Linux
Ubuntu 10.10

Welcome to Ubuntu!
 * Documentation:  https://help.ubuntu.com/
Last login: Tue Mar  1 12:41:12 2011 from localhost

يتم تحقيق الدخول الأحادي عبر SSH عادةً من خلال مصادقة المفتاح العام ووكيل المصادقة. يمكنك بسهولة إضافة مفتاح VM التجريبي إلى وكيل مصادقة موجود (انظر المثال أدناه). توجد طرق أخرى مثل gssapi / kerberos ولكنها أكثر تعقيدًا.

sshpass

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

أنبوب مجهول (موصى به بواسطة sshpass)

# Create a pipe
PIPE=$(mktemp -u)
mkfifo -m 600 $PIPE
# Attach it to file descriptior 3
exec 3<>$PIPE
# Delete the directory entry
rm $PIPE
# Write your password in the pipe
 echo 'my_secret_password' >&3
# Connect with sshpass -d
sshpass -d3 ssh [email protected]

# Close the pipe when done
exec 3>&-

إنه مرهق للغاية في bash ، ويمكن القول إنه أسهل مع لغات البرمجة. يمكن إرفاق عملية أخرى بالأنبوب / fd قبل كتابة كلمة المرور. إن نافذة الفرصة قصيرة جدًا ومحدودة لعملياتك أو جذرك.

متغيرات البيئة

# Set your password in an environment variable
 export SSHPASS='my_secret_password'
# Connect with sshpass -e
sshpass -e ssh [email protected]

يمكنك أنت والجذر قراءة متغيرات بيئة العملية (مثل كلمة المرور الخاصة بك) أثناء تشغيل sshpass ( cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=). إن نافذة الفرصة أطول بكثير ولكنها لا تزال مقتصرة على عملياتك الخاصة أو الجذر ، وليس المستخدمين الآخرين.

وسيطة سطر الأوامر (الأقل أمانًا)

 sshpass -p my_secret_password ssh [email protected]

هذا مناسب ولكنه أقل أمانًا كما هو موضح في صفحة الدليل. تكون وسيطات سطر الأوامر مرئية لجميع المستخدمين (على سبيل المثال ps -ef | grep sshpass). يحاول sshpass إخفاء الوسيطة ، ولكن لا تزال هناك نافذة يمكن خلالها لجميع المستخدمين رؤية كلمة المرور الخاصة بك التي تم تمريرها بواسطة الوسيطة.

ملاحظة جانبية

اضبط متغير bash HISTCONTROL على ignorespaceأو ابدأ بأوامركignoreboth الحساسة بمسافة. لن يتم حفظهم في التاريخ.


مصادقة المفتاح العام SSH

# Generate a key pair
# Do NOT leave the passphrase empty
ssh-keygen
# Copy it to the remote host (added to .ssh/authorized_keys)
ssh-copy-id [email protected]

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

قم بإعداد وكيل مصادقة SSH

# Start the agent
eval `ssh-agent`
# Add the identity (private key) to the agent
ssh-add /path/to/private-key
# Enter key passphrase (one time only, while the agent is running)

قم بالاتصال كالمعتاد

ssh [email protected]

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

أنا مندهش من عدم ذكر أحد plinkمن putty-toolsالحزمة في Ubuntu:

plink [email protected] -pw mypass  [cmd]

وهي متاحة أيضًا على نظام التشغيل Windows وتكون البنية متوافقة في الغالب مع عميل openssh.

قد لا يكون هذا مفيدًا لك ، ولكن يمكنك فعل ذلك باستخدام Perl:

\#!/usr/bin/perl  
use warnings;  
use strict;  

use Net::SSH::Perl;  
my $host = 'remote.serv.er';  
my $user = 'root';  
my $pass = 'hunter2';  
my $ssh = Net::SSH::Perl->new('$host');  
$ssh->login('$user', '$pass') or die "Oh noes! $!";

هل أنت متأكد أنك لا تريد استخدام مفاتيح SSH بدلاً من كلمات المرور؟ بهذه الطريقة يكون آمنًا وتلقائيًا.

أنا أفضل passh https://github.com/clarkwang/passh

sshpass مكسور حسب التصميم.

عندما لا يتم إضافة خادم ssh بالفعل في بلدي known_hosts، sshpassلن تظهر لي الرسالة لإضافة الخادم إلى مضيفي المعروفين ، passhليس لديك هذه المشكلة.

تسجيل الدخول إلى خادم بعيد:

$ passh -p password ssh [email protected]

اعتمادًا على احتياجات الأتمتة الخاصة بك ، ربما يكون Ansible مناسبًا لك. يمكنه إدارة أشياء بشكل جيد مثل المطالبة بكلمة المرور ، والمطالبة بكلمة مرور sudo ، وطرق مختلفة لتغيير الاستخدام ، واستخدام الأسرار المشفرة (الخزنة) بأمان.

إذا لم يكن ذلك مناسبًا ، فإنني أقترح توقع ، كما هو مقترح في إجابة أخرى.