一、阿里云ECS上部署Windows系统
1、在创建好的ECS实例中添加一个Windows操作系统的镜像,设置好用户名和密码以及公网IP,后续连接需要用到。
2、配置实例的安全组规则,添加ssh通讯的默认端口22
3、安装和启用 SSH 服务
Windows设置-应用-应用和功能-可选功能(查看是否有OpenSSH客户端、OpenSSH服务器)服务器端打开 Windows 服务管理器,在服务管理器中,滚动或使用搜索功能找到名为“OpenSSH SSH Server”或类似的服务条目,如果 SSH 服务未运行,则右键单击该服务,并选择“启动”以启动服务(因为Windows操作系统是默认关闭SSH服务的所以很多都是因为服务器端未启用SSH服务导致的无法连接)
4、检查目标计算机上的防火墙设置,并确保允许来自您的计算机的连接
二、代码实现
1、添加SSH.NET程序包,引用ssh通讯协议用来来操作SSH和SFTP连接。
using Renci.SshNet;
using Renci.SshNet.Sftp;
2、具体的实现代码
public partial class Form1 : Form
{
private SftpClient sftpClient;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// 初始化SFTP客户端
sftpClient = new SftpClient("公网IP", "用户名", "密码");
sftpClient.Connect();
RefreshTreeView();
}
private void RefreshTreeView()
{
treeView1.Nodes.Clear();
var files = sftpClient.ListDirectory("获取远程服务器的文件和目录列表");
foreach (var file in files)
{
var newNode = new TreeNode(file.Name);
newNode.Tag = file;
var fileAttributes = sftpClient.GetAttributes(file.FullName);
var fileSize = fileAttributes.Size;
newNode.Text += $" {fileSize} bytes";
var fileCreationTime = fileAttributes.LastWriteTime;
newNode.Text += $" {fileCreationTime}";
treeView1.Nodes.Add(newNode);
}
treeView1.NodeMouseClick += TreeView1_NodeMouseClick;
}
private void TreeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
var selectedNode = e.Node;
var selectedFile = (SftpFile)selectedNode.Tag;
// 检查选中的节点是否为目录
if (selectedFile.IsDirectory)
{
selectedNode.Nodes.Clear();
var subDirectories = sftpClient.ListDirectory(selectedFile.FullName);
foreach (var subDirectory in subDirectories)
{
var newNode = new TreeNode(subDirectory.Name);
newNode.Tag = subDirectory;
selectedNode.Nodes.Add(newNode);
}
}
else
{
// 在这里执行你想要的操作,比如下载文件等
}
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
}
private void btnUpload_Click(object sender, EventArgs e)
{
var selectedNode = treeView1.SelectedNode;
if (selectedNode == null || selectedNode.Tag == null)
{
MessageBox.Show("请选择一个目录进行上传。");
return;
}
var openFileDialog = new OpenFileDialog();
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
var localFilePath = openFileDialog.FileName;
var fileName = Path.GetFileName(localFilePath);
var remoteDirectory = "/Users/Administrator/Desktop";
// 上传文件至远程服务器
using (var fileStream = File.OpenRead(localFilePath))
{
string remoteFilePath = Path.Combine(remoteDirectory, fileName);
sftpClient.UploadFile(fileStream, remoteFilePath);
MessageBox.Show("上传成功!");
}
RefreshTreeView();
}
}
private void btnDownload_Click(object sender, EventArgs e)
{
var selectedNode = treeView1.SelectedNode;
if (selectedNode == null || selectedNode.Tag == null)
{
MessageBox.Show("请选择一个文件进行下载。");
return;
}
var selectedFile = (SftpFile)selectedNode.Tag;
var localDirectory = "下载到本地的目录";
var localFilePath = Path.Combine(localDirectory, selectedFile.Name); /
// 从远程服务器下载文件
using (var fileStream = File.Create(localFilePath))
{
sftpClient.DownloadFile(selectedFile.FullName, fileStream);
MessageBox.Show("下载成功!");
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// 关闭SFTP连接
sftpClient.Disconnect();
sftpClient.Dispose();
}
}
小结:本代码仅实现了远程连接服务器进行文件的上传下载操作,界面需要进一步优化。