3

我需要能够在远程设备上创建一个进程并使用 PowerShell 脚本向它发送命令。我需要这样做,因为我在使用命令时会收到提示。我一直试图通过使用谷歌搜索和以下链接来弄清楚如何做到这一点:http: //tartarus.org/~simon/putty-snapshots/htmldoc/Chapter7.html#plink。从该链接中,我意识到在 Plink 中使用带有命令列表的文件将不起作用,原因如下(从该链接复制和粘贴):

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

它说“非交互式命令”,这就是我正在使用的。无论如何,我也尝试过使用带有命令列表的文件,但它并没有解决我的问题,因为我基本上需要给出一个命令,等待,然后在提示我时再给出一个。这是我在PuTTY 常见问题解答中发现的,基本上是我想尝试的:

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

编辑:根据 user2460798 的回答,我尝试了以下解决方案。我希望使用 PuTTY 并能够以这种方式向它发送命令。我现在的问题是我不知道如何向打开的 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")
4

2 回答 2

5

不确定是否理解您的问题,但这是我使用 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
于 2013-11-25T11:16:09.173 回答
1

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

可以使用此处给出的代码来实现常见问题解答中的第二个引用(“可能是您的...”):如何从 powershell 在另一个应用程序窗口中运行交互式命令,但将 cmd.exe 替换为 plink.exe 并更改命令行plink 所需的参数。

但一定要阅读代码前面的文字。它提到了一些警告。

于 2013-11-25T02:09:50.397 回答