我正在将 C# 与 SSH.NET 一起使用,并且已经能够使客户端 SSH 连接正常工作以通过 SSH 执行命令。我可以毫无问题地连接到管理程序 VM 上的 Linux 安装,回读StdOut和StdErr等。
但是,每个命令就像一个全新的会话 - 它总是从 开始/home/user,即使您使用最后一个命令从另一个目录结束也是如此。您可以使用分号将多个命令串在一起:
pwd; cd ..; pwd
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)/home/user /home
但是如果我执行:
pwd
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)/home/user
我回到了那个用户的主目录。
我没有断开和关闭命令之间的会话。以下是连续几个命令的一些示例代码,使用路径更改来说明问题:
public void MultiCommandTest()
{
string output1, output2;
var host = Config.SshHostName;
var port = Config.SshHostPort;
var user = Config.SshUsername;
var pass = Config.SshPassword;
var auth = new PasswordAuthenticationMethod(user, pass);
var info = new ConnectionInfo(host,port,user,auth);
using (var ssh = new SshClient(info))
{
ssh.Connect();
var cmd1 …Run Code Online (Sandbox Code Playgroud) script.sh远程Linux机器上有一个运行时间很长的脚本.我需要启动它并实时监控它的活动.它活动期间的脚本可以输出到stdout和stderr.我正在寻找一种捕获两种流的方法.
我使用Renci SSH.NET上传script.sh并启动它,所以很高兴看到这个库有一个解决方案.在我看来,完美的解决方案是新方法:
var realTimeScreen= ...;
var commandExecutionStatus = sshClient.RunCommandAsync(
command: './script.sh',
stdoutEventHandler: stdoutString => realTimeScreen.UpdateStdout(stdString)
stderrEventHandler: stderrString => realTimeScreen.UpdateStderr(stderrString));
...
commandExecutionStatus.ContinueWith(monitoringTask =>
{
if (monitoringTask.Completed)
{
realTimeScreen.Finish();
}
});
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用C#在PuTTY中运行Unix命令.我有以下代码.但是代码不起作用.我无法打开PuTTY.
static void Main(string[] args)
{
Process cmd = new Process();
cmd.StartInfo.FileName = @"C:\Windows\System32\cmd";
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.RedirectStandardInput = false;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.Start();
cmd.StartInfo.Arguments = "C:\Users\win7\Desktop\putty.exe -ssh mahi@192.168.37.129 22 -pw mahi";
}
Run Code Online (Sandbox Code Playgroud)