如何通过 sudo 运行命令并通过 ssh 输入密码 C#

2023-12-12

我想在具有 Linux 操作系统的远程计算机上运行命令并获取结果。我正在使用 ssh .net 库通过 C# 代码进行连接。我可以连接并运行一些不需要使用的命令"sudo"前。但我不知道如何运行需要 sudo 运行的命令,因为运行后 - 例如 - “sudo iptables -L -n” 我应该输入密码,但我不知道执行此命令后如何输入密码命令。

这是我的代码:

private void connectingToLinuxHost(string ip, string username, string password, int port)
{
    SshCommandLineRunner ssh = new SshCommandLineRunner(ip, username, password, port);
    ssh.Connect();
    string output1 = ssh.ExecuteCommand("ls");

    ssh.ExecuteCommand("sudo iptables -L -n");
    Thread.Sleep(1000);
    string output2 = ssh.ExecuteCommand(password);

    ssh.ExecuteCommand("sudo iptables -L -n \n");
    Thread.Sleep(1000);
    string output3 = ssh.ExecuteCommand(password);
}

当这个函数运行时,我可以成功连接到远程电脑,output1有正确的值,但output2和output3为空。实际上很明显,在 sudo 命令之后需要输入密码。 我已经阅读了有关 ssh .net 的大多数问题。一些类似的问题仍未得到解答。

SSH .NET:冻结 sudo su - user2(他或她不知道密码,但我知道我不知道如何通过代码输入密码)

如何使用 SSH.Net 进行su?(我使用了 create shell 方法,但我无法理解它的用途,就像这个问题一样,我得到了“上次登录:...”输出。)


正如评论中已经提到的,最安全的方法是使用 CreateShellStream 并在运行 sudo 命令后将密码直接写入流。密码的发送就像您使用交互式终端一样。但是,如果您不想被锁定使用无尽的流来完成您想做的其余事情,那么这可能不是一个方便的解决方案。例子:

var promptRegex = new Regex(@"\][#$>]"); // regular expression for matching terminal prompt
var modes = new Dictionary<Renci.SshNet.Common.TerminalModes, uint>();
using (var stream = ssh.CreateShellStream("xterm", 255, 50, 800, 600, 1024, modes))
{
    stream.Write("sudo iptables -L -n\n");
    stream.Expect("password");
    stream.Write("mypassword\n");
    var output = stream.Expect(promptRegex);
}

缺点是您的输出将包含您并不真正想要的垃圾:控制字符、提示以及通过流发送的所有其他内容。

如果您想避免使用 shell 流,那么您可以(取决于安全设置)通过 stdin 提供密码。这是不安全的,因为命令会记录在不同的地方,并且您可能会向其他具有 root 访问权限的用户泄露您的密码。如果您是唯一的用户,或者您不关心其他人可以看到您的密码,那么这对您来说可能会更方便。

Example:

using (var cmd = ssh.RunCommand("echo -e 'mypassword\n' | sudo -S iptables -L -n"))
{
    if (cmd.ExitStatus == 0)
        Console.WriteLine(cmd.Result);
    else
        Console.WriteLine(cmd.Error);
}

最后,还可以让脚本将您的密码打印到标准输入。这样您的密码就不会与命令行的其余部分一起被记录;但这仍然不够安全,因为具有 root 访问权限的任何人都可能读取脚本并查看密码:

using (var cmd = ssh.RunCommand("~/printpasswd.sh | sudo -S iptables -L -n"))
{
    if (cmd.ExitStatus == 0)
        Console.WriteLine(cmd.Result);
    else
        Console.WriteLine(cmd.Error);
}

和 printpasswd.sh 内部:

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

如何通过 sudo 运行命令并通过 ssh 输入密码 C# 的相关文章

随机推荐

  • Gmail电子邮件发送c#

    当我尝试向同一电子邮件发送消息时 此代码有效 但在其他电子邮件中 则无法正常工作 var smtpClient new SmtpClient smtp gmail com Port 587 UseDefaultCredentials fal
  • 围绕 d3 地图投影创建弯曲边框

    我使用所示的 geoNaturalEarth1 在 d3 中创建了一张世界地图here 我使用带有此投影的 geojson 世界地图来获取地图 如下面的代码所示 然而 这表明各国漂浮在太空中 没有边界 我想在地图投影周围绘制边框 使其看起来
  • 将行开头的所有制表符匹配并替换为四个空格

    我在网站上阅读了一些其他问题和答案 但它们都与我所寻求的有点不同 用四个空格替换字符串开头的所有制表符 到目前为止我尝试过的 let m t tsomething t 查找标签并不难 t g 但这会得到不在行首的制表符 所以使用m matc
  • 如何在 Jupyter 笔记本中以编程方式生成 Markdown 输出?

    我想在 Jupyter 笔记本中写一份课程报告 我想计算一些东西 生成一些结果并将它们包含在降价中 我可以将单元格的输出设置为降价吗 我想要这样的命令 print phi 生成 phi 符号 就像在 Markdown 中一样 换句话说 我想
  • 关闭 Visual Studio 中的漂亮列表

    我有一个宏 插件 我需要在其中禁用 Vb Net漂亮的清单暂时的 尝试录制宏 但它只显示我打开了选项对话框 也尝试过 Dim props As EnvDTE Properties DTE Properties TextEditor Basi
  • GitLab CI 的 Docker 构建作业参数无效

    所以我正在尝试设置我的 Gitlab CI 来触发一个作业git push构建和部署我的 Docker 这是 gitlab ci yml我正在使用的文件基于 Gitlab 文档 Elixir yml 中的示例 stages build bu
  • 获取有关 WCF 中需要很长时间的方法的进度信息的有效模式?

    我想要获取有关 WCF 上调用的方法的进度更新 例如 我运行 1000 个查询并想知道当前状态 如果双工合约在您的环境中不可行 您将不得不诉诸轮询 您的初始方法可以返回一个标识符 可能是 GUID 然后您可以对另一个方法进行后续调用以检查进
  • 如何在Mac上运行shell命令?

    如何使用 Excel VBA 代码运行 shell 命令 我想跑chmod x Users asdasd Music playlistLoad sh穿过外壳 我使用 Python 实现了这一点os system Command here 在
  • 如何在 C# 中进行参数化 SELECT 查询?

    我正在尝试使用 DataGridView 以及 C 和 SQL Server 中的参数化查询来显示数据库中表中的数据 到目前为止 我已经尝试过这段代码 private void button1 Click object sender Eve
  • 复杂对象图的快速哈希码

    我有一个漂亮的复杂的物体我需要得到独特性这些物体 一种解决方案可以通过重写来完成GetHashCode 我已经实现了如下代码 public override int GetHashCode return this complexObject
  • 使用 System.IO.Compression.FileSystem 将完整目录添加到现有 zip 文件

    以下示例可在互联网和本网站上追溯 作为使用 NET Framework 4 5 压缩文件的解决方案 它可以工作 但是当存档已经存在时 它会给出错误 因为它似乎只能压缩文件夹并创建新的 zip 文件 Reflection Assembly L
  • Apache Commons Validator 帮助下的 NoClassDefFoundError 问题

    如果使用 Apache Commons Validator 会出现错误 java lang NoClassDefFoundError org apache oro text perl Perl5Util 即使 Apache Commons
  • 如何在 RestAssured 中设置 OAuth 领域

    我正在使用 RestAssured 库来自动化 NetSuite Restlet 此 Restlet 使用 OAuth 1 0 进行身份验证 除了消费者密钥 消费者秘密 访问令牌和令牌秘密之外 我还需要设置 REALM 等高级字段 但我找不
  • 构造一个没有默认构造函数的空对象

    假设我有一个类型F 我知道F是空的 但是F没有默认构造函数 所以我不能使用F 来构建它 有没有办法获得类型的有效对象F反正 我似乎记得有人提到过有一种神秘的联合用法 理想情况下 它会是constexpr友好的 这可能很有用 因为无捕获 la
  • Android - listView 中的单选按钮?

    我有一个场景 我们应该在列表视图中有一个单选模式单选按钮 当我单击单选按钮时 它应该进入启用状态 当我单击整个项目时 它应该重定向到新活动 我参考了下面的链接 link1 link2 我可以找到多项选择模式的方法 但不适用于单选模式 对此有
  • nVIDIA 驱动程序如何将设备索引分配给 GPU?

    假设在单个节点上 有多个具有不同计算能力的设备 nvidia如何对它们进行排名 我的排名是指cudaSetDevice分配的数字 有关于此的一般准则吗 谢谢 我相信对应的设备顺序cuda获取设备 and cudaSetDevice 即 CU
  • 在 QML TableView 中单击时编辑数据(如 Excel)

    我有一些代码 import QtQuick 2 2 import QtQuick Window 2 1 import QtQuick Controls 1 2 Window visible true width 538 height 360
  • 无法在 AppService 中使用 Active Directory 集成身份验证连接到 Azure SQL Server

    我们在 Azure 应用服务上部署了 Web 应用程序 我们的数据库也在 Azure 上 配置为使用 AAD 身份验证 我们已分配 AAD 管理员 我们在 Web 应用程序中使用下面的连接字符串来使用下面的连接字符串连接到该服务器和数据库
  • 在 Spring Boot 中将 Angular 环境变量传递给已编译的静态 Angular 文件

    我现在使用 Angular 和 Spring Boot 来构建网站项目 当我们部署时 我们将ng build output path spring boot project src main resources static Angular
  • 如何通过 sudo 运行命令并通过 ssh 输入密码 C#

    我想在具有 Linux 操作系统的远程计算机上运行命令并获取结果 我正在使用 ssh net 库通过 C 代码进行连接 我可以连接并运行一些不需要使用的命令 sudo 前 但我不知道如何运行需要 sudo 运行的命令 因为运行后 例如 su