PHP SSH üzerinden bir MySQL sunucusuna bağlanmak

6 Cevap php

Benim mysql sunucuya ssh üzerinden bir ssh tüneli kurmak istiyorum.

Ben doğrudan bağlantı oldu gibi İdeal bir mysqli db işaretçi dönecekti.

Ben SSH2 kütüphaneleri yok ama ben onları PECL'de kullanarak yerel olarak yüklü almak mümkün olabilir paylaşılan bir bilgisayar üzerinde değilim.

Harika olurdu yerli komutlarını kullanan bir yolu varsa.

Ben böyle bir şey düşünüyordum, fakat bu kütüphaneler olmadan bu iş olmaz.

$connection = ssh2_connect('SERVER IP', 22); 

ssh2_auth_password($connection, 'username', 'password');

$tunnel = ssh2_tunnel($connection, 'DESTINATION IP', 3307);

$db = new mysqli_connect('127.0.0.1', 'DB_USERNAME', 'DB_PASSWORD', 
                         'dbname', 3307, $tunnel)
    or die ('Fail: '.mysql_error());

Herkes herhangi bir fikir var mı? Ben LiquidWeb paylaşılan bir CentOS linux ana koşuyorum.

Tünel kalıcı hale Herhangi bir düşünce? Başka bir komut dosyası ile kurmak ve sadece PHP yararlanmak mümkün mü?

Teşekkürler.

6 Cevap

Eric

Ben bu bir şans olduğunu düşünüyorum. Ya senin PHP kodu ssh uzantısını kullanmak veya sunucusuna erişiminiz varsa, komut satırında ssh tünel oluşturmak için deneyebilirsiniz.

Muhtemelen olsa, bunu yapmak için özel izin gerekiyor. Bu hosting hesabınıza ssh erişimi yok gibi de görünüyor.

- Joao

Ben MySQL veritabanı için kalıcı bir ssh tünel oluşturmak için autossh aracı kullanmak istiyorsunuz. Sonra PHP kodu yapmak zorunda tüm Localhost'a işaret olduğunu.

Sen yaparak (otomatik yeniden başlatma olmadan) bu test edebilirsiniz:

ssh -L 3306:localhost:3306 user@domain.com

Kur, bir ssh anahtarı şifreleri kullanmak gerekir, ve sadece port yönlendirme için kullanılacak izin mysql sistemde .ssh / authorized_keys dosyası çimdik yok ki.

Ssh hileler hakkında daha fazla bilgi için SSH ve port yönlendirme Brian Hatch's mükemmel serisi bakın.

Ben kök kimlik ve ve kamu-özel anahtar çifti ile SSH yaparak denedim. Bana komut satırı ile değil PHP kodu ile conect sağlar.

Ben de (SSH2 işlevlerini kullanarak) bir tünel oluşturarak, ve (vb, system, exec) PHP kodu kabuk komutları çalıştırarak denedim; hiçbir şey çalıştı.

Sonunda kabuk komutu çalıştırmak için SSH2 fonksiyonu çalıştı ve sonunda çalıştı :)

Eğer size yardımcı olur İşte benim kod:

$connection = ssh2_connect($remotehost, '22');
if (ssh2_auth_password($connection, $user,$pass)) {
    echo "Authentication Successful!\n";
} else {
    die('Authentication Failed...');
}


$stream=ssh2_exec($connection,'echo "select * from zingaya.users where id=\"1606\";"  | mysql');
stream_set_blocking($stream, true);
while($line = fgets($stream)) {
    flush();
    echo $line."\n";
}

Özellikle PHP fonksiyonları kullanmak istiyorsanız, bu deneyin.

Bu is mümkün, ama neden? Bu olması gereken çok daha karmaşık ve hata eğilimli.

Yerel veritabanı çalıştırmak değil mi? Değilse, SQLite gibi bir şey, XML dosyaları veya ayrı bir sunucu cini gerektirmez başka bir şey kullanmak değil mi?

Sen really PHP içindeki tüneli başlatmak istemiyorum. SSH başlatılması (kolayca ikinci veya iki olabilir) uzun zaman alır, böylece veritabanına bağlanan her sayfa yükleme sırasında 2 saniye gecikme olacak anlamına gelecektir ..

Eğer have bu (ki ben şiddetle karşı tavsiye) yapmak için, en iyi yöntem, arka planda bağlantıyı sağlayan bir komut dosyası var olacaktır ..

Kur SSH keypair. Sonra kullanarak autossh, veya süreç ölene kadar bekleyin ve yeniden başlatın, gerekli SSH komutu çalıştırmak istiyorum basit bir script. Daha zeki olmak ve denemek ve bir komutu her 10-20 saniyede koşmak, başarısız eğer reconnecting olabilir.

SSH keypair kullanarak, komut uzak kullanıcıların şifreyi kodlamalısınız olmazdı. (Bakınız this soru, özel bir tünel kullanıcı kullanarak ve bunu bir kısıtlı kabuk vererek) uzak kullanıcı neler yapabileceğini sınırlama tavsiye ederim

Kısacası, ben kesinlikle ilk SQLite'ı denemenizi öneririz, daha sonra yerel bir MySQL sunucusu alma hakkında web-host adamcağız deneyin o zaman, XML dosyalarını kullanarak veri depolamak için nasıl mümkün görmek, then SSH tünel seçeneği içine bakmak .

Tünel açık tutmak gerekir, RJMetrics aşağıdaki örnek açıklıyor:

İşte güvenli bir PHP kod sadece 2 satır bir uzak veritabanı bağlantısı kurmak için:

shell_exec(“ssh -f -L 3307:127.0.0.1:3306 user@remote.rjmetrics.com sleep 60 >> logfile”);  
$db = mysqli_connect(’127.0.0.1′, ‘sqluser’, ‘sqlpassword’, ‘rjmadmin’, 3307);

Biz 60 saniyelik bir açılış penceresi ile tünel oluşturmak ve sonra iletilen bağlantı noktasını kullanarak bir veritabanı bağlantısı açmak için mysqli_connect işlevi kullanmak için shell_exec işlevini kullanın. Mysql_connect bize bir port belirtmek izin vermez, çünkü biz burada "mysqli" kitaplığı kullanmanız gerektiğini unutmayın.

60 uyku: bu tünel bağlantıları söz konusu olduğunda, biz temelde iki seçenek vardır: bağlantı her zaman açık veya açmak ve gerektiği gibi kapatın bırakın. Biz sonuncusunu tercih ve bir tünel kurarken gibi biz süreç el (otomasyonu için kötü) öldürdü kadar açık bırakın hangi, "-N" seçeneğini belirtin. "-N" belirtilmemiş olduğundan, bizim tünel kısa sürede kendi SSH oturumu şey için kullanılmamaktadır olarak kendini kapatacak. Bu, tünel oluşturmak zaman ve biz tünel yoluyla ve çalışan bir MySQL bağlantısı olsun zaman arasında birkaç saniye dışında, ideal bir davranıştır. Bu dönemde bize zaman satın almak için, temelde kendini kapatır önce tünelden geçiyor başka bir şey almak için bize 60 saniye satın tünel oluşturulur zararsız "uyku 60" komutu vermek. Sürece bir MySQL bağlantısı bu süre yılında kurulmuş gibi, biz tüm ayarlanır.

Ben senin en iyi bahis farklı bir hosting sağlayıcısı bulmak için olduğunu düşünüyorum; Ben size web barındırma üzerinde tam kontrol sağlayan bir VPS çözüm (Virtual Private Server) öneririz. Eğer varsayılan yapılandırmayı sevmiyorum bu şekilde, bunu kendiniz yükseltebilirsiniz.