我目前正在一个非常严格的工作环境中工作。我知道涉及SSH的所有良好实践:密钥,ssh-agent等,遗憾的是由于各种原因我现在不想进入,我被迫在非常严格的环境中工作。
我意识到工作环境的“质量”,如果你进一步阅读,请尝试将这个问题视为纯粹的技术问题,甚至可能是技术挑战(基本上不要问当前情况背后的政治:) )。
具有非常有限的工具集的Windows VM。仅限无法访问互联网且无法安装第三方任何内容(额外工具,库等)。
所以,我现有的东西是:
使用这些工具我想在大多数情况下自动化一个非常严格的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)
答案 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