SSH .NET:冻结sudo su - user2

时间:2013-05-15 08:25:00

标签: c# ssh sudo

我正在编写一个非常小的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();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

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

这个来自github的用户kasbst回答了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();
}

其他一些解释

  

我不知道user2或root的密码

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

  

ls d /

它必须为ls -d /

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

答案 1 :(得分:0)

ssh.RunCommand("echo "" + rootPwd + "" | sudo -S " + command);