Использование зашифрованного пароля к SSH для нескольких серверов с использованием Plink - PullRequest
2 голосов
/ 26 июня 2019

Код моего пакетного файла требует запуска некоторых команд оболочки на нескольких серверах с использованием SSH. Для этого я использую Plink из цикла for.

Я не хочу вводить пароль в виде простого текста в командную строку Plink, используя -pw. Вместо этого из-за соображений безопасности я хочу использовать шифрование пароля для своего пароля и сохранить пароль в отдельном текстовом файле.

Я пытался использовать 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

Я ожидаю, что пакетный скрипт будет работать на всех серверах с использованием зашифрованного пароля. Но с текущим кодом вывод отображается с использованием простого пароля.

1 Ответ

1 голос
/ 26 июня 2019

Этого трудно добиться с помощью простого пакетного файла.

Но вместо этого вы можете использовать PowerShell с его ConvertTo-SecureString и ConvertFrom-SecureString командлетами.

Для шифрования пароля используйте:

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"
}

На основе:


Хотя я должен повторить, что использование аутентификации с помощью открытого ключа было бы лучшим решением.

...