Вопрос или проблема
Я подключаюсь к хосту Windows и оттуда к нескольким виртуальным машинам с Linux. Я хочу изменить пароль на всех этих виртуальных машинах разом, так как мне нужно делать это каждые 30 дней. Я выбрал комбинацию PowerShell и plink для достижения этой цели, однако получаю ошибку. Может кто-то помочь исправить это или предложить другой альтернативный способ сделать то же самое.
# Файл с списком серверов
$ServerList = "C:\Users\seamless.aman\Desktop\server-list.txt"
# Учетные данные
$Username = "seamless.aman"
$CurrentPassword = "old_pass"
$NewPassword = "new_pass"
# Путь к plink.exe
$PlinkPath = "C:\Program Files\PuTTY\plink.exe"
# Цикл по каждому серверу
foreach ($Server in Get-Content $ServerList) {
Write-Host "Подключение к $Server..." -ForegroundColor Cyan
try {
# Временный файл команд
$CommandFile = "C:\Temp\command-$Server.txt"
"echo -e `"$CurrentPassword`n$NewPassword`n$NewPassword`" | passwd $Username" | Set-Content $CommandFile
# Выполнение plink с -m
& $PlinkPath -ssh -v -l $Username -pw $CurrentPassword $Server -m $CommandFile
Write-Host "Пароль успешно изменен на $Server." -ForegroundColor Green
} catch {
Write-Host "Не удалось изменить пароль на $Server: $($_.Exception.Message)" -ForegroundColor Red
}
}
Файл server-list.txt содержит IP-адрес виртуальной машины Linux. При запуске скрипта я получаю следующую ошибку:
PS C:\Users\seamless.aman\Desktop> .\change-password.ps1
At C:\Users\seamless.aman\Desktop\change-password.ps1:28 char:50
+ Write-Host "Не удалось изменить пароль на $Server: $($_.Except ...
+ ~~~~~~~~
Ссылка на переменную недействительна. ':' не был последован допустимым символом имени переменной. Рассмотрите возможность использования ${} для разделения имени.
+ CategoryInfo : ParserError: (:) [], ParseException
+ FullyQualifiedErrorId : InvalidVariableReferenceWithDrive
Примечание: Я совершенно новичок в PowerShell и воспользовался помощью ChatGPT для написания этого скрипта.
Ответ или решение
Для изменения пароля на нескольких серверах Linux с помощью PowerShell и Plink, важно правильно настроить скрипт и убедиться, что используемые команды и синтаксис корректны. Вот подробное пошаговое руководство по решению вашей задачи.
1. Подготовка файлов и директорий
Перед началом сценария убедитесь, что у вас есть следующие элементы:
- Список серверов: текстовый файл
server-list.txt
, который содержит IP-адреса или имена ваших Linux серверов (по одному в строке). - Plink: убедитесь, что вы можете запустить
plink.exe
из командной строки. Установите его на вашей Windows-машине.
2. Исправление синтаксических ошибок
Проблема, с которой вы столкнулись, связана с неправильным синтаксисом в строке Write-Host
. В PowerShell необходимо использовать синтаксис ${}
для обращения к переменным в тексте, когда они окружаются символами, которые могут смущать обработчик:
Write-Host "Failed to change password on $Server: $($_.Exception.Message)" -ForegroundColor Red
Следует изменить это на:
Write-Host "Failed to change password on ${Server}: $($_.Exception.Message)" -ForegroundColor Red
3. Полный скрипт
Вот исправленный и немного оптимизированный PowerShell скрипт для изменения пароля на нескольких серверах:
# Файл со списком серверов
$ServerList = "C:\Users\seamless.aman\Desktop\server-list.txt"
# Учетные данные
$Username = "seamless.aman"
$CurrentPassword = "old_pass"
$NewPassword = "new_pass"
# Путь к plink.exe
$PlinkPath = "C:\Program Files\PuTTY\plink.exe"
# Цикл по каждому серверу
foreach ($Server in Get-Content $ServerList) {
Write-Host "Connecting to ${Server}..." -ForegroundColor Cyan
try {
# Временный файл команд
$CommandFile = "C:\Temp\command-$Server.txt"
$CommandContent = "echo -e `"$CurrentPassword`n$NewPassword`n$NewPassword`" | passwd $Username"
Set-Content -Path $CommandFile -Value $CommandContent
# Выполнение plink с -m
& $PlinkPath -ssh -v -l $Username -pw $CurrentPassword $Server -m $CommandFile
Write-Host "Password changed successfully on ${Server}." -ForegroundColor Green
} catch {
Write-Host "Failed to change password on ${Server}: $($_.Exception.Message)" -ForegroundColor Red
}
}
4. Полезные советы
- Проверка прав: Убедитесь, что у вас есть необходимые права для изменения пароля на целевых серверах.
- Проверка соединения: Для диагностики ошибок подключения включите флаг
-v
(verbose) в командеplink
для получения более детальной информации. - Безопасность: Хранение паролей в открытом виде в скриптах не рекомендуется. Рассмотрите возможность использования безопасных хранилищ для паролей, таких как Windows Credential Manager или другие решения для управления секретами.
Заключение
Эта инструкция должна помочь вам успешно изменить пароли на нескольких серверах Linux с использованием PowerShell и Plink. Если у вас возникнут дополнительные вопросы или проблемы, обратитесь к документации PowerShell или Plink, или попросите помощника.