无法使用 Powershell + plink.exe 组合将密码传递给 sudo su - 用户名

Cannot pass password to sudo su - username using Powershell + plink.exe combination

项目背景

我目前在一个非常受限的工作环境中工作。我知道涉及 SSH 的所有良好实践:密钥、ssh-agent 等,不幸的是,出于各种原因,我现在真的不想进入,我被迫在所提供的非常严格的环境中工作。

我意识到工作环境的"quality",如果您进一步阅读,请尝试将此问题视为纯技术问题,甚至可能是技术挑战(基本上不要问背后的政治)目前情况:) ) .


上下文:

一个 Windows 虚拟机,提供的工具非常有限。仅限于无法访问 Internet 且未获准安装第三方任何东西(额外工具、库等)。

所以,我可用的东西是:


使用这些工具,我想自动化一个非常严格的 SSH 工作流程,大部分时间看起来像这样:

我通过 Python + Fabric + 提示自动化得到了一个工作自动化设置,它几乎完成了我想要的一切。不幸的是,由于各种原因,此设置在 "gray area" 中,并且可能被列入黑名单。

所以现在我尝试只使用 VM 中可用的工具,目前是 Powershell + plink.exe。不幸的是,我似乎无法进入自动化的最后一步,运行 sudo su - application_account.

我已经尝试了所有我能想到的方法,几乎​​所有的方法都是基于使用 System.Diagnostics.Process 启动 plink.exe 然后:

重定向标准输入并发送一系列命令,包括响应如下提示:

$process.StandardInput.WriteLine($password)

或使用 heredocs 发送密码:

一)

# One-line heredoc.
echo $password | sudo su - application_account<<< ls

b)

# Multi-line heredoc.
echo $password | sudo -S su - <<END
ls
END

c) 或涉及 sudo 参数的几乎任何组合,例如 -k、-S、heredoc 格式等

或者使用 plink.exe 的 -m 参数创建一个包含命令列表的文件,包括 sudo su heredoc 执行。

或尝试使用基于事件的输入。

...

还有很多很多其他的。

如果我重定向所有 input/output,我要么无法控制进程(如果我重定向进程锁和调试真的很难,因为我在 VM 上没有大量工具,而且我看不出它为什么被锁定)。

或者 sudo 干脆不接受密码输入,作为最后的致命一击。

在如此受限的情况下真的无法控制plink.exe吗?我必须指出,如果无法访问应用程序帐户自动化是不可能的(即简单的个人 SSH 用户自动化是很久以前实现的,但还不够)。

我对使用 Powershell 或 Windows 直接附带的任何其他工具的可能解决方案感兴趣,建议调试设置。基本上我怎么能看到进程死锁的原因。或者任何想法,真的,不涉及在任何地方更改管理设置或安装额外的 tools/apps/libraries.

雪上加霜的是,我的密码包含 shell 似乎不喜欢的特殊字符(我认为)。在 Powershell/bash?

中转义它们有什么建议吗?

编辑 - 我现在使用的代码:

$procInfo = New-Object System.Diagnostics.ProcessStartInfo
$procInfo.RedirectStandardInput = $true
$procInfo.FileName="C:\Tools\PuTTY\plink.exe"
$procInfo.Arguments = "-t $sshHost"
$procInfo.UseShellExecute = $false

$process = New-Object System.Diagnostics.Process
$process.StartInfo = $procInfo
[void]$process.Start()

Start-Sleep -m 1000
$process.StandardInput.WriteLine($sshUser)
Start-Sleep -m 1000
$process.StandardInput.WriteLine($password)
Start-Sleep -m 1000
$process.StandardInput.WriteLine("sudo su - $applicationUser")
Start-Sleep -m 5000
$process.StandardInput.WriteLine($password)

可能是 WriteLine 发出的 Windows EOL 序列不能很好地与 sudo 配合使用。尝试明确使用 CR(*nix EOL):

$process.StandardInput.Write("sudo su - $applicationUser`n")
$process.StandardInput.Write(($password + "`n"))