是否可以使用 SSH.NET 从单个登录会话执行多个 SSH 命令?

2023-12-11

我将 C# 与 SSH.NET 结合使用,并且能够使客户端 SSH 连接正常工作,以便通过 SSH 执行命令。我可以毫无问题地连接到虚拟机管理程序虚拟机上安装的 Linux,请读回StdOut and StdErr, etc.

然而,每个命令就像一个全新的会话 - 它总是从/home/user,即使您使用最后一个命令从另一个目录完成。你can用分号将多个命令串在一起:

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 交互时,此接口非常有用。
  • or SshClient.CreateShell (Shellclass) — 您自己为输入、输出和错误输出提供单独的流。当您想要将输入和输出链接/管道到现有流(例如标准输入和输出或文件)时,此接口非常有用。尽管您仍然可以直接交互,但如果您使用PipeStream。也可以看看SSH.NET 不处理我的 shell 输入命令.

但实际上不建议使用“shell”来自动执行命令。 shell 是一种交互式功能,不具有确定性行为。

您最好使用执行通道,请参阅如何用 C# 在 SSH 服务器上运行命令?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以使用 SSH.NET 从单个登录会话执行多个 SSH 命令? 的相关文章

  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • 在.rdlc报告的底部设置一个文本框

    我在 rdlc 报告中使用 tablix 有一个文本框 其中包含文本 签名 我想将此文本框放置在报告最后一页的底部 就在页脚之前 我已经用谷歌搜索了这个解决方案 但没有找到满意的结果 我的环境是VS2010 framework 4 0 有什
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 线程睡眠和Windows服务

    我正在开发一个 Windows 服务 该服务存在一些问题Thread Sleep 所以我想我会尝试使用计时器 因为这个问题建议 在 Windows 服务中使用 Thread Sleep https stackoverflow com que
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke

随机推荐

  • 等待后不执行异步/等待代码

    我一直在讨论异步 等待 我尝试了一些简单的例子 但无法理解 async 和 wait 的流程 在下面的代码中 function wait ms return new Promise r gt setTimeout function cons
  • C# - 排序 datagridview 时出现问题

    我苦苦寻找问题的答案 我开发了一个带有一些 datagridview 的 C Winforms 程序 问题是我希望用户能够通过单击列标题对 datagridview 进行排序 我认为这将是标准的 但它就是行不通 我尝试了 dgv Sort
  • 不同国家、州、地理位置的动态下拉列表?

    我让我的用户输入他们的城市 州和国家 但我的困境是如何动态管理它 以便我可以控制输入的内容 同时保持正确的拼写和格式 例如 我目前每个州都有一个静态下拉列表
  • 当没有输入具有焦点时,Javascript 捕获输入

    我有条形码扫描仪 有时用户想通过条形码搜索物品 但他够懒 根本不想用鼠标点击输入 扫描仪通常输入 8 到 13 个符号的速度非常快 没有人类打字这么快 这将是完美的解决方案 1 检测极端输入 如果页面上没有输入元素具有焦点 2 则选择具有特
  • 用于动态生成内容的 GWT 国际化

    对于我的大部分应用程序 我可以使用推荐的国际化技术 如https developers google com web toolkit doc latest DevGuideI18n 主要是UIBinder方法 我目前正在使用单个小部件 该小
  • 我可以使用c++编译器来编译c源代码吗? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 C 编译器编译 C 代码会出现哪些问题 只是好奇我是否可以使用c 编译器来编译c源代码 无论如何 有没有完全支持c99标准的编译器 C is notC 的超集 它们有一些不同的地方 这意味着某些
  • 使用绘图时图例中的颜色条

    这是我的数据 set seed 42 mydata data frame A rnorm 20 B rnorm 20 Index sample 190 400 20 我试图根据以下内容将数据分为 20 个不同的区间Index值 然后根据它们
  • 调整无边框表单的大小,该表单到处都有控件,没有空白区域

    我有一个程序有FormBorderStyle set to None 我一直在网上查找并找到了用于调整表单大小的工作代码 但它仅在表单有没有控件的空白空间时才有效 我的整个表单充满了控件 每个边缘都有控件 而且我无法在边缘留出空间 有没有办
  • WPF Datagrid 分组和排序

    我正在 WPF 数据网格中实现分组 我想对分组的项目进行排序 例如 数据网格有四列 empno name dept address 我正在按部门列进行分组 当我单击部门列标题时 我想对分组的项目进行排序 在这里 我使用 ListCollec
  • jQuery 验证插件:字段成功验证的回调?

    我正在使用 errorPlacement 将类添加到标签中 以显示除错误文本之外的图形元素 它们都是不同的元素 有没有办法使用在字段验证成功时触发的回调 我已经在使用 validClass 这将更改错误消息 但我需要回调 以便我可以将图形元
  • 在android中动态添加布局到adapter的getview方法中

    我想在列表视图的每一行中显示 N 个图像视图 imageview的数量取决于json解析值 每次我从服务器获取 json 时 它可能是 2 3 或 4 所以我不能通过使用 inflate so 我决定在 getview 方法中创建动态视图并
  • 如果服务器上启用了内容安全策略,如何使用小书签将脚本注入页面?

    我有一个书签 它使用 jQuery 并解析页面上的一些元素 为了使用 jQuery 我动态创建一个脚本标签 使用 src 作为 jQuery URL 并附加到 head 标签 这对于许多网站都很有效 但是 像 Facebook 这样的网站很
  • 调用“ret”与调用 sys_exit 编号程序集 gcc 有什么区别

    在 gcc 汇编中 main 函数可以返回或退出 两者都起作用 这里我有两个程序 其中一个通过系统调用退出int 0x80 另一个简单地调用 ret 有什么不同 data hello string Hello World globl mai
  • 有什么方法可以在运行时调试电子表格应用程序脚本吗? [复制]

    这个问题在这里已经有答案了 有没有办法在运行时调试电子表格谷歌应用程序脚本 仅通过脚本编辑器运行它是没有用的 因为我需要调试的函数将触发事件作为参数 这是一个可以测试表单提交触发功能的函数 摘自如何测试 GAS 中的触发功能 functio
  • 尽管有标志,Chrome 并不将不安全的来源视为安全

    我想测试getUserMediaWindows 上 Chrome 上的不安全来源 我按照 goo gl rStTGz 上的说明以这种方式启动 Chrome 如果您使用不安全的来源 该链接会显示在控制台中getUserMedia start
  • 了解更多有关 JS 身高的快速资源

    JavaScript 中有很多与 高度 相关的属性 clientHeight Window height scrollHeight offsetHeight 等 我可以猜测他们是做什么的 但我想要一份正式的 详细的指南 通用谷歌搜索没有帮助
  • .net core类库调用.net Framework类库

    无法找到我的疑问的答案 希望有人能澄清 我创建了一个虚拟解决方案 1个类库 net框架 1 net核心库 试图参考任何一种方式 但我不能 它们不兼容 罚款是有道理的 现在我的问题 我有一个实用类库 net 框架 带有扩展 助手等 winfo
  • C# - 在背景图像上绘制顶部图像(alpha 通道) - WinForm

    我已经得到了这个带有 alpha 通道的顶部图像 我需要将此图像放在另一个背景图像上 而顶部图像的 alpha 通道显然保持完整 现在我已经看到了一些关于 Canvas 的教程 但我的项目似乎无法识别 Canvas 有人知道为什么我不能使用
  • 初始化条带变量后如何更改条带区域设置

    我正在使用条纹TypeScript应用程序 我读到可以使用如下语言环境设置 stripe 变量 var stripe Stripe pk test locale en 但如果我想在初始化后更改语言 我无法做到这一点 我想创建一个新的 str
  • 是否可以使用 SSH.NET 从单个登录会话执行多个 SSH 命令?

    我将 C 与 SSH NET 结合使用 并且能够使客户端 SSH 连接正常工作 以便通过 SSH 执行命令 我可以毫无问题地连接到虚拟机管理程序虚拟机上安装的 Linux 请读回StdOut and StdErr etc 然而 每个命令就像