كيفية تشغيل الأمر sftp بكلمة مرور من برنامج Bash النصي؟

سئل على ٢٢ مارس ٢٠١١  ·  تمت مشاهدة 681.1k مرة  ·  مصدر

anubhava picture
في ٢٢ مارس ٢٠١١

أحتاج إلى نقل ملف سجل إلى مضيف بعيد باستخدام sftp من مضيف Linux. لقد تلقيت أوراق اعتماد لنفسها من مجموعة العمليات الخاصة بي. ومع ذلك ، نظرًا لأنني لا أتحكم في مضيف آخر ، لا يمكنني إنشاء مفاتيح RSA ومشاركتها مع المضيف الآخر.

فهل هناك طريقة لتشغيل الأمر sftp (مع توفير اسم المستخدم / كلمة المرور) من داخل نص Bash عبر مهمة cron ؟

لقد وجدت سؤالًا مشابهًا لـ Stack Overflow ، حدد كلمة المرور لـ sftp في نص Bash النصي ، لكن لم تكن هناك إجابة مرضية لمشكلتي.

الإجابات

anubhava picture
في ٢٢ مارس ٢٠١١
184

لديك بعض الخيارات بخلاف استخدام مصادقة المفتاح العام:

  1. استخدم سلسلة المفاتيح
  2. استخدم sshpass (أقل أمانًا ولكن من المحتمل أن يلبي متطلباتك)
  3. استخدم توقع (الأقل أمانًا والأكثر ترميزًا مطلوبًا)

إذا قررت منح sshpass فرصة ، فإليك مقتطف نصي يعمل للقيام بذلك:

export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - [email protected] << !
   cd incoming
   put your-log-file.log
   bye
!
Karassik picture
في ٢٤ يوليو ٢٠١٣
102

هناك طريقة أخرى لاستخدام lftp:

lftp sftp://user:[email protected]  -e "put local-file.name; bye"

عيب هذه الطريقة هو أن المستخدمين الآخرين على الكمبيوتر يمكنهم قراءة كلمة المرور من أدوات مثل ps وأن كلمة المرور يمكن أن تصبح جزءًا من سجل shell الخاص بك.

هناك بديل أكثر أمانًا متاحًا منذ LFTP 4.5.0 وهو تعيين متغير البيئة LFTP_PASSWORD وتنفيذ lftp بـ --env-password . هذا مثال كامل:

LFTP_PASSWORD="just_an_example"
lftp --env-password sftp://[email protected]  -e "put local-file.name; bye"

يتضمن LFTP أيضًا ميزة النسخ المتطابق الرائعة (يمكن أن تشمل الحذف بعد النقل المؤكد --Remove-source-files ):

lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com
rezizter picture
في ٢٨ مارس ٢٠١٣
56

EXPECT برنامج رائع للاستخدام.

على Ubuntu ، قم بتثبيته باستخدام:

sudo apt-get install expect

على جهاز CentOS ، قم بتثبيته باستخدام:

yum install expect

لنفترض أنك تريد إجراء اتصال بخادم sftp ثم تحميل ملف محلي من جهازك المحلي إلى خادم sftp البعيد

#!/usr/bin/expect

spawn sftp [email protected]
expect "password:"
send "yourpasswordhere\n"
expect "sftp>"
send "cd logdirectory\n"
expect "sftp>"
send "put /var/log/file.log\n"
expect "sftp>"
send "exit\n"
interact

هذا يفتح اتصال sftp بكلمة المرور الخاصة بك إلى الخادم.

ثم ينتقل إلى الدليل حيث تريد تحميل ملفك ، في هذه الحالة "logdirectory"

يؤدي هذا إلى تحميل ملف سجل من الدليل المحلي الموجود في / var / log / مع اسم الملف file.log إلى "logdirectory" على الخادم البعيد

Mike S. picture
في ٣٠ يوليو ٢٠١٣
26

يمكنك استخدام lftp بشكل تفاعلي في برنامج نصي shell بحيث لا يتم حفظ كلمة المرور في .bash_history أو ما شابه ذلك عن طريق القيام بما يلي:

vi test_script.sh

أضف ما يلي إلى ملفك:

#!/bin/sh
HOST=<yourhostname>
USER=<someusername>
PASSWD=<yourpasswd>

cd <base directory for your put file>

lftp<<END_SCRIPT
open sftp://$HOST
user $USER $PASSWD
put local-file.name
bye
END_SCRIPT

واكتب / قم بإنهاء محرر vi بعد تحرير المضيف والمستخدم والممر والدليل لملف الوضع بكتابة :wq ثم اجعل النص الخاص بك قابلاً للتنفيذ chmod +x test_script.sh وقم بتنفيذه ./test_script.sh .

Mahony picture
في ٥ أبريل ٢٠١٣
17

لقد طُلب مني مؤخرًا التبديل من بروتوكول نقل الملفات إلى بروتوكول نقل الملفات ، لتأمين نقل الملفات بين الخوادم. نحن نستخدم حزمة Tectia SSH ، التي لديها الخيار --password لتمرير كلمة المرور في سطر الأوامر.

مثال: sftp --password="password" "userid"@"servername"

مثال دفعة:

(
  echo "
  ascii
  cd pub
  lcd dir_name
  put filename
  close
  quit
    "
) | sftp --password="password" "userid"@"servername"

اعتقدت أنه يجب علي مشاركة هذه المعلومات ، نظرًا لأنني كنت أبحث في مواقع ويب مختلفة ، قبل تشغيل أمر المساعدة ( sftp -h ) ، وفوجئت برؤية خيار كلمة المرور.

SriniV picture
في ٢٠ فبراير ٢٠١٤
17

يمكنك تجاوز عن طريق تمكين المصادقة أقل كلمة المرور. ولكن يجب عليك تثبيت المفاتيح (pub ، priv) قبل القيام بذلك.

قم بتنفيذ الأوامر التالية على الخادم المحلي.

Local $> ssh-keygen -t rsa 

اضغط على ENTER لجميع الخيارات المطلوبة. لا توجد قيم تحتاج إلى كتابتها.

Local $> cd .ssh
Local $> scp .ssh/id_rsa.pub [email protected]:
Prompts for pwd$>  ENTERPASSWORD

اتصل بالخادم البعيد باستخدام الأمر التالي

Local $> ssh [email protected]
Prompts for pwd$> ENTERPASSWORD

نفذ الأوامر التالية على الخادم البعيد

Remote $> mkdir .ssh
Remote $> chmod 700 .ssh
Remote $> cat id_rsa.pub >> .ssh/authorized_keys
Remote $> chmod 600 .ssh/authorized_keys
Remote $> exit

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

$> ssh [email protected]
Rich Harding picture
في ١٢ ديسمبر ٢٠١١
7

قم بدمج sshpass مع ملف بيانات اعتماد مقفل ، ومن الناحية العملية ، فهو آمن مثل أي شيء آخر - إذا كان لديك جذر في المربع لقراءة ملف بيانات الاعتماد ، فإن جميع الرهانات متوقفة على أي حال.

Eric Leschinski picture
في ١١ نوفمبر ٢٠١٤
5

برنامج Bash لانتظار sftp ليطلب كلمة مرور ثم يرسلها:

#!/bin/bash
expect -c "
spawn sftp [email protected]_host
expect \"Password\"
send \"your_password_here\r\"
interact "

قد تحتاج إلى تثبيت توقع ، قم بتغيير صياغة كلمة المرور إلى الأحرف الصغيرة "p" لتتناسب مع ما تتلقاه موجهك. تكمن المشاكل هنا في أنها تكشف كلمة مرورك بنص عادي في الملف وكذلك في محفوظات الأوامر. وهو ما يكاد يقضي على الغرض من وجود كلمة مرور في المقام الأول.

ravi ranjan picture
في ١٢ يونيو ٢٠١٥
5

يمكنك استخدام sshpass لذلك. فيما يلي الخطوات

  1. قم بتثبيت sshpass لـ Ubuntu - sudo apt-get install sshpass
  2. أضف عنوان IP البعيد إلى ملف المضيف المعروف إذا كانت هذه هي المرة الأولى بالنسبة إلى Ubuntu -> ssh user @ IP -> أدخل "نعم"
  3. إعطاء أمر مشترك لـ scp و sshpass لذلك. يوجد أدناه نموذج لرمز للتعامل مع الحرب إلى القط البعيد sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #[email protected]#RemoteIP:/var/lib/tomcat7/webapps