Как организовать управление группой ПК: различия между версиями

Материал из IT в школе
Перейти к навигацииПерейти к поиску
Строка 1: Строка 1:




Строка 138: Строка 139:


В файл start.sh записаны скрипты инициализации ПК:<syntaxhighlight lang="bash">
В файл start.sh записаны скрипты инициализации ПК:<syntaxhighlight lang="bash">
#!/bin/bash


#start.sh





Версия 18:37, 19 февраля 2023



Установить veyon (централизованное управление компьютерным классом)
#!/bin/bash
apt-get -y install pip
pip install paramiko

https://os.mos.ru/git/MOS/mos-comp-kab-setup

Скачиваем, запускаем comp_kab_setup.py

Найти Linux ПК в сети

Поиск осуществляется по наличию открытых портов 22 (ssh) и 631 (cups)

#!/bin/bash

nmap -n --stats-every 1s -p 22,631 172.xx.xx.0/23 | grep -B 5 "631/tcp open" | grep -B 4 "22/tcp  open" | grep 172 | sed 's/Nmap scan report for //' | grep -v Nmap > hosts.txt

Здесь и далее hosts.txt - список адресов (или имен, если Вы уверены что ПК будут найдены по имени) компьютеров

Установить ключи для root доступа по ssh

Доступ по ssh c правами учетной записи администратора запрещен по умолчанию. Тем не менее доступ возможен по ключу. Это значит, что должен быть сгенерирован цифровой ключ (в нашем случае типа ed25519), состоящий из двух частей - открытой и закрытой. Открытую часть надо поместить в специальный файл на ПК, к которому осуществляетяся доступ. Открытая часть включает имя хоста. При подключении происходит сверка соотвествия открытой и закрытой части и имени подключаемого ПК, и при соответствии осуществляется доступ. Чтобы скопировать ключ нужно войти с правами root. Удаленно это не очень просто - комада su требует ввода пароля вручную. Приведенный скрипт решает проблему автоматизации копирования ключей.

перед запуском надо установить sshpass, запустив от root

apt-get -y install sshpass
#!/bin/bash
ssh-keygen -t ed25519
SSHKEY=`cat ${HOME}/.ssh/id_ed25519.pub`
ROOTPASS="12345678"
USER="user"
USERPASS="12345678"
for i in `cat hosts.txt`
do
(sleep 1;echo "${ROOTPASS}";sleep 1; echo "echo \"${SSHKEY}\" >> /root/.ssh/authorized_keys " ; echo exit; sleep 1; echo exit) | sshpass -p ${USERPASS} ssh -tt -oStrictHostKeyChecking=no ${USER}@${i} su -
done

Поменять пароли (или другая команда для группы ПК)

при наличии ssh доступа по ключу к root перед запуском надо установить sshpass, запустив от root

apt-get -y install sshpass
#!/bin/bash

USER="root"
USERPASS="12345678"
for i in $(cat hosts.txt)
do 
ssh -oStrictHostKeyChecking=no root@$i 'chpasswd <<<"${USER}:${USERPASS}"'
#сюда можно добавить и другие команды, например создать пользователя
#ssh root@$i useradd student
#изменять пароль можно только командой сhpasswd, так как команда passwd требует ввода пароля вручную
#ssh root@$i 'chpasswd <<<"student:student"'
#можно также установить нужные программы
#ssh root@$i apt-get -y install yandex-browser veyon spherum 
#ssh root@$i epm --auto play teams skype zoom
done

Как управлять всеми ПК сразу (при наличии сервера управления)

По просьбе, делюсь опытом администрирования ПК МОС. У меня два здания, в каждом имеется свой сервер на Linux (в моем случае ubuntu - просто сервер старше чем МОС, но конкретный дитрибутив не важен).

На каждом сервере 2 сетевые карты, одна смотрит грубо говоря в сеть Study (но подключено естественно проводом) с фиксированным адресом 172.ххх.ххх.16, Другая - в сеть панелей 10.xxx.xxx.26

Сервера маломощные, уровня i3 первого поколения. Два установлены для надежности(чтобы здания были независимы) . На них также работает samba и asterisk, а такжже запись с видеокамер компьютерных классов.

На всех ПК прописываем в кронтаб запуск скрипта onreboot.sh при загрузке.

Для этого запускаем от root crontab -e и добавляем туда С ПЕРЕВОДОМ СТРОКИ В КОНЦЕ (это важно)

@reboot /root/onreboot.sh

чтобы использовать нормальные редактор нужно сначала заменить в файле /etc/bashrc.d/editor.sh vim на mcedit Файл /root/onreboo.sh

#!/bin/bash

SCHOOL=`hostname | awk -F "-" '{print $1}' `
KORP=`hostname | awk -F "-" '{print $2}' `
TYPE=${SCHOOL:0:1}

if [ "${KORP}" == "1" ] ; then
 SERVER=172.xxx.xxx.xxx
 NET=172.xxx
 if [ "${TYPE}" == "p" ]; then
 SERVER=10.xxx.xxx
 NET=10.xxx.xxx
 fi
fi 
if [ "${KORP}" == "2" ] ; then
 SERVER=172.xxx.xxx.xxx
 NET=172.xxx
 if [ "${TYPE}" == "p" ]; then
 SERVER=10.xxx.xxx.xxx
 NET=10.xxx.xxx
 fi
fi
UP=`ifconfig  | grep -A2 ${NET} | grep UP`
while [ -z "${UP}" ] 
do
echo TEST UP
UP=`ifconfig  | grep -A2 ${NET} | grep UP`
sleep 10
done
PING=`ping -c 10 ${SERVER} | grep " 0% "`
while [ ! -z ${PING} ]
do
echo TEST PING
PING=`ping -c 10 ${SERVER} | grep " 0% "`
done
rm /tmp/start.sh
wget -O /tmp/start.sh http://${SERVER}/start.sh
bash /tmp/start.sh
while true
do
wget -O /tmp/reg.sh http://${SERVER}/reg.sh
bash /tmp/reg.sh
echo "wait 60"
sleep 60
done

Скрипт по hostname вычисляет номер корпуса и тип ПК (панель/ не панель) и по этой информации вычисляет адрес сервера в той сети к которой он подключен

Затем скрип ожидает поднятия сетевого интерфейса и появления устойчивого пинга на сервер.

Потом загружает с сервера файл start.sh и запускает его.

После этого периодически (каждые 60 сек ) загружает и запускает файл reg.sh

В файл reg sh я добавляю при необходимости неотложные команды (обычно он пуст)

В файл start.sh записаны скрипты инициализации ПК:

#!/bin/bash

#start.sh



set_mime()
{
#mime om libreofuice
if [ ! -f /etc/xdg/local/mimeapps.list ]; then
mkdir /etc/xdg/local
echo 'XDG_CONFIG_DIRS="/etc/xdg/local:$XDG_CONFIG_DIRS"' > /etc/profile.d/00-local.sh
chmod +x /etc/profile.d/00-local.sh
cp /etc/xdg/mos/mimeapps.list /etc/xdg/local/
sed -i '/^#.\+$/d'  /etc/xdg/local/mimeapps.list
sed -i 's/onlyoffice-desktopeditors.desktop;//g' /etc/xdg/local/mimeapps.list
sed -i 's/r7-office-desktopeditors.desktop;//g' /etc/xdg/local/mimeapps.list
sed -i '/^application\/vnd/  s/$/r7-office-desktopeditors.desktop;onlyoffice-desktopeditors.desktop;/' /etc/xdg/local/mimeapps.list
sed -i '/^text\/csv/  s/$/r7-office-desktopeditors.desktop;onlyoffice-desktopeditors.desktop;/' /etc/xdg/local/mimeapps.list
sed -i '/^application\/rtf/  s/$/r7-office-desktop;onlyoffice-desktopeditors.desktop;/' /etc/xdg/local/mimeapps.list
sed -i '/^application\/msword/  s/$/r7-office-desktop;onlyoffice-desktopeditors.desktop;/' /etc/xdg/local/mimeapps.list
fi
}



set_grub_timeout0()
{
#grub disable timeout
sed -i -r 's/^#*(GRUB_TIMEOUT=).*/GRUB_TIMEOUT=0/' /etc/sysconfig/grub2
sed -i -r 's/^#*(GRUB_HIDDEN_TIMEOUT=).*/GRUB_HIDDEN_TIMEOUT=$GRUB_TIMEOUT/' /etc/sysconfig/grub2
grub-mkconfig -o /boot/grub/grub.cfg
}

set_shutdown()
{
if [ -z "`crontab -l | grep shutdown`" ]; then
echo -e "@reboot /root/onreboot.sh\n0 22 * * * /sbin/shutdown now\n0 7 * * * /sbin/shutdown now\n" | crontab -u root -
fi
}




set_kde()
{

#set some flags
FD=`cat /home/${USR}/.config/plasma-org.kde.plasma.desktop-appletsrc | grep alphaSort`
if  [ "${FD}" == "" ]; then
sed -i '/^favoritesPortedToKAstats=.*/i alphaSort=true\nlimitDepth=true\nshowIconsRootLevel=true' /home/${USR}/.config/plasma-org.kde.plasma.desktop-appletsrc
fi

#отключение масштаба
if [ -z "`cat /home/${USR}/.config/kwinrc | grep 'zoomEnabled=false'`"  ]; then
echo -e "[Plugins]\nzoomEnabled=false\n" >>  /home/${USR}/.config/kwinrc 
fi

#отключить засыпание 
sed -i '/AC\]\[DPMS/,+2d' /home/${USR}/.config/powermanagementprofilesrc
sed -i '/AC\]\[DimDisp/,+2d' /home/${USR}/.config/powermanagementprofilesrc

#блокировка файлов настроек
cd /home/${USR}/.config/
for i in plasma-org.kde.plasma.desktop-appletsrc kdeglobals  powermanagementprofilesrc systemsettingsrc kcmfonts
do
if [ ! -z "${LOCK}" ] ; then
chown root:${USR} ${i} 
chmod 040 ${i}
else
chown ${USR}:${USR} ${i} 
chmod 644 ${i}
fi
done 

}

create_veyon_share()
{
#создать общую папку
echo -e "[Desktop Entry]\nIcon=folder-remote\nName=Задания\nType=Application\nExec=dolphin sftp://${USR}:648@${VEYON}/home/share" > "/home/${USR}/Рабочий стол/share.desktop"
chown ${USR}:${USR}  "/home/${USR}/Рабочий стол/share.desktop"
chmod 744 "/home/${USR}/Рабочий стол/share.desktop"
#создать каталог сдать работы
mkdir "/home/${USR}/Рабочий стол/Сдать работы"
chown ${USR}:${USR} "/home/${USR}/Рабочий стол/Сдать работы"
}




clean_wifi()
{
#удалить wifi соединения
rm /etc/NetworkManager/system-connections/Study.MOS.nmconnection
rm /etc/NetworkManager/system-connections/Study.nmconnection
}

setup_chromium()
{
#создать хромиум on desktop
echo -e "#!/usr/bin/env xdg-open\n[Desktop Entry]\nIcon=chromium\nName=Chromium\nType=Application\nExec=chromium" > "/home/${USR}/Рабочий стол/Chromium.desktop"
chown ${USR}:${USR}  "/home/${USR}/Рабочий стол/Chromium.desktop"
chmod 744 "/home/${USR}/Рабочий стол/Chromium.desktop"
#   Установка Chrome браузером по умолчанию
if [ ! -f /home/student/.config/mimeapps.list ]; then
    echo -e '#!/usr/bin/env xdg-open\n[Default Applications]\nx-scheme-handler/http=chromium\nx-scheme-handler/https=chromium'  > "/home/${USR}/.config/mimeapps.list"
    chown ${USR}:${USR} /home/${USR}/.config/mimeapps.list
else
    sed -i -r 's/(http=|https=).*/\1chromium/' "/home/${USR}/.config/mimeapps.list"
fi
}


clean()
{
CLN="${CLEAN} /home/teacher/default.png /root/upd.sh /home/${USR}/Рабочий__стол/Chromium home/${USR}/Рабочий_стол/Основы__работы__в__МОС.desktop /home/${USR}/Рабочий__стол/Основы__работы__в__МОС /home/${USR}/Рабочий__стол/yandex-browser.desktop /home/${USR}/Рабочий__стол/mosobrtv.desktop /home/${USR}/Рабочий__стол/Chromium"
for i in ${CLN}
do
NAME="${i//__/ /}"
echo DELETE $NAME
rm -f "${NAME}"
done 
}


check_repo()
{
#remove some repos
if [ -f /etc/apt/sources.list.d/alt.list ] || [ -f /etc/apt/sources.list.d/yandex.list ] || [ -f /etc/apt/sources.list.d/ipsl.list ] || [ -f /etc/apt/sources.list.d/heanet.list ]; then
rm  /etc/apt/sources.list.d/*
fi


if [ ! -z '`cat /etc/apt/sources.list.d/mos-base-repo.list | grep "#"`' ] || [ ! -f '/etc/apt/sources.list.d/mos-base-repo.list' ]; then
echo -e "rpm http://repo.os.mos.ru/a/p10/base/release x86_64 classic\nrpm http://repo.os.mos.ru/a/p10/base/release x86_64-i586 classic\nrpm http://repo.os.mos.ru/a/p10/base/release noarch classic\n" > /etc/apt/sources.list.d/mos-base-repo.list
fi


if [ ! -z '`cat /etc/apt/sources.list.d/mos-repo.list | grep "#"`' ] || [ ! -f '/etc/apt/sources.list.d/mos-repo.list' ]; then
echo -e "rpm http://repo.os.mos.ru/a/p10/mos/release x86_64 hasher\nrpm http://repo.os.mos.ru/a/p10/mos/release noarch hasher\nrpm http://repo.os.mos.ru/a/p10/mos/release x86_64-i586 hasher\n" > /etc/apt/sources.list.d/mos-repo.list
fi
}



update()
{
check_repo
remove-old-kernels -f
apt-get update 
apt-get -y dist-upgrade 
update-kernel -f 
apt-get clean
}



setup_wallpaper()
{
if [ ! -f  /etc/648.png ]; then
wget -O /etc/648.png http://${SERVER}/648.png 
fi
if [ -z "`cat /home/${USR}/.config/plasma-org.kde.plasma.desktop-appletsrc | grep 648.png`" ]; then
sed -i 's/^Image=.\+$/Image=\/etc\/648\.png/g' /home/${USR}/.config/plasma-org.kde.plasma.desktop-appletsrc
fi
}



setup_x11vnc()
{
if [ ! -f /root/vnc/passwd ]; then
/sbin/chkconfig x11vnc on
/sbin/service x11vnc start
mkdir /root/.vnc/
x11vnc --storepasswd password /root/.vnc/passwd
fi
}


setup_pkt()
{
remove-old-kernels -y
apt-get -y remove ${REMOVE}
for i in ${INSTALL}
do
echo INSTALL ${i} ?
if [ -z "`rpm -qa | grep  -e \"${i}-[0-9]\" `" ] ; then 
echo INSTALL ${i} !
apt-get -y install ${INSTALL}
else
echo ALREADY INSTALLED
fi
done

for i in ${INSTALLEPM}
do
echo INSALLEPM ${i} ?
if [ ! -f  "/usr/bin/${i}" ] ; then
echo INSALLEPM ${i} !
NAME="$(echo $i | tr '[A-Z]' '[a-z]')" 
epm play --auto ${NAME}
else 
echo ALREADY INSTALLED
fi
done
}


setup_timesync()
{
if [ -f /etc/systemd/timesyncd.conf ]; then
if [ -z "`cat /etc/systemd/timesyncd.conf | grep ${SERVER}`" ] ; then
echo "NTP=${SERVER}" >> /etc/systemd/timesyncd.conf
systemctl enable systemd-timesyncd
systemctl restart systemd-timesyncd
fi
fi
}







vbox_user()
{
USER="$1"

if [ -z "`cat /etc/group | grep vboxusers`" ] ;  then
return 
fi

if [ -z "`cat /etc/group | grep vboxusers | grep ${USER}`" ] ;  then
usermod -a -G vboxusers ${USER}
fi
}

setup_lo()
{
if [ ! -h /usr/bin/libreoffice ]; then
ln -s /opt/libreoffice7.5/program/soffice /usr/bin/libreoffice
fi

mv /usr/share/applications/libreoffice7.5-base.desktop /usr/share/applications/base.desktop
mv /usr/share/applications/libreoffice7.5-calc.desktop /usr/share/applications/calc.desktop
mv /usr/share/applications/libreoffice7.5-draw.desktop /usr/share/applications/draw.desktop
mv /usr/share/applications/libreoffice7.5-impress.desktop /usr/share/applications/impress.desktop
mv /usr/share/applications/libreoffice7.5-math.desktop /usr/share/applications/math.desktop
mv /usr/share/applications/libreoffice7.5-writer.desktop /usr/share/applications/writer.desktop
mv /usr/share/applications/libreoffice7.5-startcenter.desktop /usr/share/applications/startcenter.desktop
mv /usr/share/applications/libreoffice7.5-xsltfilter.desktop /usr/share/applications/xsltfilter.desktop



if [  -d /opt/libreoffice7.5 ]; then
return 
fi
cd /tmp
rm lo.tar.gz
wget http://${SERVER}/lo.tar.gz
tar xvf lo.tar.gz
apt-get -y install /tmp/RPMS/*.rpm
rm lo.tar.gz
rm -rf /tmp/RPMS/
for USR in ${USERS} 
do
rm -rf /home/${USR}/.config/.libreoffice
done
}


setup_bl()
{
if [  -d /opt/blender* ]; then
return 
fi
cd /opt
rm bl.tar.xz
wget http://${SERVER}/bl.tar.xz
tar xvf bl.tar.xz
rm bl.tar.xz
CAT="`ls /opt/ | grep blender`"
cp /opt/${CAT}/blender.desktop /usr/share/applications/blender.desktop
rm /usr/bin/blender
ln -s /opt/${CAT}/blender /usr/bin/blender
}

setup_panel()
{
echo "*****************************************"
echo "*****************PANEL*******************"
echo "*****************************************"

REMOVE="apt-indicator cheese"
INSTALL="yandex-browser-stable kde5-kamerka guvcview x11vnc-service"
EPM=""

update
setup_timesync
set_mime
setup_pkt
setup_x11vnc
set_shutdown

for USR in ${USERS}
do
echo user ${USR}
clean
set_kde
setup_wallpaper
#clean
CLEAN="/home/${USR}/.local/share/plasma_icons/catalogue.desktop /home/${USR}/.local/share/plasma_icons/r7-office-desktopeditors.desktop /home/${USR}/Рабочий__сто��/Общая__папка"
#start page
wget -O /etc/start_.html http://${SERVER}/start.html
if [ -f /etc/start_.html ] ; then
rm /etc/start.html
mv /etc/start_.html /etc/start.html
sed -i 's/^Exec=.\+$/Exec=chromium --enable-local-file-accesses \/etc\/start.html/g' /home/${USR}/.local/share/plasma_icons/chromium.desktop
fi
#set common folder
sed -i  /nas648/,/bookmark/d /home/${USR}/.local/share/user-places.xbel
TT=`cat /home/teacher/.local/share/user-places.xbel | grep "${SERVER}"`
if  [ "${TT}" == "" ]; then
echo -e "<bookmark href=\"smb://boards:boards@${SERVER}/boards\">\n<title>\nОбщая папка\n</title>\n</bookmark>" > /tmp/add.txt
sed -i '/<\/xbel>/{
r /tmp/add.txt
a <\/xbel>
d
}' /home/${USR}/.local/share/user-places.xbel
rm /tmp/add.txt
fi
done
}


setup_note()
{
echo "*****************************************"
echo "*****************NOTE********************"
echo "*****************************************"
REMOVE="apt-indicator cheese kernel-modules-e1000e-std-def LibreOffice-common blender openboard"
INSTALL="yandex-browser-stable kde5-kamerka xorg-96dpi guvcview x11vnc-service systemd-timesyncd"
INSTALLEPM="zoom teams skype sferum Telegram viber tamtam"
update
set_mime
setup_lo
setup_bl
setup_pkt
setup_x11vnc
setup_timesync
#hold hp
if [ -z "`cat /etc/apt/apt.conf.d/hold-hplip.conf | grep hplip`" ] ; then
echo 'RPM::Hold { ^hplip; };' > /etc/apt/apt.conf.d/hold-hplip.conf
fi
for USR in ${USERS} 
do
echo user ${USR}
#clean
#set_kde
done
}


setup_cc()
{
echo "****************************************"
echo "*****************CC*********************"
echo "****************************************"
REMOVE="apt-indicator cheese LibreOffice-common blender openboard"
INSTALL="yandex-browser-stable kde5-kamerka guvcview pinta virtualbox x11vnc-service systemd-timesyncd"
INSTALLEPM="zoom teams skype sferum Telegram viber tamtam"
update
set_mime
clean
setup_lo
setup_bl
setup_pkt
setup_x11vnc
setup_timesync
if [ ! -z "${TIMEOUT}" ]; then
set_grub_timeout0
fi
setup_wine
clean_wifi
set_shutdown
vbox_user student
vbox_user teacher
rm -rf /home/student/.config/.libreoffice

for USR in ${USERS} 
do
echo user ${USR}
set_kde
setup_chromium
create_veyon_share
setup_wallpaper
done
}




setup_other()
{
echo "****************************************"
echo "*****************OTHER******************"
echo "****************************************"
REMOVE="apt-indicator cheese LibreOffice-common blender"
INSTALL="yandex-browser-stable kde5-kamerka guvcview pinta virtualbox x11vnc-service systemd-timesyncd"
INSTALLEPM="zoom teams skype sferum Telegram viber tamtam"
update
set_mime
clean
setup_lo
setup_bl
setup_pkt
setup_x11vnc
setup_timesync


for USR in `ls /home/ | grep -v MOS.RU`
do
echo user ${USR}
set_kde
setup_chromium
done

}



HN=`hostname`
TYPE=${HN:0:1}
IN=(${HN//-/ })
CORP=${IN[1]}
CAB=${IN[2]}
COMP=${IN[3]}



if [ ${TYPE} == 'p' ] ; then
 USERS="teacher"
 if [ ${CORP} == "1" ] ; then
 SERVER=10.xxx.xxx.26
 setup_panel
 exit
 fi 
 if [ ${CORP} == "2" ] ; then
 SERVER=10.xxx.xxx.26
 setup_panel
 exit
 fi 
fi


if [ ${TYPE} == 'm' ] ; then
 LOCK=1
 USERS="student"
 if [ ${CORP} == "1" ] ; then
  SERVER="172.xxx.xxx.16"
  if [ ${CAB} == 'xx' ]; then
  TIMEOUT=0
  VEYON="mxxxx.local"
  setup_cc
  exit
  fi
  if [ ${CAB} == 'xx' ]; then
  TIMEROUT=0
  VEYON="mxxxx.local"
  setup_cc
  exit
  fi
  if [ ${CAB} == 'xx' ]; then
  USERS="student k10a k10b"
  VEYON="mxxxx.local"
  setup_cc
  exit
  fi
  if [ ${CAB} == '34a' ]; then
  VEYON="mxxxx.local"
  setup_cc
  exit
  fi
 fi
 if [ ${CORP} == "2" ] ; then
  SERVER="172.xx.xx.16"
  if [ ${CAB} == 'xx' ]; then
  TIMEOUT=0
  VEYON="mxxxx.local"
  setup_cc
  exit
  fi
  if [ ${CAB} == 'xx' ]; then
  TIMEOUT=0
  VEYON="mxxxx.local"
  setup_cc
  exit
  fi 
 fi
fi



if [ ${TYPE} == 'n' ] ; then
 USERS='user'
 if [ ${CORP} == "1" ] ; then
 SERVER="172.xx.xx.16"
 setup_note
 exit
 fi
 if [ ${CORP} == "2" ] ; then
 SERVER="172.xx.xx.16"
 setup_note
 exit
 fi
fi

setup_other