【问题标题】:PowerShell, read/write to SSH.NET streamsPowerShell,读/写 SSH.NET 流
【发布时间】:2013-11-11 01:26:09
【问题描述】:

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

为了使用 PowerShell 通过 SSH 连接到服务器,我使用了 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 永远不会被写入,我也没有得到任何进一步的输出。

你知道我做错了什么吗?

【问题讨论】:

    标签: c# .net powershell ssh


    【解决方案1】:

    使用来自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()
    

    【讨论】:

    猜你喜欢
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多