Merhabalar arkadaşlar,
Hyper-V 'yi çoğunuz duymuşssunuzdur ve biliyorsunuzdur.
Size anlatacağım konu Hyper-V 'nin uzaktan SSH protokolü yardımıyla yönetilmesi.
Çok basit PHP kodları paylaşacağım ve temel komutları anlatacağım.Bunları geliştirerek bir kontrol paneli bile yapabilirsiniz.Eğer SSH protokolü aklınıza yatmadıysa başka bir alternatifi daha var.Ana sunucuya IIS kurup ASP.NET ile çalışan Powershell komutlarını işleyebilen çok basit bir uygulama yaptım.
Evet arkadaşlar SSH ile başlayalım.Sunucumuzu uzaktan komutlar yardımıyla yönetebilmemiz için PowerShell Server kurmamız gerekiyor.
Powershell serverı burdan indirebilirsiniz.
http://www.powershellserver.com/download/
İndirdikten sonra kurulumunu yapacağız kurulumu gayet basit.Kurulum tamamlandıktan sonra PowerShell Server otomatik olarak çalışacak ve aşağıdaki gibi bir ekran karşınıza çıkacak.
Resimde seçtiğim alanlar seçili değilse onları seçiyoruz ve Start'a basıyoruz.Artık sunucumuza SSH ile bağlanıp PowerShell komutlarıyla sunucumuzu yönetebiliriz.Tabi konumuz Hyper-V olduğu için Hyper-V ' yi nasıl yöneteceğimizden bahsedeceğim.
SSH'ın çalışıp çalışmadığını test etmek için Putty programıyla sunucunuza giriş yapabilirsiniz.Giriş yaptıktan sonra karşınıza aşağıdaki gibi bir ekran çıkacaktır.
Putty ile sunucunuza başarılı bir şekilde giriş yapabilmeniz kurulum işlemini sorunsuz bir şekilde tamamladığınız anlamına gelir.
Şimdi yapacağımız işlem SSH ' a PHP ile bağlanıp komutlar vererek makineleri start ve stop etmek.
*Sunucunuzda SSH2 kurulu olması gerekir.
Sunucunuzda SSH2 kurulu olduğunu varsayıyoruz ve diğer aşamalara geçiyoruz.Şimdi aşağıdaki kodları kendi bilgilerinize göre düzenleyip FTP üzerinden hosting sunucunuza atmalısınız.
Aşağıdaki PHP kodlarını başarılı bir şekilde hatasız çalıştırabilmeniz için PHPseclib indirmelisiniz http://sourceforge.net/projects/phpseclib/files/phpseclib0.3.9.zip/download
Ardından içindeki dosyaları aşağıdaki kodları attığınız klasörün içerisine atmalısınız.
Sanal Sunucuları Listeleme
<?php
error_reporting(0);
set_exception_handler('exception_handler') ;
if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist") ;
// DNS is also valid , instead of an IP
if(!($con = ssh2_connect("IP Adresiniz", 22))) {
throw new Exception("Error : Failed to establish a connection") ;
} else {
// Set username / password
if(!ssh2_auth_password($con , "Administrator", "Sifreniz")) {
throw new Exception("Error : unable to authenticate") ;
} else {
// Output message that we are logged in
echo "<b>Sanal Makineler</b><br \>" ;
// A simple Linux-command (do a listing of the remote directory)
if (!($stream = ssh2_exec($con , "get-vm" ))) {
throw new Exception("Error : unable to execute command ") ;
} else {
// collect returning data from command
stream_set_blocking($stream, true);
$data = "";
while ($buffer = fread($stream , 4096)) {
$data .= $buffer ;
}
fclose($stream) ;
}
}
echo "<pre>" ;
print_r($data) ;
echo "</pre>" ;
}
// A custom exception handler
function exception_handler($exception) {
echo "<b>Exception cached :</b> " , $exception->getMessage() , "";
}
?>Bu konu düzenleyip sunucunuza attığınız ve tarayıcı üzerinden giriş yaptığınız zaman karşınıza aşağıdaki gibi bir sonuç çıkacaktır.
Putty üzerinde get-vm komutunu çalıştırdığınızdada aynı sonuç çıkmaktadır.
Sunucuları Açma ve Kapatma
<?php
$hostname ="IP ADRESINIZ";
$username ="Administrator";
$password ="SIFRENIZ";
?>
<?php
include('Net/SSH2.php');
if(isset($_POST['operasyon'])) {
$operasyon = $_POST['operasyon'];
$makine = $_POST['makine'];
$ssh = new Net_SSH2($hostname);
if (!$ssh->login($username, $password)) {
exit('Login Failed');
}
print_r($ssh->exec("$operasyon-VM $makine"));
}
?>
<!DOCTYPE html>
<html>
<body>
<form action="" method="POST">
<fieldset>
<legend>Makine Operasyonları:</legend>
Sanal Makine İsmi:<br>
<input type="text" name="makine" value="ID">
<br>
Operasyon:<br>
<select name="operasyon" size="3">
<option value="Start">Start</option>
<option value="Stop">Stop</option>
<br><br>
<input type="submit" value="Gönder">
</fieldset>
</form>
</body>
</html>Bu konu düzenleyip sunucunuza attığınız ve tarayıcı üzerinden giriş yaptığınız zaman karşınıza aşağıdaki gibi bir sonuç çıkacaktır.
Sanal Makinenizin ismini gerekli yere yazıp ardından gerçekleştirmek istediğiniz operasyonu (start,stop) seçtiğiniz zaman komutlar sunucuya gönderilir ve işleminiz gerçekleştirilir.
Sizinle şöyle birşey paylaşmak istiyorum bu konu üzerinde uğraşıyorum bir kontrol paneli yapacağım gelişmiş kapsamlı.Sizde isterseniz bu kodları geliştirip kendinize uygun bir kontrol paneli yapabilirsiniz.Çünkü temel mantık bunun üzerinedir.
Aynı zamanda Hyper-V 'yi PowerShell üzerinden yönetmek için komutları aşağıdaki linkte bulabilirsiniz.
http://www.tomsitpro.com/articles/hyper-v-powershell-cmdlets,2-779.html
SSH için olan anlatımımızın sonuna geldik arkadaşlar.Şimdi SSH kullanmak istemeyenler için bir alternatif paylaşacağım.Oda .NET alternatifi.
Sunucunuza IIS kurduğunuzu veya Visual Studio kurduğunuzu varsayarak anlatımıma devam ediyorum.
Bu uygulama ASP.NET ile Powershell komutlarını çalıştırabilmemize yarayacak.
Çalışma mantığı ise şu şekilde ;
http://localhost/Default.aspx şeklinde bir dosyamız olsun.GET methoduyla bu dosya komut değerini gönderdiğimiz zaman istediğimiz Powershell komutunu çalıştırıp bize çıkan sonucu ekranda gösterecektir.
Örnek vermek gerekirse
http://localhost/Default.aspx?komut=get-vm
Sanal makineleri listeleyecektir.
Aşağıda Visual Studio üzerinden bir kare paylaştım.
Default.aspx
Default.aspx.cs - Temel Dosyamız
KomutGonder.aspx - HTML Form'un bulunduğu dosyamız
Kaynak kodlarını sizinle paylaşmadan önce uygulamanın resimlerini paylaşmak istiyorum.
default.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Management.Automation;
using System.Text;
namespace PowerShellExecution
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// Clean the Result TextBox
// Initialize PowerShell engine
var shell = PowerShell.Create();
// Add the script to the PowerShell object
shell.Commands.AddScript(Request.QueryString["komut"]);
// Execute the script
var results = shell.Invoke();
// display results, with BaseObject converted to string
// Note : use |out-string for console-like output
if (results.Count > 0)
{
// We use a string builder ton create our result text
var builder = new StringBuilder();
foreach (var psObject in results)
{
// Convert the Base Object to a string and append it to the string builder.
// Add \r\n for line breaks
builder.Append(psObject.BaseObject.ToString() + "\r\n");
}
// Encode the string in HTML (prevent security issue with 'dangerous' caracters like < >
ResultBox.Text = Server.HtmlEncode(builder.ToString());
}
}
}
}default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="PowerShellExecution.Default" %>
<form id="form1" runat="server">
****<div>
********<table>
************<tr><td> </td><td><h1 align="left">Komut Sonuclari</h1></td></tr>
************<tr><td> </td><td> </td></tr>
************<tr><td> </td><td>Sonuclar</td></tr>
****************<tr><td> </td><td><h3></h3></td></tr>
****************<tr><td>
******************** </td><td>
********************<asp:TextBox ID="ResultBox" TextMode="MultiLine" Width="700" Height="200" runat="server"></asp:TextBox>
****************</td></tr>
********</table>
****</div>
</form>
komutgonder.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="KomutGonder.aspx.cs" Inherits="WebApplication1.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form action="default.aspx" method="get" >
Komut : <input type="text" name="komut" /><br />
<input type="submit" value="Submit" />
</form>
</body>
</html>.NET versiyonunu pek geliştiremedim geliştirmeye devam ediyorum.Bu kodlar hep temel mantıkta olan kodlardır bunu geliştirerek üstüne birşeyler katıp güzel şeyler yapabileceğinizden eminim.
Teşekkürler,