使用 Plink 使用加密密码 SSH 到多台服务器
Using encrypted password to SSH to multiple servers using Plink
我的批处理文件代码需要使用 SSH 在多个服务器上 运行 一些 shell 命令。为此,我使用 for
循环中的 Plink。
我不想使用 -pw
向 Plink 命令行输入明文密码。相反,出于安全考虑,我想对我的密码使用密码加密并将密码存储到单独的文本文件中。
我尝试使用 sshpass
,但不支持批量使用。作为对 运行 的请求,代码将在多个服务器上,所以我不想为每个服务器生成 SSH 密钥对,因为环境中的数百个服务器不可能。
@echo off
for /f "delims=" %%a in (path\to\servers.txt) DO (
plink -v -ssh user@%%a -pw MY_PASSWORD echo %%a ; cat /path/to/config_file
)
pause
我希望批处理脚本在所有使用加密密码的服务器上 运行。但是使用当前代码,输出使用纯密码显示。
用普通的批处理文件很难做到这一点。
但您可以使用 PowerShell 及其 ConvertTo-SecureString
and ConvertFrom-SecureString
cmdlet。
要加密密码,请使用:
Read-Host -AsSecureString | ConvertFrom-SecureString
键入密码并将输出保存到文件 (encryptedpassword.txt
)。
要使用加密密码,请使用:
$encrypted = ConvertTo-SecureString(Get-Content ".\encryptedpassword.txt")
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($encrypted)
$password = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
foreach ($hostname in (Get-Content ".\servers.txt"))
{
.\plink user@$hostname -pw "$password"
}
在 PowerShell 7 中,您可以将代码简化为:
$encrypted = ConvertTo-SecureString(Get-Content ".\encryptedpassword.txt")
$password = ConvertFrom-SecureString -SecureString $encrypted -AsPlainText
# ...
基于:
尽管我必须重复,使用 public 密钥身份验证是更好的解决方案。
我的批处理文件代码需要使用 SSH 在多个服务器上 运行 一些 shell 命令。为此,我使用 for
循环中的 Plink。
我不想使用 -pw
向 Plink 命令行输入明文密码。相反,出于安全考虑,我想对我的密码使用密码加密并将密码存储到单独的文本文件中。
我尝试使用 sshpass
,但不支持批量使用。作为对 运行 的请求,代码将在多个服务器上,所以我不想为每个服务器生成 SSH 密钥对,因为环境中的数百个服务器不可能。
@echo off
for /f "delims=" %%a in (path\to\servers.txt) DO (
plink -v -ssh user@%%a -pw MY_PASSWORD echo %%a ; cat /path/to/config_file
)
pause
我希望批处理脚本在所有使用加密密码的服务器上 运行。但是使用当前代码,输出使用纯密码显示。
用普通的批处理文件很难做到这一点。
但您可以使用 PowerShell 及其 ConvertTo-SecureString
and ConvertFrom-SecureString
cmdlet。
要加密密码,请使用:
Read-Host -AsSecureString | ConvertFrom-SecureString
键入密码并将输出保存到文件 (encryptedpassword.txt
)。
要使用加密密码,请使用:
$encrypted = ConvertTo-SecureString(Get-Content ".\encryptedpassword.txt")
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($encrypted)
$password = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
foreach ($hostname in (Get-Content ".\servers.txt"))
{
.\plink user@$hostname -pw "$password"
}
在 PowerShell 7 中,您可以将代码简化为:
$encrypted = ConvertTo-SecureString(Get-Content ".\encryptedpassword.txt")
$password = ConvertFrom-SecureString -SecureString $encrypted -AsPlainText
# ...
基于:
尽管我必须重复,使用 public 密钥身份验证是更好的解决方案。