在PowerShell中使用Plink创建进程并向其发送命令

在PowerShell中使用Plink创建进程并向其发送命令,powershell,process,putty,interactive,plink,Powershell,Process,Putty,Interactive,Plink,我需要能够在远程设备上创建一个进程,并使用PowerShell脚本向其发送come命令。我需要这样做,因为我在使用命令时会得到提示。我一直在试图通过使用谷歌搜索和以下链接了解如何做到这一点:。通过该链接,我意识到在Plink中使用包含命令列表的文件将无法工作,原因如下(从该链接复制和粘贴): 可以在服务器上有效运行的任何非交互式命令 命令行中,您可以使用Plink以这种方式在批处理文件中运行 上面写着“非交互命令”,这就是我正在使用的。我也尝试过使用一个包含命令列表的文件,但它并没有解决我的问题

我需要能够在远程设备上创建一个进程,并使用PowerShell脚本向其发送come命令。我需要这样做,因为我在使用命令时会得到提示。我一直在试图通过使用谷歌搜索和以下链接了解如何做到这一点:。通过该链接,我意识到在Plink中使用包含命令列表的文件将无法工作,原因如下(从该链接复制和粘贴):

可以在服务器上有效运行的任何非交互式命令 命令行中,您可以使用Plink以这种方式在批处理文件中运行

上面写着“非交互命令”,这就是我正在使用的。我也尝试过使用一个包含命令列表的文件,但它并没有解决我的问题,因为我基本上需要给出一个命令,等等,然后在它提示我时给出另一个命令。这是我在中发现的,基本上是我想尝试的:

您最好的选择可能是使用命令行连接Plink 工具。如果可以将Plink作为第二个Windows进程启动,并安排 为了使主进程能够向Plink进程发送数据, 并通过管道接收数据,然后您应该能够 从您的程序建立SSH连接。例如,CVS for Windows就是这样做的

编辑:根据用户2460798的回答,我尝试了以下解决方案。我希望使用油灰,并能够发送命令,它的方式。我现在的问题是,我不知道如何向打开的PuTTY会话发送命令。因此,基本上,这段代码打开PuTTY会话并尝试向其写入“ls”命令,但什么也没发生。我不知道“ls”文本要去哪里

$procInfo = New-Object Diagnostics.ProcessStartInfo
$procInfo.RedirectStandardOutput=$true
$procInfo.RedirectStandardInput=$true
$procInfo.RedirectStandardError=$true
$procInfo.FileName="putty.exe"
$procInfo.Arguments="-ssh -pw <password> <username>@<device>"
$procInfo.UseShellExecute=$false
$p=[diagnostics.process]::start($procInfo)
sleep -Milliseconds 3000
$p.StandardInput.WriteLine("ls")
$procInfo=New Object Diagnostics.ProcessStartInfo
$procInfo.RedirectStandardOutput=$true
$procInfo.RedirectStandardInput=$true
$procInfo.RedirectStandardError=$true
$procInfo.FileName=“putty.exe”
$procInfo.Arguments=“-ssh-pw@”
$procInfo.UseShellExecute=$false
$p=[diagnostics.process]::开始($procInfo)
睡眠-3000毫秒
$p.StandardInput.WriteLine(“ls”)

我不清楚你是否真的想要一些非交互式的东西。“它说的是“非交互命令”,这就是我正在使用的。”听起来你想要非交互命令。但“我基本上需要发出一个命令,等待,然后在它提示我时发出另一个命令”听起来很互动。由于不清楚,我将回答这个互动案例

FAQ中的第二句话(“可能是您的…”)可以使用此处给出的代码实现:,但将cmd.exe替换为plink.exe,并根据需要更改plink的命令行参数


但一定要阅读代码前面的文字。它提到了几个注意事项。

不确定是否理解您的问题,但以下是我使用plink的方式

function plink
{
  [CmdletBinding()]
  PARAM
  (
    [Parameter(Mandatory=$True)]
    [ValidateNotNullOrEmpty()]
    [string] $remoteHost,

    [Parameter(Mandatory=$True)]
    [ValidateNotNullOrEmpty()]
    [string] $login,

    [Parameter(Mandatory=$True)]
    [ValidateNotNullOrEmpty()]
    [string] $passwd,

    [Parameter(Mandatory=$True)]
    [ValidateNotNullOrEmpty()]
    [string] $command)

  & c:\Tools\plink.exe -ssh $remoteHost -l $login -pw $passwd $command
  return
}

$remoteHost = "192.168.1.1"
$login = "TheUserWhoCan"

$command1 = "/opt/compiere/apache-tomcat-6.0.32/bin/shutdown.sh "
$command2 = "cd /opt/compiere/apache-tomcat-6.0.32/bin && ./startWS.sh"
$command3 = "ps -edalf | grep java"

$passwd = Read-Host "Enter Password for $login"



write-host "Stopping tomcat" -ForegroundColor DarkGreen
plink -remoteHost $remoteHost -login compiere -command $command1 -passwd $passwd
Start-Sleep 10
write-host "Starting tomcat" -ForegroundColor DarkGreen
plink -remoteHost $remoteHost -login compiere -command $command2 -passwd $passwd

write-host "Looking for java processes"-ForegroundColor DarkGreen
plink -remoteHost $remoteHost -login compiere -command $command3 -passwd $passwd

请显示您的代码和收到的错误消息。@AnsgarWiechers好的,我有。
plink
不从STDIN读取。您需要使用命令字符串(
plink)运行该命令user@host“foo;bar;baz”
或使用命令文件
plinkuser@host-m commands.sh
@AnsgarWiechers实际上plink从stdin中读取数据并在SSH会话中将其发送到进程的stdin。它还将stdout从远程系统重定向到plink的stdout。对于stderr也是如此。这是我在生产中使用了几年的脚本中的一行ears:“$received=$textToSign | plink$fwSupportCCT@$signingHost-pw$fwsupport_password 2>&1`@Programmer_D在您帖子的代码片段中,所有这些都需要与您的值一起归档。我遵循您发布的链接中的方法。我已经用一些我正在尝试的代码更新了我的问题。哦,说得很清楚:我不想与您交流“我完全不喜欢脚本。我希望它运行并为我做任何事情。@程序员D“交互”并不意味着你必须与
plink
交互,而是有东西与程序交互(在这种情况下,你的脚本试图向
plink
进程发送命令)。