- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
[C#] Hướng dẫn viết ứng dụng check live SSH Server
Xin chào các bạn, bài viết hôm nay, mình sẽ hướng dẫn các bạn viết ứng dụng check live SSH Server (kiểm tra tình trạng con SSH còn sử dụng được hay không). Trong bài viết, mình sử dụng thư viện SSH.NET C#.
Vậy SSH là gì?
SSH hay còn được gọi là Secure Shell, là một giao thức điều khiển từ xa cho phép người dùng kiểm soát và chỉnh sửa server từ xa qua Internet. Dịch vụ được tạo ra nhằm thay thế cho trình Telnet vốn không có mã hóa và sử dụng kỹ thuật cryptographic để đảm bảo tất cả giao tiếp gửi tới và gửi từ server từ xa diễn ra trong tình trạng mã hóa. Nó cung cấp thuật toán để chứng thực người dùng từ xa, chuyển input từ client tới host, và relay kết quả trả về tới khách hàng.
Bạn nào thường chơi MMO (Make Money Online), thường thì hay sử dụng SSH để chạy kiếm traffic, hoặc FakeIP để kết nối server.
Ví dụ: Giờ mình muốn viết một ứng dụng lấy dữ liệu từ website, nhưng website này chặn IP đến từ Việt Nam, giờ mình làm sao để lấy được dữ liệu từ website đó.
Mình sẽ sử dụng một con server SSH để fake ip kết nối tới website đó.
Dưới đây là giao diện phần mềm kiểm tra SSH.
Trong bài viết này mình sử dụng thư viện SSH.NET C#, các bạn có thể download thư viện này về từ Nuget, hoặc có thể download source của mình bên dưới để tham khảo.
Dưới đây, là cấu trúc file text chứa thông tin SSH.
- Đầu tiên chúng ta cần tạo một class MySSH.cs với nội dung như sau:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Renci.SshNet;
using System.Net;
using System.IO;
namespace CheckLiveSSH
{
class MySSH
{
SshClient client;
ForwardedPortLocal fwPort;
public async Task checkSSH(string ip, string user, string pwd, string host, string timeout)
{
return await Task.Run(() =>
{
try
{
//uint port = (uint)new Random().Next(1080, 9999);
uint port = 1080;
ConnectionInfo ConnNfo = new ConnectionInfo(ip, 22, user, new AuthenticationMethod[]{
new PasswordAuthenticationMethod(user, pwd) });
fwPort = new ForwardedPortLocal("127.0.0.1", port, host, 80);
client = new SshClient(ConnNfo);
client.ConnectionInfo.Timeout = TimeSpan.FromSeconds(int.Parse(timeout));
client.Connect();
if (client.IsConnected)
{
client.AddForwardedPort(fwPort);
fwPort.Start();
if (fwPort.IsStarted)
{
closeAll();
return "live";
}
}
}
catch (Exception)
{
}
return "Die";
});
}
private void closeAll()
{
client.RemoveForwardedPort(fwPort);
fwPort.Dispose();
client.Disconnect();
client.Dispose();
}
}
}
- Tiếp theo, viết sự kiện cho winform import dữ liệu từ file text (*.txt) và kiểm tra dữ liệu từng con SSH
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CheckLiveSSH
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
DataTable table;
public DataTable Convert(string File, string TableName, string delimiter)
{
table = new DataTable();
table.Columns.Add("ipaddress", typeof(string));
table.Columns.Add("username", typeof(string));
table.Columns.Add("password", typeof(string));
table.Columns.Add("location", typeof(string));
table.Columns.Add("pos", typeof(string));
table.Columns.Add("city", typeof(string));
table.Columns.Add("status", typeof(string));
StreamReader s = new StreamReader(File);
string AllData = s.ReadToEnd();
string[] stringSeparators = new string[] { "
" };
string[] rows = AllData.Split(stringSeparators, StringSplitOptions.None);
foreach (string r in rows)
{
string[] items = r.Split(delimiter.ToCharArray());
table.Rows.Add(items);
}
return table;
}
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Text files (*.txt) | *.txt";
if (ofd.ShowDialog() == DialogResult.OK)
{
string url = ofd.FileName;
txt_url.Text = url;
DataTable dt = Convert(url, "test", "|");
gv_data.DataSource = dt;
}
}
int somay = 0;
private int _soMayChon;
private int _mayChamXong;
private int somayChamXong
{
set
{
lock (gv_data)
{
_mayChamXong = value;
if (_mayChamXong >= _soMayChon)
{
//progressBarControl1.BeginInvoke(new Action(() =>
//{
// Double percent = 100;
// progressBarControl1.EditValue = percent;
//}));
}
else
{
//progressBarControl1.BeginInvoke(new Action(() =>
//{
// Double percent = Convert.ToDouble(_mayChamXong) / Convert.ToDouble(_soMayChon) * 100.0;
// progressBarControl1.EditValue = percent;
// Load_DuLieu();
//}));
}
}
}
get
{
lock (gv_data)
{
return _mayChamXong;
}
}
}
private void TinhTrangKetNoi(int rowHandle, string msg)
{
gv_data.BeginInvoke((Action)(() =>
{
gv_data[6, rowHandle].Value = msg;
}));
}
private void btn_start_Click(object sender, EventArgs e)
{
_soMayChon = table.Rows.Count;
somayChamXong = 0;
//int i = 0;
var ipList = new List<KeyValuePair<int, string>>();
for (var r = 0; r <= table.Rows.Count - 1; r++)
{
somay++;
ipList.Add(new KeyValuePair<int, string>(r, table.Rows[r]["ipaddress"].ToString()));
}
if (somay > 0)
{
foreach(var ipInfo in ipList)
{
Task.Run(async () =>
{
TinhTrangKetNoi(ipInfo.Key,"Đang kiểm tra...");
MySSH ssh = new MySSH();
int r = ipInfo.Key;
string username = table.Rows[r]["username"].ToString();
string password = table.Rows[r]["password"].ToString();
string result = await ssh.checkSSH(ipInfo.Value, username, password, "google.com", "15");
TinhTrangKetNoi(ipInfo.Key, result);
});
};
}
}
}
}
Tools trên còn rất nhiều hạn chế, check live chậm như rùa bò... :), nếu bạn nào đã từng làm về ssh.net, có thể chạy Async các bạn có thể chia sẽ cho anh em để anh em tham khảo.
Bài viết tới, mình sẽ hướng dẫn các bạn sử dụng Http Request qua con SSH, mong các bạn đón đọc bài viết.
HAVE FUN :)