[英]Is it possible to execute multiple SSH commands from a single login session with SSH.NET?
我正在將 C# 與 SSH.NET 一起使用,並且已經能夠使客戶端 SSH 連接正常工作以通過 SSH 執行命令。 我可以StdOut
連接到管理程序 VM 上的 Linux 安裝,讀回StdOut
和StdErr
等。
但是,每個命令就像一個全新的會話 - 它總是從/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.CreateShellStream
( ShellStream
類)——它為您提供了一個Stream
接口,您可以寫入和讀取。 當您想直接與 shell 交互時,此接口很有用。SshClient.CreateShell
( Shell
類)——您自己為輸入、輸出和錯誤輸出提供單獨的流。 當您想將輸入和輸出鏈接/管道到現有流(如標准輸入和輸出或文件)時,此接口很有用。 盡管您仍然可以直接交互,但如果您使用PipeStream
。 另請參閱SSH.NET 不處理我的 shell 輸入命令。但是真的不建議使用“shell”來自動執行命令。 外殼是一種交互式功能,沒有確定性行為。
您最好使用 exec 通道,請參閱如何在 C# 中的 SSH 服務器上運行命令?
作為記錄,這是通過使用 SSH 連接並打開隧道,然后使用 telnet 執行交互部分來解決的。 SSH.NET 在交互方面還不夠成熟。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.