我正在编写一个非常小的C#程序,旨在让我远程连接到服务器 通过SSH(使用SSH .NET Client Library),执行命令, 主要是关于'lpstat'等打印机的命令。 在此之前我曾经为此目的使用Putty并手动检查东西(主要是打印机状态)。我想要 自动化其中一些。 使用Putty我正在连接user1(在连接后提示输入用户/密码时)并且必须“sudo su - user2”然后才能执行lpstat和其他命令。
现在问题是: 一旦我与SSH .NET连接,命令“sudo su - ”似乎冻结了连接。 为什么?它可能与Serverfault中的问题相同吗? 如果有另一种方式作为user2连接(即使用不同的SSH .NET),那对我来说没问题。
重要说明:
我目前的代码:
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();
}
}
}
答案 0 :(得分:1)
您解决了(6年零4个月前)的问题吗?
我听了他/她的回答,表现很好。
expect
)。下面是他/她的代码和示例
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);