Использование зашифрованного пароля для SSH на несколько серверов с использованием Plink

Мой код пакетного файла требует запуска некоторых команд оболочки на нескольких серверах с использованием 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

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


person sakki    schedule 26.06.2019    source источник
comment
Вам не нужно генерировать новую пару ключей для каждого сервера. Вы можете использовать тот же ключ (поскольку вы все равно используете тот же пароль).   -  person Martin Prikryl    schedule 26.06.2019
comment
Спасибо за помощь @MartinPrikryl, но у меня нет прав на беспарольные подключения с сервера Windows ко всем компьютерам Unix.   -  person sakki    schedule 26.06.2019


Ответы (1)


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

Но вместо этого вы можете использовать PowerShell с его ConvertTo-SecureString< /a> и командлеты 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"
}

В PowerShell 7 вы можете упростить код до:

$encrypted = ConvertTo-SecureString(Get-Content ".\encryptedpassword.txt")
$password = ConvertFrom-SecureString -SecureString $encrypted -AsPlainText
# ...

На основе:


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

person Martin Prikryl    schedule 26.06.2019
comment
Спасибо @MartinPrikryl !! У меня с таким подходом все сработало. - person sakki; 27.06.2019