PowerShell脚本将SecureString作为帐户和sudo密码传递给Plink

时间:2018-09-21 04:33:41

标签: powershell sudo plink securestring

我正在尝试使用Powershell(以便能够屏蔽密码)在远程Linux机器上运行Plink命令,以在/ opt ...下给出前20个目录。

它已连接,密码已正确屏蔽但没有结果 写输出显示汇编的命令字符串正确...

,但它似乎挂起并且不返回结果。可能是写输出结果与plink实际发送的结果不同吗?

当我将写输出复制到cmd提示符并直接运行它时,它可以工作(而且由于sudo,它仍然再次请求密码,但它确实可以工作并返回预期结果...

让它不需要sudo的第二个密码肯定会是一个很大的胜利,但是现在我只需要弄清楚为什么它不返回结果即可。

关于使用多个参数的说明,我发现以这种方式组装起来更容易;)

$UserName = Read-Host -Prompt "What is your username?"
$SecPassword = Read-host "what is your password?" -AsSecureString
$ServerName = Read-Host -Prompt "What is the server name?"
$Password = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecPassword))
$Command = "C:\Tools\plink.exe"
$arg1  =  '-ssh'
$arg2 = $UserName+'@'+$ServerName
$arg3 = '-pw'
$arg4 = $SecPassword 
$arg5 = '-t'
$arg6 = 'echo' 
$arg7 =  '-e'
$arg8 = $SecPassword
$arg10 = ' | ' 
$arg11 = 'sudo du -aSh /opt/*'
$arg12 = ' | '
$arg13 = 'sort -rh'+' | '
$arg14 = 'head -n 20'
$CommandOut = "$Command $arg1 $arg2 $arg3 $arg4 $arg5 $arg6 $arg7 $arg8 $arg10 $arg11 $arg12 $arg13 $arg14"
Write-Output $CommandOut
& $Command $arg1 $arg2 $arg3 $arg4 $arg5 $arg6 $arg7 $arg8 $arg10 $arg11 $arg12 $arg13 $arg14

2 个答案:

答案 0 :(得分:0)

  

c:\ Tools \ plink.exe -ssh john@192.168.2.100 -w System.Security.SecureString -t echo -e System.Security.SecureString | sudo du -ash / opt / * |排序-rh |头-n 20

这永远行不通。

Plink仅将System.Security.SecureString视为文字字符串。因此,Plink将使用“ System.Security.SecureString”作为密码。不是真实的密码。你在做什么实际上是胡说八道。您不能使用PowerShell “屏蔽密码” 。这是没有意义的。您必须将真实密码传递给Plink。没有办法“屏蔽”密码(至少在命令行中没有指定)。

这实际上是XY question

答案 1 :(得分:-1)

我已解决此问题,借助于此站点上的以下链接。 我没有正确解密密码,因此Plink可以读取它……(感谢M Prikryl)

在我最初的尝试中,建立了连接,但并没有真正正确地进行身份验证,这也并不明显……会话刚刚挂起。.

PowerShell - Decode System.Security.SecureString to readable password

$password = ConvertTo-SecureString 'P@ssw0rd' -AsPlainText -Force

$Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($password)
$result = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($Ptr)
$result