mirror of
https://github.com/sshnet/SSH.NET.git
synced 2026-09-10 17:25:51 +00:00
3bc568471e
* Add SshCommand.ExecuteAsync After the previous change (#1423), this basically entails swapping out the IAsyncResult for a TaskCompletionSource and hooking up the cancellation/timeout logic. As with the prior Begin/End implementation, the initiation of the command (SendExecRequest) happens synchronously, so there's a bit of room for improvement there, but otherwise it is the Task-based async that we know and like. I chose to make it void (Task)- returning instead of string like in the existing overloads, so that OutputStream is not automatically consumed (and encoded as a string) when that may not be desired. As in #650, I was initially considering changing the other overloads to be void-returning as well, but decided that it was not worth the break since most people will probably want to change over to ExecuteAsync anyway. * Update examples --------- Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
3.4 KiB
3.4 KiB
Think this page is lacking? Help wanted! Click "Edit this page" at the bottom to begin contributing more examples.
Getting Started
Run a command
Establish an SSH connection and run a command:
using (var client = new SshClient("sftp.foo.com", "guest", new PrivateKeyFile("path/to/my/key")))
{
client.Connect();
using SshCommand cmd = client.RunCommand("echo 'Hello World!'");
Console.WriteLine(cmd.Result); // "Hello World!\n"
}
Upload and list files
SFTP Connection / Exchange
using (var client = new SftpClient("sftp.foo.com", "guest", "pwd"))
{
client.Connect();
using (FileStream fs = File.OpenRead(@"C:\tmp\test-file.txt"))
{
client.UploadFile(fs, "/home/guest/test-file.txt");
}
foreach (ISftpFile file in client.ListDirectory("/home/guest/"))
{
Console.WriteLine($"{file.FullName} {file.LastWriteTime}");
}
}
Multi-factor authentication
Establish an SFTP connection using both password and public-key authentication:
var connectionInfo = new ConnectionInfo("sftp.foo.com",
"guest",
new PasswordAuthenticationMethod("guest", "pwd"),
new PrivateKeyAuthenticationMethod("path/to/my/key"));
using (var client = new SftpClient(connectionInfo))
{
client.Connect();
}
Verify host identify
Establish an SSH connection using user name and password, and reject the connection if the fingerprint of the server does not match the expected fingerprint:
string expectedFingerPrint = "LKOy5LvmtEe17S4lyxVXqvs7uPMy+yF79MQpHeCs/Qo";
using (var client = new SshClient("sftp.foo.com", "guest", "pwd"))
{
client.HostKeyReceived += (sender, e) =>
{
e.CanTrust = expectedFingerPrint.Equals(e.FingerPrintSHA256);
};
client.Connect();
}
Open a Shell
using (var client = new SshClient("sftp.foo.com", "user", "password"))
{
client.Connect();
using ShellStream shellStream = client.CreateShellStream("ShellName", 80, 24, 800, 600, 1024);
client.Disconnect();
}
Switch to root with "su - root"
using (var client = new SshClient("sftp.foo.com", "user", "password"))
{
client.Connect();
using ShellStream shellStream = client.CreateShellStream("ShellName", 80, 24, 800, 600, 1024);
// Get logged in and get user prompt
string prompt = shellStream.Expect(new Regex(@"[$>]"));
// Send command and expect password or user prompt
shellStream.WriteLine("su - root");
prompt = shellStream.Expect(new Regex(@"([$#>:])"));
// Check to send password
if (prompt.Contains(":"))
{
// Send password
shellStream.WriteLine("password");
prompt = shellStream.Expect(new Regex(@"[$#>]"));
}
client.Disconnect();
}
Stream data to a command
using (var client = new SshClient("sftp.foo.com", "guest", "pwd"))
{
client.Connect();
// Make the server echo back the input file with "cat"
using (SshCommand command = client.CreateCommand("cat"))
{
Task executeTask = command.ExecuteAsync(CancellationToken.None);
using (Stream inputStream = command.CreateInputStream())
{
inputStream.Write("Hello World!"u8);
}
await executeTask;
Console.WriteLine(command.ExitStatus); // 0
Console.WriteLine(command.Result); // "Hello World!"
}
}