簡體   English   中英

是否可以使用 SSH.NET 從單個登錄會話中執行多個 SSH 命令?

[英]Is it possible to execute multiple SSH commands from a single login session with SSH.NET?

我正在將 C# 與 SSH.NET 一起使用,並且已經能夠使客戶端 SSH 連接正常工作以通過 SSH 執行命令。 我可以StdOut連接到管理程序 VM 上的 Linux 安裝,讀回StdOutStdErr等。

但是,每個命令就像一個全新的會話 - 它總是從/home/user ,即使您使用最后一個命令從另一個目錄完成也是如此。 可以使用分號將多個命令串在一起:

pwd; cd ..; pwd
 /home/user /home

但是如果我執行:

pwd
 /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 = ssh.CreateCommand("pwd; cd ..; pwd");
        output1 = cmd1.Execute();
        var cmd2 = ssh.CreateCommand("pwd; cd ..; pwd");
        output2 = cmd2.Execute();
        ssh.Disconnect();

    }

    string output = output1 + Environment.NewLine + output2;
    System.Windows.Forms.Clipboard.SetText(output);
    System.Windows.Forms.MessageBox.Show(output);
}

我意識到在連接到 Bash 等時交互式會話和非交互式會話之間存在差異,但對 linux 等的了解不夠,不知道這是否可以成為解決方案的一部分(即可能必須是在登錄端使用.profile.bashrc或類似文件解決?)。

問題:

那么 - 有沒有辦法與 SSH(尤其是 SSH.NET)建立類似 shell 的連接? 或者我是否只需要序列化任何一組命令並一次發送它們,對於任何新命令總是從頭開始?

您可以使用以下方法實現 shell 會話:

  • SshClient.CreateShellStreamShellStream類)——它為您提供了一個Stream接口,您可以寫入和讀取。 當您想直接與 shell 交互時,此接口很有用。
  • SshClient.CreateShellShell類)——您自己為輸入、輸出和錯誤輸出提供單獨的流。 當您想將輸入和輸出鏈接/管道到現有流(如標准輸入和輸出或文件)時,此接口很有用。 盡管您仍然可以直接交互,但如果您使用PipeStream 另請參閱SSH.NET 不處理我的 shell 輸入命令

但是真的不建議使用“shell”來自動執行命令。 外殼是一種交互式功能,沒有確定性行為。

您最好使用 exec 通道,請參閱如何在 C# 中的 SSH 服務器上運行命令?

作為記錄,這是通過使用 SSH 連接並打開隧道,然后使用 telnet 執行交互部分來解決的。 SSH.NET 在交互方面還不夠成熟。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM