SSH dapat mentransfer data melalui teknologi enkripsi paket online; menggunakan SSH, semua data yang dikirimkan dapat dienkripsi bahkan jika seseorang menyadap data tersebut, tidak ada informasi berguna yang dapat diperoleh. Pada saat yang sama, data dikompresi, yang sangat mempercepat kecepatan transmisi. Singkatnya, melalui penggunaan SSH, transmisi data dapat dipastikan relatif aman dan efisien.
Namun, tidak semua orang tahu bahwa PHP dapat terhubung ke SSH dan menjalankan perintah jarak jauh, namun ini sangat berguna. Karena kita dapat memanfaatkan PHP dengan berbagai cara, PHP memiliki banyak opsi pengaturan untuk mengontrol perilakunya. Sejumlah besar parameter opsional memungkinkan Anda menggunakan PHP untuk berbagai tujuan berbeda, namun ini juga berarti bahwa kombinasi parameter ini dan konfigurasi sisi server dapat menimbulkan beberapa masalah keamanan. Penulis telah menggunakan SSH pada aplikasi PHP CLI, saya menggunakannya dari cronjobs, namun pada awalnya tidak terlalu sederhana, bisa dikatakan cukup sulit. Panduan tentang penggunaan fungsi Shell2 yang aman tidak terlalu praktis. Penulis melakukan banyak eksperimen sebelum membuat artikel kecil hari ini. Saya berharap setelah membacanya, dapat menghemat waktu Anda dalam mengkonfigurasi PHP.
Pada artikel ini, saya berasumsi bahwa
sistem operasi yang Anda jalankan adalah Debian/Ubuntu. Jika Anda tidak menjalankan Debian/Ubuntu, Anda mungkin perlu mengganti konten terkait artikel ini dengan manajer paket yang disediakan oleh distribusi Linux Anda.
Anda menjalankan PHP5. Jika Anda tidak menjalankan PHP5, Anda dapat menggunakan PHP4.
Anda memiliki pemahaman dasar tentang PHP dan administrasi server.
Anda sudah menginstal PHP.
Prasyarat
Paket Instalasi
Pertama, mari kita instal paket berikut:
sudo aptitude update
sudo aptitude install php5-dev php5-cli php-pear buid-essential
openssl-dev zlib1g-dev
Instalasi selesai dan lanjutkan ke langkah berikutnya.
Kompilasi libssh2
Setelah mendownload Libssh2 dari website sourceforge, kita perlu mengkompilasinya, tapi jangan khawatir, Anda hanya perlu melakukan hal berikut:
cd /usr/src
wget
// login di server1.example.com pada port 22
jika ( !($con = ssh2_connect("server1.example.com", 22))){
echo "fail: tidak dapat membuat koneksin";
else {
// coba autentikasi dengan nama pengguna root, kata sandi kata sandi rahasia
if(! ssh2_auth_password ($con, "root", "secretpassword")) {
echo "gagal: tidak dapat mengautentikasin";
} else {
// baiklah, kita sudah masuk!
echo "oke: masuk...n" ;
// jalankan perintah
if(!($stream=
ssh2_exec($con
, "ls -al" )) ){
echo "fail: tidak dapat menjalankan perintahn"
;
( $aliran, benar );
$data = "";
while( $buf=
ketakutan($
aliran,4096) ){
$data .= $buf;
}
fclose($aliran);
Metode kedua: Shell
Dengan cara yang sama, Anda juga dapat menulis fungsi atau kelas untuk kode berikut. Namun, artikel ini hanya memberikan konsep dasar:
if (!function_exists("ssh2_connect")) die("function ssh2_connect tidak ada")
// login di server1.example.com pada port 22
if(!($con = ssh2_connect ("server1.example.com", 22))){
echo "fail: tidak dapat membuat koneksin";
} else {
// coba autentikasi dengan nama pengguna root, kata sandi secretpassword
if(!ssh2_auth_password($con, "root ", "password rahasia")) {
echo "gagal: tidak dapat mengautentikasin";
} else {
// baiklah, kita sudah masuk!
echo "oke: login...n"
; shell
if (!($shell = ssh2_shell($con, 'vt102', null, 80, 40, SSH2_TERM_UNIT_CHARS))){
echo "gagal: tidak dapat membuat shelln";
} else{
stream_set_blocking( $shell, true ) ;
// kirim perintah
fwrite($shell,"ls -aln")
;
// & kumpulkan data yang dikembalikan
$
data = "";
)
{
$data
.=
$buf;
}
fclose(
$shell)
;
sebuah perintah (bahkan jika perintah tersebut tidak selesai! ) untuk mengumpulkan data. Anda dapat melakukan hal berikut untuk ini:
ssh2_exec($con, 'ls -al; echo "__COMMAND_FINISHED__"' );
Sekarang, di loop Anda yang terus-menerus memeriksa buffer, lihat saja COMMAND_FINISHED. Karena dengan begitu Anda tahu bahwa Anda memiliki semua datanya. Untuk menghindari loop tak terbatas (infinite loop), Anda dapat menggunakan batas waktu habis 10 detik:
$time_start = time();
$data = "";
while( true ){
$data .= fread($stream, 4096) ;
if( strpos($data,"__COMMAND_FINISHED__") !== false){
echo "oke: perintah selesain
}
if( (time()-$time_start) > 10 ){
echo "gagal: batas
waktu
10 detik telah tercapain";
break;
}
}
Pada contoh di atas, Anda sebaiknya menyetel stream_set_blocking ke false.
Kirim file melalui SSH
ssh2_scp_send($con, "/tmp/source.dat", "/tmp/dest.dat", 0644);
Jika tidak berfungsi dengan baik,
harap periksa aspek berikut:
Ikuti artikel ini untuk memeriksa setiap langkah operasi Anda
Di sisi server, "Otentikasi Kata Sandi ya" harus diaktifkan di sshd_config. Nilai default pada sebagian besar server adalah ya, namun dalam beberapa kasus Anda mungkin perlu menambahkan baris berikut ke file untuk mengaktifkan fitur ini pada diri Anda sendiri:
/etc/ssh/sshd_config:
# Ubah ke yes untuk mengaktifkan kata sandi teks terowongan yang jelas
Otentikasi Kata Sandi ya
Jika Anda melakukan perubahan, Anda perlu me-restart SSH:
/etc/init.d/ssh restart