gpt4 book ai didi

c# - PowerShell,读/写 SSH.NET 流

转载 作者:行者123 更新时间:2023-11-30 14:11:31 25 4
gpt4 key购买 nike

我想使用 PowerShell 通过 SSH 连接到服务器,然后更改为不同的用户

为了通过 SSH 使用 PowerShell 连接到服务器,我使用了 SSH from PowerShell using the SSH.NET libraryHow to connect via SSH from powershell .这太棒了,它为我提供了简单的命令行开关,例如 new-sshsessioninvoke-sshcommand 可以使用。

接下来,我想su 到另一个用户。当我尝试通过命令行开关执行此操作时,出现错误:standard in must be a tty

我知道我可以编辑服务器上的安全设置,让我可以su 给用户,而无需处于交互模式。但是,我无法在我想连接的所有服务器上更改该设置。

处理我在 https://sshnet.codeplex.com/discussions/285853 找到的 C# 示例,我放在一起:

$server = "server1"
$port = 22
$username = "user1"
$password = "password1"

$ssh = new-object Renci.SshNet.SshClient($server, $port, $username, $password)
$ssh.Connect()

$inputstream = new-object System.IO.MemoryStream
$streamwriter = new-object System.IO.StreamWriter($inputstream)
$outputstream = new-object System.IO.MemoryStream
$streamreader = new-object System.IO.StreamReader($outputstream)

$shell = $ssh.CreateShell($inputstream, $outputstream, $outputstream)
$shell.Start()
$streamwriter.WriteLine("echo hello > tempfile.txt")
$streamwriter.Flush()
$streamreader.ReadToEnd()

$shell.Stop()

运行,我得到如下输出:

Last login: Fri Nov  8 11:37:45 2013 from 10.XXX.XXX.XXX
[user1@server1 /users/user1]

但是,/users/user1/tempfile.txt 永远不会被写入,我也没有得到任何进一步的输出。

你看到我做错了什么了吗?

最佳答案

使用 https://sshnet.codeplex.com/discussions/439210 中的示例,我能够用下面的代码解决我的问题。主要问题是我正在为输入/输出创建两个不同的流,而我只需要使用一个流。

$server = "server1"
$port = 22
$username = "user1"
$password = "password1"

###############################################################

function ReadStream($reader)
{
$line = $reader.ReadLine();
while ($line -ne $null)
{
$line
$line = $reader.ReadLine()
}
}

function WriteStream($cmd, $writer, $stream)
{
$writer.WriteLine($cmd)
while ($stream.Length -eq 0)
{
start-sleep -milliseconds 500
}
}

###############################################################

$ssh = new-object Renci.SshNet.SshClient($server, $port, $username, $password)
$ssh.Connect()

$stream = $ssh.CreateShellStream("dumb", 80, 24, 800, 600, 1024)

$reader = new-object System.IO.StreamReader($stream)
$writer = new-object System.IO.StreamWriter($stream)
$writer.AutoFlush = $true

while ($stream.Length -eq 0)
{
start-sleep -milliseconds 500
}
ReadStream $reader

WriteStream "su - root" $writer $stream
ReadStream $reader

WriteStream "password" $writer $stream
ReadStream $reader

WriteStream "pwd" $writer $stream
ReadStream $reader

$stream.Dispose()
$ssh.Disconnect()
$ssh.Dispose()

关于c# - PowerShell,读/写 SSH.NET 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19864617/

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