SSH .NET : freeze upon sudo su - user2

本文关键字:su user2 sudo upon NET freeze SSH | 更新日期: 2023-09-27 18:13:32

我正在编写一个非常小的c#程序,旨在允许我远程连接到服务器通过SSH(使用SSH .NET Client Library),并执行命令,主要是关于打印机的命令,比如"lpstat"。在此之前,我一直使用Putty来手动检查内容(主要是打印机状态)。我想让其中一些自动化。我使用Putty连接user1(在连接后提示输入用户名/密码),必须执行"sudo su - user2"才能执行lpstat和其他命令。

现在问题来了:一旦我连接到SSH . net,命令"sudo su -"似乎冻结了连接。为什么?这可能是同一个问题从Serverfault ?如果有另一种方式连接为user2(即使用SSH . net不同),那将是很好的与我。

重要的笔记:

  • 我不知道user2或root的密码
  • 生产服务器。我不是它的管理员,我也不是非常高级的Unix用户。我不想改变那个服务器配置。
  • 我认为冻结与请求a的命令有关

我的当前代码:

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();
        }
    }
}

SSH .NET : freeze upon sudo su - user2

你解决了你(6年零4个月前)的问题了吗?

来自github的用户kasbst在这里回答

我按照他/她的回答去做,而且做得很好。

  • 我使用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();
}

其他解释

我不知道user2或root的密码

在服务器设置中,用户可以切换帐号而不需要提示密码。

ls d/

必须是ls -d /

仅在服务器控制台显示结果/输出,为了看到结果,使用ReadStream函数

ssh.RunCommand("echo "+ rootPwd + ";| sudo -S "+命令),