使用Powershell + plink.exe组合

时间:2017-02-27 19:39:27

标签: windows powershell ssh sudo putty

项目背景

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

我意识到工作环境的“质量”,如果你进一步阅读,请尝试将这个问题视为纯粹的技术问题,甚至可能是技术挑战(基本上不要问当前情况背后的政治:) )。

上下文

具有非常有限的工具集的Windows VM。仅限无法访问互联网且无法安装第三方任何内容(额外工具,库等)。

所以,我现有的东西是:

  • Putty (包括plink.exe作为命令行SSH客户端)
  • Powershell 2.0

使用这些工具我想在大多数情况下自动化一个非常严格的SSH工作流程:

    使用个人帐户
  • 基于密码的SSH登录(不允许使用SSH密钥)

  • 只有sudo su - application_account 才能访问应用程序帐户(无权访问/ etc / sudoers,无权访问其他sudoers命令,我只能su到应用程序帐户)

  • 脚本必须提示每次执行的密码

我使用Python + Fabric +快速自动化进行了自动化设置,几乎可以完成我想要的任务。不幸的是,由于各种原因,此设置位于“灰色区域”,可能会被列入黑名单。

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

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

重定向stdin并发送一系列命令,包括响应这样的提示:

$process.StandardInput.WriteLine($password)

或使用heredocs发送密码:

A)

# 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执行命令列表的文件。

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

...

还有很多人。

如果我重定向所有输入/输出,我要么无法控制进程(如果我重定向进程锁定并且调试非常困难,因为我在VM上没有大量工具而我看不到为什么它会锁定。

或者sudo显然只是不接受密码输入,作为最后的死亡步骤。

在这种限制性环境中控制plink.exe真的不可能吗?我必须注意,如果无法访问应用程序帐户,就无法实现自动化(即很久以前就已经实现了简单的个人SSH用户自动化,并且还不够)。

我对使用Powershell或Windows上直接提供的任何其他工具的可能解决方案感兴趣。基本上我怎么能理解为什么这个过程陷入僵局。或者,任何想法,实际上,不涉及在任何地方更改管理设置或安装额外的工具/应用程序/库。

为了增加伤害,我的密码包含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)

1 个答案:

答案 0 :(得分:1)

可能是{E-1}}发出的Windows EOL序列,它与$("td").each(function() { $(this).html(function(index, text) { return text.replace(/[^0-9]/g, '').slice(0,7); }); }); 不能很好地匹配。请尝试明确使用CR(* nix EOL):

WriteLine