在 PowerShell 中回答 Plink hostkey 和 KEX 提示
Answering Plink hostkey and KEX prompts in PowerShell
我成功地从下面的 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 本地主机上的整个脚本块但没有成功。我可能可以在单独的隐藏 PowerShell 会话中执行此代码。但是,这很可能会大大降低速度。
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
、powershell
和plink
运行并行,随心所欲。
正如@mklement0 所评论的那样,自从 PowerShell (Core) 6 以来,这已经得到改进。所以你可以这样做:
& { 'y'; sleep 2; 'y' } | plink ...
但是你不应该盲目接受主机密钥。你失去了对 man-in-the-middle attacks 的保护。您应该使用 -hostkey
开关验证主机密钥。
参见
KEX验证同理。 Plink 中的 KEX 没有开关。但是您可以在允许 diffie-hellman-group1-sha1
的情况下在注册表中创建临时存储会话。并在 Plink 中调用存储的会话。
$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
我成功地从下面的 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 本地主机上的整个脚本块但没有成功。我可能可以在单独的隐藏 PowerShell 会话中执行此代码。但是,这很可能会大大降低速度。
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
、powershell
和plink
运行并行,随心所欲。
正如@mklement0 所评论的那样,自从 PowerShell (Core) 6 以来,这已经得到改进。所以你可以这样做:
& { 'y'; sleep 2; 'y' } | plink ...
但是你不应该盲目接受主机密钥。你失去了对 man-in-the-middle attacks 的保护。您应该使用 -hostkey
开关验证主机密钥。
参见
KEX验证同理。 Plink 中的 KEX 没有开关。但是您可以在允许 diffie-hellman-group1-sha1
的情况下在注册表中创建临时存储会话。并在 Plink 中调用存储的会话。
$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