SSH 클라이언트
SSH (Secure Shell)
SSH는 다른 컴퓨터 혹은 라우터와 같은 네트워크 디바이스에 Secure한 방식으로 연결하여
명령을 수행할 수 있는 네트워트 기능으로 telnet을 대체하는 보다 안전한 방식의 터미널 기능이다.
Telnet의 모든 데이타는 Clear Text로 통신되는 반면, SSH의 데이타는 Public Key
Encryption을 사용하여 모두 암호화된다. SSH는 디폴트로 포트 22를 사용하고,
Telnet은 디폴트로 포트 23을 사용한다.
SSH.NET 설치
SSH는 클라이언트/서버 방식으로 통신하는데, SSH Client가 SSH Server에 연결하여
데이타를 주고 받는다. C# 에서 SSH를 사용하기 위해서는 SSH.NET 등과
같은 외부 패키지를 사용하는데, nuget을 사용하면 쉽게 설치할 수 있다.
아래는 VS Package Management Console에서 SSH.NET을 설치하는 명령이다.
PM> Install-Package SSH.NET
.NET Core CLI를 사용하는 경우, 아래와 같이 dotnet add pacakge 명령을 사용할 수 있다.
dotnet add package ssh.net
SSH 클라이언트에서 명령어 실행하기
SSH.NET을 사용하여 SSH 클라이언트 프로그램을 작성하는 부분에 대해 살펴보자.
SSH 클라이언트는 통상 SSH 서버에 로그인명과 암호를 가지고 접속하고,
서버에 임의의 명령을 보내고 결과를 받아와 출력한다.
아래 예제는 SSH.NET을 사용하여 SSH 서버에 접속한 후, "ls -al"을 실행하고,
이어 "cat .profile" 명령을 실행한 결과를 출력하는 코드이다.
SSH.NET에서 SSH 클라이언트를 사용하기 위해서는 먼저 SshClient 클래스로부터
객체를 생성하고, Connect() 메서드를 사용하여 SSH 서버에 연결한다.
서버에 연결된 후에는 명령어를 SshCommand 에 담아, 실행하고 결과를 가져오게 된다.
static void Main(string[] args)
{
var ci = new ConnectionInfo("test.com",
"user",
new PasswordAuthenticationMethod("user", "pwd"));
using var cli = new SshClient(ci);
cli.Connect();
// (1) 간단한 표현
var output = cli.CreateCommand("ls -al").Execute();
Console.WriteLine(output);
// (2) SshCommand 객체 변수 사용
// Dispose 할 수 있고, ExitStatus 같은 속성 체크 가능
using (SshCommand cmd = cli.CreateCommand("cat .profile"))
{
output = cmd.Execute();
Console.WriteLine($"ExitStatus: {cmd.ExitStatus}");
Console.WriteLine(output);
}
// (3) RunCommand() 사용. SshCommand 생성하고 실행.
SshCommand cmd2 = cli.RunCommand("cat .profile");
if (cmd2.ExitStatus == 0)
{
Console.WriteLine(cmd2.Result); //결과
}
cmd2.Dispose();
cli.Disconnect();
}
SshCommand 클래스의 CreateCommand() 메서드는 서버로 보내는 명령어를
갖는 SshCommand 객체를 생성하는 메서드이고 Execute() 메서드를 사용하여
명령을 실행하게 된다.
RunCommand() 메서드는 명령어를 갖는 SshCommand 객체를 생성하면서 동시에
명령을 서버에 보내 실행하는 메서드이다.
참고로, SshClient 클래스의 CreateShellStream() 메서드를 사용하여
서버에 새로운 Shell 세션을 만들고 그 Stream을 가지고 명령을 보내고 결과를
스트림에서 읽어 오는 기능을 사용할 수도 있다.