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

PowerShell脚本将SecureString作为帐户和sudo密码传递给Plink,powershell,sudo,plink,securestring,Powershell,Sudo,Plink,Securestring,我正在尝试使用Powershell,以便能够屏蔽密码,以便在远程Linux计算机上运行Plink命令,从而在/opt下给出前20个目录 它已连接,密码已正确屏蔽,但没有结果 写入输出显示汇编的命令字符串是正确的 但它只是挂起,不返回结果。可能是写输出结果与plink实际发送的结果不同吗 当我将写输出复制到cmd提示符并直接运行它时,它工作得很好,因为sudo,它仍然会再次请求密码,但它确实工作并返回预期结果 让它不需要sudo的第二个密码肯定是一个巨大的胜利,但现在我只需要弄清楚为什么它不返回结

我正在尝试使用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
c:\Tools\plink.exe-sshjohn@192.168.2.100-w System.Security.SecureString-t echo-e System.Security.SecureString | sudo du-ash/opt/*| sort-rh | head-n 20

这是行不通的

Plink仅将System.Security.SecureString视为文本字符串。因此,Plink将使用System.Security.SecureString作为密码。不是真正的密码。你所做的实际上是胡说八道。您不能使用PowerShell屏蔽密码。这毫无意义。您必须将真实密码传递给Plink。在命令行上指定密码时,无法屏蔽密码,至少不能


实际上是这样。

我在这个网站上的以下链接的帮助下解决了这个问题。 我没有正确解密密码,所以普林克可以读取它…谢谢我,普里克瑞尔

在我最初的尝试中,正在建立连接,但它没有真正正确地进行身份验证,而且不明显…会话刚刚挂起


PowerShell脚本如何帮助您屏蔽密码?请注意,您从不使用$Password为什么要执行两次$Command$arg1$arg2$arg3$arg4$arg5$arg6$arg7$arg8$arg10$arg11$arg12$arg13$arg14?如果您向我们展示$CommandOut值是什么,我们将更容易帮助您-该命令在Windows命令行上适用吗?=>这是PowerShell的问题吗?$CommandOut=$Command$arg1$arg2$arg3$arg4$arg5$arg6$arg7$arg8$arg10$arg11$arg12$arg13$arg14只是看看参数是如何组合的,下面是c:\Tools\plink.exe-ssh的外观john@192.168.2.100-w System.Security.SecureString-t echo-e System.Security.SecureString | sudo du-ash/opt/*| sort-rh | head-n 20是的,这是powershell调用plinkit似乎正在进行ssh连接,我看到会话正在登录,无法调试详细信息,但正在连接。。我相信这是在记忆中。。。ConvertTo-SecureString cmdlet将加密的标准字符串转换为安全字符串。它还可以将纯文本转换为安全字符串。它与ConvertFrom SecureString和Read Host一起使用。cmdlet创建的安全字符串可用于需要SecureString类型参数的cmdlet或函数。可以使用ConvertFrom-SecureString cmdlet将安全字符串转换回加密的标准字符串。哪个状态为System.Security.SecureString部分:请注意,输出与我们使用的Get Credential变量$MyCredential的输出非常相似。它将用户名显示为“MyUserName”,密码显示为“System.Security.SecureString”。这对于手动运行脚本非常有用,因为它有助于从脚本中删除密码,但对我们的自动化没有真正的帮助。停止浪费时间。没有链接可以帮助这里。这就是行不通。这都是你对文件的误解。SecureString是.NET唯一的东西。普林克永远不会明白当然,Plink正在进行SSH连接,但它不会成功进行身份验证,因为它试图使用System.Security.SecureString作为密码。Martin Prikryl,你是对的,当我进行连接时,它实际上没有正确进行身份验证。谢谢你的额外推送:看看这个网站上的另一篇文章就知道了。当我能再次找到它时,我会发布链接。这毫无意义。将字符串转换为SecureString仅仅将其转换回普通字符串是没有意义的。这只会使脚本复杂化,而不会增加任何安全性。使用P@ssw0rd马上-再一次,正如我已经写给你的:没有办法屏蔽密码[当通过Plink命令行传递密码时]-停止浪费你的时间。
$password = ConvertTo-SecureString 'P@ssw0rd' -AsPlainText -Force

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