يمكن لـ SSH نقل البيانات من خلال تقنية تشفير الحزم عبر الإنترنت باستخدام SSH، ويمكن تشفير جميع البيانات المرسلة، حتى إذا اعترض شخص ما البيانات، فلا يمكن الحصول على معلومات مفيدة. وفي الوقت نفسه، يتم ضغط البيانات، مما يؤدي إلى تسريع سرعة النقل بشكل كبير. باختصار، من خلال استخدام SSH، يمكن ضمان أن يكون نقل البيانات آمنًا وفعالًا نسبيًا.
ومع ذلك، لا يعلم الجميع أن PHP يمكنها الاتصال بـ SSH وتنفيذ الأوامر عن بعد، ولكنها مفيدة جدًا. نظرًا لأنه يمكننا الاستفادة من لغة PHP بعدة طرق مختلفة، فهي تحتوي على الكثير من خيارات الإعداد للتحكم في سلوكها. تتيح لك مجموعة كبيرة من المعلمات الاختيارية استخدام PHP للعديد من الأغراض المختلفة، ولكنها تعني أيضًا أن الجمع بين هذه المعلمات والتكوين من جانب الخادم يمكن أن يؤدي إلى بعض المشكلات الأمنية. كان المؤلف يستخدم SSH في تطبيق PHP CLI الذي استخدمته من cronjobs، لكنه لم يكن بسيطًا جدًا في البداية. إن دليل الاستخدام الآمن لوظائف Shell2 ليس عمليًا للغاية. أجرى المؤلف العديد من التجارب قبل أن يأتي بهذه المقالة الصغيرة اليوم، وآمل أنه بعد قراءتها، يمكن أن يوفر لك بعض الوقت في تكوين PHP.
في هذه المقالة، يجب أن أفترض أن
نظام التشغيل الذي تستخدمه هو Debian/Ubuntu. إذا لم تكن تستخدم Debian/Ubuntu، فقد تحتاج إلى استبدال المحتوى المقابل لهذه المقالة بمدير الحزم الذي توفره توزيعة Linux لديك.
أنت تقوم بتشغيل PHP5. إذا لم تكن تقوم بتشغيل PHP5، فيمكنك استخدام PHP4 بدلاً من ذلك.
لديك فهم أساسي لـ PHP وإدارة الخادم.
لقد قمت بالفعل بتثبيت PHP.
المتطلبات الأساسية
حزم التثبيت
أولاً، لنقم بتثبيت الحزم التالية:
sudo aptitude update
sudo aptitude install php5-dev php5-cli php-pear buid-essential
openssl-dev zlib1g-dev
اكتمل التثبيت وانتقل إلى الخطوة التالية.
ترجمة libssh2
بعد تنزيل Libssh2 من موقع sourceforge، نحتاج إلى تجميعه، لكن لا تقلق، ما عليك سوى القيام بما يلي:
cd /usr/src
wget
// قم بتسجيل الدخول على server1.example.com على المنفذ 22
إذا ( !($con = ssh2_connect("server1.example.com", 22))){
echo "fail: غير قادر على إنشاء اتصالn"
} else {
// حاول المصادقة باستخدام جذر اسم المستخدم وكلمة المرور السرية
if(! ssh2_auth_password ($con, "root", "secretpassword")) {
echo "fail: غير قادر على المصادقةn"
} else {
// حسنًا، لقد وصلنا!
echo "حسنًا: تم تسجيل الدخول...n" //
تنفيذ أمر
if(!($stream = ssh2_exec($con, "ls -al" )) ){
echo "fail: غير قادر على تنفيذ الأمرn"
} else{
// جمع البيانات المرتجعة من الأمر
stream_set_blocking ( $stream, true );
$data = "";
while( $buf=
fread($stream,4096) ){
$
data .= $buf
}
f Close($stream);
الطريقة الثانية: Shell
بنفس الطريقة، يمكنك أيضًا كتابة دالة أو فئة للتعليمات البرمجية التالية. ومع ذلك، توفر هذه المقالة المفاهيم الأساسية فقط:
if (!function_exists("ssh2_connect")) die("function ssh2_connect غير موجود")
// قم بتسجيل الدخول على server1.example.com على المنفذ 22
if(!($con = ssh2_connect ("server1.example.com"، 22))){
echo "fail: غير قادر على إنشاء اتصالn"
} else {
// حاول المصادقة باستخدام جذر اسم المستخدم وكلمة المرور السرية
if(!ssh2_auth_password($con, "root ", "secretpassword")) {
echo "fail: غير قادر على المصادقةn";
} else {
// حسنًا، نحن جاهزون!
echo "حسنًا: تم تسجيل الدخول...n"
; Shell
if (!($shell = ssh2_shell($con, 'vt102', null, 80, 40, SSH2_TERM_UNIT_CHARS))){
echo "fail: غير قادر على إنشاء shelln"
} else{
stream_set_blocking( $shell, true ) //
إرسال أمر
fwrite($shell,"ls -aln")
;
// وجمع البيانات المرتجعة
$
data = "";
){
$data .= $buf
}
f
Close
(
$
shell
);
أمر (حتى لو لم يكتمل الأمر!) لجمع البيانات. يمكنك القيام بما يلي لهذا:
ssh2_exec($con, 'ls -al; echo "__COMMAND_FINISHED__"' );
الآن، في حلقتك التي تقوم بفحص المخزن المؤقت باستمرار، ما عليك سوى إلقاء نظرة على COMMAND_FINISHED. لأنك تعلم أن لديك كل البيانات. لتجنب الحلقات اللانهائية (الحلقات اللانهائية)، يمكنك استخدام حد مهلة 10 ثوانٍ:
$time_start = time();
$data = "";
while( true ){
$data .= fread($stream, 4096) ;
if( strpos($data,"__COMMAND_FINISHED__") !== false){
echo
"
okay: commandنتهيn
"
;
تم الوصول إلى 10 ثوانٍn";
break;
}
}
في المثال أعلاه، من الأفضل أن تقوم بتعيينstream_set_blocking على false.
أرسل الملفات عبر SSH
ssh2_scp_send($con, "/tmp/source.dat", "/tmp/dest.dat", 0644);
إذا لم يعمل بشكل صحيح،
يرجى التحقق من الجوانب التالية:
اتبع هذه المقالة للتحقق من كل خطوة العملية الخاصة بك
على جانب الخادم، يجب تمكين "PasswordAuthentication Yes" في sshd_config. القيمة الافتراضية في معظم الخوادم هي نعم، ولكن في بعض الحالات قد تحتاج إلى إضافة السطر التالي إلى الملف لتشغيل هذه الميزة بنفسك:
/etc/ssh/sshd_config:
# قم بالتغيير إلى نعم لتمكين كلمات المرور النصية الواضحة النفقية
PasswordAuthentication Yes
إذا قمت بإجراء تغييرات، فستحتاج إلى إعادة تشغيل SSH:
/etc/init.d/ssh Restart