вторник, 2 сентября 2008 г.

Удобная смена паролей для cPanel'ных пользователей

Итак, есть некоторое количество cPanel'ных хостинговых серверов, есть некий сервер который имеет доступ на каждый из сипанельных серверов по SSH на любой IP без пароля (по ключу или по хосту).

Надо легко и просто из консоли менять пароли для клиентов.

Дано два скрипта:
chpass.sh - лежит на основном сервере, NOC
rchpass.sh лежит на каждом хостинговом сервере в /sbin/

Первый скрипт принимает в качестве параметра домен, логинится по этому домену на хостинговый сервер, сначала смотрит какому логину нужно менять пароль и переспрашивает все ли верно. Скрипту нужно ответить yes, иначе выполнение прервется.
Если подтверждение получено, то удаленный скрипт с помощью стандартных сипанельных скриптов меняет пароль (так как это делает сама сипанель через WHM) и возвращает текст который можно сразу copy/paste'ить в письмо.

Рекомендую прочесть комментарии, там описано как это все происходит. Теоретически можно использовать непосредственно rchpass.sh чтобы менять пароль из консоли прямо на сервере, если у вас он только один.

Требования к скрипту:
1. На NOC должен стоять pwgen
2. Юзер под которым мы логинимся на хостинговый сервер должен иметь беспарольное sudo на некоторые сипанельные скрипты

Первый, основной скрипт


#!/bin/bash

####################################################################
# #
# chpass.sh v1.2 (CSX, 1 September 2008) #
# #
# http://support24x7.blogspot.com/ #
# #
# Главная часть скрипта для смены пароля на хостинговых серверах. #
# Вторая часть должна лежать на хостинговых серверах #
# /sbin/rchpass.sh. #
# #
# Скрипт в качестве опции принимает имя домена, логинится туда, #
# куда резолвится домен с NOC'а, и запускает там удаленный скрипт, #
# который меняет все пароли и возвращает текст для письма клиенту. #
# #
# Для изменения пароля используются стандартные скрипты cPanel. #
# #
####################################################################

# Если нет опций
if [ -z "$1" ]
then
echo "Use: chpass.sh <domain>"
exit 0
fi

# Если опций более одной
if [ "$2" ]
then
echo "Only one argument is allowed"
exit 0
fi

domain=$1

# Изменяя первый параметр мы можем изменять длину пароля
pass=`pwgen 8 1`

echo "Domain: $domain"

# Запускаем удаленный скрипт /home/tech/bin/cdpass.sh с параметром test в качестве второй опции,
# так он отдаст нам имя пользователя и спросит разрешения на смену пароля.
# Такой скрипт должен лежать на всех хостинговых серверах.
echo "/home/tech/bin/cdpass.sh $domain test"|ssh $domain 2> /dev/null || `echo "Can't connect to host"; exit 0`
echo ''
echo -n "Change password [yes/NO]: "
read resp
echo ""
if [ "$resp" != "yes" ]
then
echo 'OK. Stoped'
exit 0
fi

# Если разрешение на смену пароля получено то запускаем удаленный скрипт и меняем пароль.
echo "/sbin/rchpass.sh $domain $pass"|ssh $domain 2> /dev/null || `echo "Can't connect to host"; exit 0`

# Пишем в лог дату и сообщение о том для какого домена был сменен пароль и на какой.
# Разумеется, это очень несекьюрно, поэтому по-умолчанию закомментировано
# ---- logging ----
# logdate=`date "+[%d/%m/%y %T] "`
# echo -n "$logdate" >> /var/log/chpass.log
# echo -n "Password for domain $domain changed to $pass" >> /var/log/chpass.log
# echo '' >> /var/log/chpass.log
# ---- logging ----

# Если видно это сообщение, значит все прошло хорошо.
echo "Done"


Второй скрипт, который собственно делает всю работу


#!/bin/bash

####################################################################
# #
# rchpass.sh v1.2 (CSX, 1 September 2008) #
# #
# http://support24x7.blogspot.com/ #
# #
# Вторая часть скрипта для смены пароля на хостинговых серверах. #
# Первая часть должни лежать на NOC сервере #
# #
# Скрипт в качестве первой опции принимает имя домена, в качестве #
# второй опции пароль или слово test. Если вторая опция не test, #
# то скрипт меняет пароль для хостинг-аккаунта владельца домена и #
# возвращает текст для письма клиенту. Если вторая опция test, то #
# возвращает логин владельца домена и завершается. #
# #
# Для изменения пароля используются стандартные скрипты cPanel. #
# #
####################################################################

# Если не две опции
if [ -z "$1" ] || [ -z "$2" ]
then
echo "empty"
exit 0
fi

# Если вторая опция test выводим логин владельца домена и завершаем работу
if [ "$2" = "test" ]
then
ddomain=$1
usrname=`sudo /scripts/whoowns $ddomain`
echo -n "Username: "
echo $usrname
exit 0
fi

ddomain=$1
ppass=$2

usrname=`sudo /scripts/whoowns $ddomain`
echo -n "Username:"
echo $usrname

# Этот сипанельный скрипт меняет UNIX пароль
sudo /scripts/chpass $usrname $ppass

# Этот скрипт меняет пароль для базы данных у cPanel'ного логина
# (используется, например, для доступа в phpMyAdmin)
sudo /scripts/mysqlpasswd $usrname $ppass && echo "Пароль для MySQL изменен"

# Этот скрипт синхронизирует UNIX пароль с паролями в настройках FTP сервера
sudo /usr/local/cpanel/bin/ftpupdate $usrname

echo ""
echo "---------------------------------------------------------------------------------"
echo "Здравствуйте!"
echo ""
echo "Пароль для Вашего сайта изменен!"
echo ""
echo "Новые данные:"
echo ""
echo "cPanel "
echo "Ссылка: https://$ddomain:2083"
echo "Логин: $usrname"
echo "Пароль: $ppass"
echo ""
echo "FTP"
echo "Ссылка: ftp://$ddomain"
echo "Логин: $usrname"
echo "Пароль: $ppass"
echo ""
echo "Любые другие настройки Вы можете изменить самостоятельно через cPanel."
echo "Пожалуйста, обратите внимание, что для доступа к cPanel у Вас должен быть открыт порт 2083 в файерволле. Для доступа к FTP порт 21."
echo ""
echo "Спасибо."
echo "---------------------------------------------------------------------------------"

Буду рад сообщениям обо всех замеченных ошибках.

Комментариев нет: