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();
}
}
}
你解决了你(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 "+命令),