无法使用 Powershell + plink.exe 组合将密码传递给 sudo su - 用户名
Cannot pass password to sudo su - username using Powershell + plink.exe combination
项目背景
我目前在一个非常受限的工作环境中工作。我知道涉及 SSH 的所有良好实践:密钥、ssh-agent 等,不幸的是,出于各种原因,我现在真的不想进入,我被迫在所提供的非常严格的环境中工作。
我意识到工作环境的"quality",如果您进一步阅读,请尝试将此问题视为纯技术问题,甚至可能是技术挑战(基本上不要问背后的政治)目前情况:) ) .
上下文:
一个 Windows 虚拟机,提供的工具非常有限。仅限于无法访问 Internet 且未获准安装第三方任何东西(额外工具、库等)。
所以,我可用的东西是:
- Putty(包括 plink.exe 作为命令行 SSH 客户端)
- 功率shell 2.0
使用这些工具,我想自动化一个非常严格的 SSH 工作流程,大部分时间看起来像这样:
基于密码的 SSH 登录 使用个人帐户(不允许使用 SSH 密钥)
仅 sudo su - application_account 访问应用程序帐户(无法访问 /etc/sudoers,无法访问其他 sudoers 命令,我只能su到申请账号)
脚本必须在每次执行时提示输入密码
我通过 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"))
项目背景
我目前在一个非常受限的工作环境中工作。我知道涉及 SSH 的所有良好实践:密钥、ssh-agent 等,不幸的是,出于各种原因,我现在真的不想进入,我被迫在所提供的非常严格的环境中工作。
我意识到工作环境的"quality",如果您进一步阅读,请尝试将此问题视为纯技术问题,甚至可能是技术挑战(基本上不要问背后的政治)目前情况:) ) .
上下文:
一个 Windows 虚拟机,提供的工具非常有限。仅限于无法访问 Internet 且未获准安装第三方任何东西(额外工具、库等)。
所以,我可用的东西是:
- Putty(包括 plink.exe 作为命令行 SSH 客户端)
- 功率shell 2.0
使用这些工具,我想自动化一个非常严格的 SSH 工作流程,大部分时间看起来像这样:
基于密码的 SSH 登录 使用个人帐户(不允许使用 SSH 密钥)
仅 sudo su - application_account 访问应用程序帐户(无法访问 /etc/sudoers,无法访问其他 sudoers 命令,我只能su到申请账号)
脚本必须在每次执行时提示输入密码
我通过 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"))