powershell - 在 PowerShell 中回答 Plink 主机 key 和 KEX 提示

标签 powershell ssh cmd sendkeys plink

我成功地从下面的 plink.exe 命令行获取我需要的结果文本到 $response。为了在远程 SSH 设备上执行该命令,我必须首先在其前面添加模拟击键 Y {enter} Y {输入}

代码:

$Device = "SSHDeviceHostname"
$Command = "sho ver | include uptime is"
Add-Type -AssemblyName System.Windows.Forms

$wshell.SendKeys('y~y~'); $response = cmd /C "C:\Windows\plink.exe -ssh -l `"$($CredentialToken.GetNetworkCredential().username)`" -pw `"$($CredentialToken.GetNetworkCredential().password)`" $Device `"$Command`"" 2>$null

结果:

y
y


C:\Users\MKANET\Desktop> $response
SSHDeviceHostname uptime is 5 years, 25 weeks, 1 day, 3 minutes

C:\Users\MKANET\Desktop>

我想隐藏假击键 Y {enter} Y {enter} 以免显示;不会对 $response 值产生不利影响。我尝试在本地主机上invoke-command'ing整个脚本 block ,但没有成功。我可能可以在单独的隐藏 PowerShell session 中执行此代码。然而,这很可能会减慢速度太多。

PS: 我还尝试使用 cmd(如下),不幸的是 plink.exe 完全忽略了第二个 echo `y;立即中止连接:

cmd /C "Echo Y && Echo Y | plink.exe -ssh -l `"$($Credential.GetNetworkCredential().username)`" -pw `"$($Credential.GetNetworkCredential().password)`" $DeviceName `"$Command`""

最佳答案

要回答您的字面问题,您可以在批处理文件中执行以下操作:

powershell -command "Write-Host -NoNewLine y ; sleep 2 ; Write-Host -NoNewLine y" | plink ...

请注意,该代码仅在批处理文件(在 cmd 中)中有效。它在Windows PowerShell 中不起作用。 | 在 Windows PowerShell 中的语义与在 cmd 中的语义不同。 在 Windows PowerShell 中,它将等待 powershell 完成后再启动 >plink,因此 sleep 的唯一作用是它会延迟启动 plink。在 cmd 中,powershellplink 可以根据需要并行运行。

正如 @mklement0 所评论的,自 PowerShell (核心) 6 以来,这一点得到了改进。所以你可以这样做:

& { 'y'; sleep 2; 'y' } | plink ...

但你不应该盲目接受主机 key 。您失去了针对 man-in-the-middle attacks 的保护。您应该使用 -hostkey 开关验证主机 key 。
请参阅Prepend a command in Start-Process to provide "y" input to Plink

KEX 验证类似。 Plink 中没有 KEX 开关。但您可以在允许 diffie-hellman-group1-sha1 的情况下在注册表中创建临时存储 session 。并调用 Plink 中存储的 session 。

$hostname = "example.com"
$username = "username"
$password = "password"
$hostkey = "c4:26:18:cf:a0:15:9a:5f:f3:bf:96:d8:3b:19:ef:7b"

$session = "Dummy"
$key = "HKCU:\SOFTWARE\SimonTatham\PuTTY\Sessions\$session"

New-Item -Path $key -Force | Out-Null
New-ItemProperty -Path $key -Name HostName -Value $hostname | Out-Null
New-ItemProperty -Path $key -Name UserName -Value $username | Out-Null
New-ItemProperty -Path $key -Name KEX `
    -Value "ecdh,dh-gex-sha1,dh-group14-sha1,rsa,dh-group1-sha1,WARN" | Out-Null

& plink $session -pw $password -hostkey $hostkey

关于powershell - 在 PowerShell 中回答 Plink 主机 key 和 KEX 提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66879016/

相关文章:

sql-server - osql vs Invoke-Sqlcmd-重定向后者的输出

linux - Bash脚本SSH命令变量插值

java - 使用 JSch 跳过 Kerberos 身份验证提示

linux - 如何通过 shell 脚本在远程服务器上连接和运行 shell 脚本

python - PyInstaller .exe 文件什么都不做

windows - 如何在 MS Windows 中更改 "local system"帐户的 %PATH% 值?

windows - 捕获程序stdout和stderr来分隔变量

powershell - 无法使用此Windows Powershell运行此简单的.exe文件

windows - 如何使用批处理文件更改注册表权限以从导航 Pane 中删除网络

powershell - 可选字符串参数(应为 NULL)