gpt4 book ai didi

c# - SSH.NET : freeze upon sudo su - user2

转载 作者:行者123 更新时间:2023-11-30 12:47:36 28 4
gpt4 key购买 nike

我正在编写一个非常小的 C# 程序,旨在允许我远程连接到服务器通过 SSH(使用 SSH .NET 客户端库),并执行命令,主要是有关打印机的命令,例如“lpstat”。在此之前,我曾经为此目的使用 Putty 并手动检查内容(主要是打印机状态)。我想使其中的一些自动化。我使用 Putty 与 user1 连接(在连接后提示输入用户/密码时)并且必须“sudo su - user2”才能执行 lpstat 和其他命令。

问题来了:一旦我连接到 SSH .NET,命令“sudo su -”似乎会卡住连接。为什么 ?会不会和Serverfault的这个问题一样? ?如果有另一种方式作为 user2 进行连接(即以不同方式使用 SSH .NET),那对我来说没问题。

重要提示:

  • 我不知道 user2 或 root 的密码
  • 这是一个生产服务器。我不是它的管理员,我也不是非常高级的 Unix 用户。我不想改变那个服务器配置。
  • 我相信卡住与请求一个命令有关密码,但我不确定。

我当前的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Renci.SshNet;
using System.IO;
using System.Threading;

namespace SSHChecker
{
class Program
{
static void Main(string[] args)
{
SshClient sshClient = new SshClient(
"IP",
666, // port
"user1",
"user1Password");

sshClient.Connect();
SshCommand sshCommand;
String res;

//sshCommand = sshClient.RunCommand("ls d /"); // works fine
sshCommand = sshClient.RunCommand("sudo su - user2"); // freezes ...
sshCommand = sshClient.RunCommand("ls d /"); // ... so this code is never executed.

sshClient.Disconnect();
}
}
}

最佳答案

您是否解决了您(6 年零 4 个月前)的问题?

这个用户kasbst来自 github 的回答 here

我听从了他/她的回答并且工作得很好。

  • 我使用的是 CentOS 7 服务器(无需安装 expect)。
  • Visual Studio 2017

下面是他/她的代码和示例

private static void WriteStream(string cmd, ShellStream stream)
{
stream.WriteLine(cmd + "; echo this-is-the-end");
while (stream.Length == 0)
Thread.Sleep(500);
}

private static string ReadStream(ShellStream stream)
{
StringBuilder result = new StringBuilder();

string line;
while ((line = stream.ReadLine()) != "this-is-the-end")
result.AppendLine(line);

return result.ToString();
}

private static void SwithToRoot(string password, ShellStream stream)
{
// Get logged in and get user prompt
string prompt = stream.Expect(new Regex(@"[$>]"));
//Console.WriteLine(prompt);

// Send command and expect password or user prompt
stream.WriteLine("su - root");
prompt = stream.Expect(new Regex(@"([$#>:])"));
//Console.WriteLine(prompt);

// Check to send password
if (prompt.Contains(":"))
{
// Send password
stream.WriteLine(password);
prompt = stream.Expect(new Regex(@"[$#>]"));
//Console.WriteLine(prompt);
}
}

示例:

using (var client = new SshClient(server, username, password))
{
client.Connect();

List<string> commands = new List<string>();
commands.Add("pwd");
commands.Add("cat /etc/sudoers");

ShellStream shellStream = client.CreateShellStream("xterm", 80, 24, 800, 600, 1024);

// Switch to root
SwithToRoot("rootpassword", shellStream);

// Execute commands under root account
foreach (string command in commands) {
WriteStream(command, shellStream);

string answer = ReadStream(shellStream);
int index = answer.IndexOf(System.Environment.NewLine);
answer = answer.Substring(index + System.Environment.NewLine.Length);
Console.WriteLine("Command output: " + answer.Trim());
}

client.Disconnect();
}

一些其他的解释

I don't know user2's or root's password

在服务器设置中,用户可以在不提示密码的情况下切换帐户。

ls d /

必须是ls -d/

它只是在服务器的控制台上显示结果/输出,要查看结果,请使用 ReadStream 函数。

关于c# - SSH.NET : freeze upon sudo su - user2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16560144/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com