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

Материал из IT в школе
Перейти к навигацииПерейти к поиску
 
(не показано 20 промежуточных версий этого же участника)
Строка 1: Строка 1:




Установить veyon (централизованное управление компьютерным классом)


=====Установить veyon (централизованное управление компьютерным классом)=====
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
#!/bin/bash
#!/bin/bash
Строка 14: Строка 12:


Скачиваем, запускаем comp_kab_setup.py
Скачиваем, запускаем comp_kab_setup.py
Альтернатиыный вариант для ТОЛЬКО для установки veyon на MOS12
также заполняет поле макадреса, что дает возможность использоват WOL<syntaxhighlight lang="bash">
sudo dnf in comp-cab-setup
</syntaxhighlight>
потом запустить comp-cab-setup
или
<syntaxhighlight lang="bash">
#!/bin/bash
#настройка veyon запуск от root (вход от root без пароля root: "sudo su -" ) на компе учителя
# должен быть файл /root/hosts.txt со списком имен компов c расширением local вида
# m648-2-119-1.local
#все компы учеников должны быть в сети (проверки этого нет)
# на компах учеников должны быть пользователи student
# на компе учителя пользователь teacher, вход в veyon
#осуществляется из под него и с его паролем (пользователь должен иметь непустой пароль!)
#название кабинета
CAB=41
#пользователь с правами на sudo на компе ученика
USER=admin
#пароль пользователя с правами на sudo на компе ученика
USERPASS=""
config_teacher()
{
if [ ! -f ${HOME}/.ssh/id_ed25519.pub ]; then
ssh-keygen -f ${HOME}/.ssh/id_ed25519 -q -t ed25519 -N ""
fi
rm ${HOME}/myconfig.json
rm ${HOME}/teacher_public_key.pem
dnf -y install veyon sshpass
veyon-cli authkeys delete teacher/private;
veyon-cli authkeys delete teacher/public;
veyon-cli authkeys create teacher;
veyon-cli authkeys setaccessgroup teacher/private teacher;
veyon-cli authkeys export teacher/public ${HOME}/teacher_public_key.pem;
veyon-cli config set Authentication/Method 1
veyon-cli config set NetworkObjectDirectory/Plugin {14bacaaa-ebe5-449c-b881-5b382f952571}
veyon-cli networkobjects clear
veyon-cli networkobjects add location ${CAB};
for i in $(cat ${HOME}/hosts.txt);
do
ping -c 1 $i > /dev/null
MAC=`arp $i | grep -v dress  | awk '{print $3}'`
veyon-cli networkobjects add computer $i $i ${MAC} ${CAB};
done;
veyon-cli config export ${HOME}/myconfig.json;
veyon-cli service restart
}
config_student()
{
echo IP ${IP}
SSHKEY=`cat ${HOME}/.ssh/id_ed25519.pub`
ANS=`sshpass -p 1 ssh -l root ${IP} echo accessok`
if [ -z "${ANS}" ]; then
(sleep 1;echo "${USERPASS}";sleep 1; echo "echo \"${SSHKEY}\" >> ${HOME}/.ssh/authorized_keys " ; echo exit; sleep 1; echo exit) | sshpass -p ${USERPASS} ssh -tt -oStrictHostKeyChecking=no ${USER}@${IP} sudo su
fi
scp ${HOME}/teacher_public_key.pem root@${IP}:${HOME}/
scp ${HOME}/myconfig.json root@${IP}:${HOME}/
ssh -l root ${IP} dnf -y install veyon-core
ssh -l root ${IP} veyon-cli authkeys delete teacher/public;
ssh -l root ${IP} veyon-cli authkeys import teacher/public ${HOME}/teacher_public_key.pem
ssh -l root ${IP} veyon-cli config import ${HOME}/myconfig.json
ssh -l root ${IP} veyon-cli service restart
}
config_teacher
for i in $(cat ${HOME}/hosts.txt);
do
IP=${i}
config_student
done;
reboot
</syntaxhighlight>
=== Найти Linux ПК в сети ===
=== Найти Linux ПК в сети ===


Строка 25: Строка 107:


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


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


=== Как управлять всеми ПК сразу (при наличии сервера управления) ===
=== Как управлять всеми ПК сразу (при наличии сервера управления) ===
По просьбе, делюсь опытом администрирования ПК МОС. У меня два здания, в каждом имеется свой сервер на Linux (в моем случае ubuntu - просто сервер старше чем МОС, но конкретный дитрибутив не важен).
https://os.mos.ru/git/andreyka648/adminka
 
На каждом сервере 2 сетевые карты, одна смотрит грубо говоря в сеть Study (но подключено естественно проводом) с фиксированным адресом 172.ххх.ххх.16, Другая - в сеть панелей 10.xxx.xxx.26
 
Сервера маломощные, уровня i3 первого поколения. Два установлены для надежности(чтобы здания были независимы) . На них также работает samba и asterisk, а такжже запись с видеокамер компьютерных классов.
 
На всех ПК прописываем в кронтаб запуск скрипта '''onreboot.sh''' при загрузке.
 
Для этого запускаем от root '''crontab -e''' и добавляем туда С ПЕРЕВОДОМ СТРОКИ В КОНЦЕ (это важно)<syntaxhighlight lang="bash">
@reboot /root/onreboot.sh
 
</syntaxhighlight>чтобы использовать нормальные редактор нужно сначала заменить в файле /etc/bashrc.d/editor.sh vim на mcedit
 
Файл /root/onreboot.sh
 
В приведенной версии файл рассчитан не 2 корпуса.<syntaxhighlight lang="bash">
#!/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}/index.php?start=`hostname`
bash /tmp/start.sh
while true
do
wget -O /tmp/reg.sh http://${SERVER}/index.php?reg=`hostname`
bash /tmp/reg.sh
echo "wait 60"
sleep 60
done
</syntaxhighlight>Данный скрипт по hostname вычисляет номер корпуса и тип ПК (панель/ не панель) и по этой информации вычисляет адрес сервера в той сети к которой он подключен
 
Затем скрип ожидает поднятия сетевого интерфейса  и появления устойчивого пинга на сервер.
 
Потом загружает с сервера файл start.sh через скрипт index.php и запускает его.
 
После этого периодически (каждые 60 сек ) загружает и запускает файл reg.sh
 
В файл reg sh я добавляю при необходимости неотложные команды (обычно он пуст)
 
В файл start.sh записаны скрипты инициализации ПК:
 
Ниже приведен пример файла инициализации. ЭТО ПРИМЕР. ОБЯЗАТЕЛЬНО РАЗБЕРИТЕСЬ  ЧТО ТАМ К ЧЕМУ ПЕРЕД ИСПОЛЬЗОВАНИЕМ. в конце концов самое важное - уметь вносить в него изменения в случае если чтото понадобится. 
 
Я стремился создать файл, который САМ НАСТРАИВАЕТ ПК по максимуму от состояния свежеустановленной системы. Возможно не все еще готово, привожу файл как есть. 
 
Возможно Вам не надо инициализировать систему с нуля , тогда файл может быть сильно сокращен. В него Вы будете вписывать только необходимые текущие изменения и удалять их как только они внесены.  <syntaxhighlight lang="bash">
#!/bin/bash
 
#start.sh
 
 
#насройка системы запуска по расширению (xdg) так, чтобы в первую очередь вызывался libreoffice и только потом P7
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
}
 
 
#установка 0 тайиаута при загрузке. Защита от очень "умных" детей - чтобы они не вошли в отладочную консоль. перестраховка, которая иногда мешает мне самому
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
}
 
#установка crontab для отключения компьютера в 22:00 и 7:00 - чтобы компы и доски не оставались вкоюченными на ночь
#также устанавливает запуск onreboot.sh после перезагрузки
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
}
 
 
 
# разные донстройки KDE для пользователя ${USR}, включая блокировку (перевод в ro) некоторых настроечных файлов при установке LOCK=1
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
 
}
 
 
# восстановление папок teacher_control на рабочем столе ПК из компкласса
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}/Рабочий стол/Сдать работы"
}
 
 
 
#сброс WIFI подключений (для ПК, подключенных проводом)
clean_wifi()
{
#удалить wifi соединения
rm /etc/NetworkManager/system-connections/Study.MOS.nmconnection
rm /etc/NetworkManager/system-connections/Study.nmconnection
}
 
 
#Установка Chrome браузером по умолчанию
# и восстановление иконки на рабочем столе
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
}
 
 
#установка фона рабочего стола 648.png с сервера
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
}
 
 
#настройка vnc  пароль - password можно поменять
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
}
 
 
 
#включение снхронизации времени СО СВОИМ СЕРВЕРОМ (нужно установить на сервере ntp)
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
}
 
 
 
 
 
 
# причисление пользователя к vboxusers (разрешение запуска virtualbox)
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
}
 
#установка стороннего libreoffice с официального сайта. файл lo.tar.gz на сервере перепакован с двух файлов, скаченных с сайта libreoffice (base и ru)
 
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
}
 
 
#установка стороннего blender (в репе на момент написания 2.9, сторонний 3.4)
 
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
#добавление в список папок дельфина общей папки для панелей, расшаренной на сервере
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
#блокирока обновление hplip
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
 
 
for USR in ${USERS}
do
echo user ${USR}
set_kde
setup_chromium
create_veyon_share
setup_wallpaper
done
}
 
#основной скрипт. расшифроввуем hostname
 
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
 
 
 
</syntaxhighlight>На сервере размещаем скрипы start.sh и reg.sh  и файл index.php.  Настроена авторизация, чтобы доступ был только у Вас.
 
У меня также установлены webssh и novnc для входа по ssh и vnc непосредственно из браузера.
 
Это удобно - чтото менять можно не только со своего компьютера но и с любого, который оказался под рукой. Кроме того, вход происходит при нажатии ссылки из index.php
 
Правда, WEBSSH И NOVNC несколько доработаны, чтобы не приходилось набирать пароль каждый раз. Когданибудь я их выложк :)
 
'''Данная версия index.php предельно упрощена специально для wiki и может содержать ошибки.'''
 
index.php :
 
<syntaxhighlight lang="php">
<?php
 
$myip=$_SERVER['SERVER_ADDR'];
$webroot="/var/www/html/";
$base=$webroot."base/";
#ссылка на установленный webssh
$webssh="http://".$myip.":8081";
#ссылка на установленный novnc
$novnc="http://".$myip.":6080";
#Список компьютерных классов
$cc=array("КАБ34" => "m648-1-34a","КАБ21"=>"m648-1-21a","КАБ41"=>"m648-1-41","КАБ42"=>"m648-1-42");
#файл токенов novnc
$confignovnc="/etc/novnc/token.list";
 
 
#сохранение именив "базе"
function save_name($nm,$ip)
{
global $base;
global $webroot;
$val=file_get_contents($webroot."reg.sh");
file_put_contents($base.$nm,$ip);
return;
};
 
#вернуть текстовый файл
function rettext($text,$name){
header("Content-Type: text/plain");
header("Content-Transfer-Encoding: Binary");
header("Content-Length:".strlen($text));
header("Content-Disposition: attachment; filename=\"".$name."\"");
echo str_replace("\r","",$text);
exit();
};
 
#вывод одного раздела таблицф
function print_table($mask)
{
global $base;
global $webssh;
global $novnc;
echo "<table> <tr> <th>NAME</th> <th>IP</th> <th>LAST TIME</th><th>SSH</th> <th>VNC</th></tr>";
$dir=`ls $base/$mask`;
foreach (explode("\n",$dir) as $n) {
$name=basename($n);
$ip=file_get_contents($base.$name);
$ssh=$webssh."/?hostname=$ip&username=root&privatekey=localfile";
$vnc=$novnc."/vnc_lite.html?p=&scale=true&path=websockify/?token=$name";
$tm=date ("d/m H:i:s", filemtime($base.$name));
if($name !="")
{
echo "<tr> <th>$name</th> <th>$ip</th> <th>$tm</th> <th><a href=\"$ssh\">SSH</a></th> <th><a href=\"$vnc\">VNC</a></th> </tr>\n";
};
};
echo "</table>";
};
 
 
#обновление таблицы novnc
function renewvnc()
{
global $confignovnc;
global $base;
$dir=`ls $base/?*`;
 
foreach (explode("\n",$dir) as $n) {
$name=basename($n);
$ip=file_get_contents($base.$name);
$ar[]=$name.": ".$ip.":5900";
};
 
asort($ar);$s=join("\n",$ar);
$x=file_get_contents($confignovnc);
if($s!=$x) { file_put_contents($confignovnc,$s); };
};
 
 
 
if(isset($_REQUEST['start'])) {
$name=$_REQUEST['start'];
$a=explode("-",$name);
$val=file_get_contents($webroot."start.sh");
save_name($name,$_SERVER['REMOTE_ADDR']);
rettext($val,'start.sh');
};
 
if(isset($_REQUEST['reg'])) {
$name=$_REQUEST['reg'];
$a=explode("-",$name);
$val=file_get_contents($webroot."reg.sh");
save_name($name,$_SERVER['REMOTE_ADDR']);
rettext($val,'reg.sh');
};
 
if(isset($_REQUEST['player'])) {
echo "<!DOCTYPE html>
<html>
<head>
</head>
<body>
<video id=\"video\" controls preload=\"auto\" controls=\"controls\" style='width:80%; height:80%; max-height:100%;' autoplay >
<source src='http://".$_REQUEST['player']."/' type='video/mp4'>
</video>
</body>
</html>";
exit();
};
 
 
renewvnc();
 
?>
 
 
<!DOCTYPE html><html>
<head lang="ru">
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Admin</title>
<style>
table,tr,td,th {
border-collapse: collapse;
text-align: left;
border: 1px solid black;
margin: 20px;
padding: 2px;
}
 
</style>
</head>
<body>
 
<?php
echo "<h1>Ссылки на оборудование</h1>";
echo "<h2>Доски</h2>";
print_table("p*");
echo "<h2>Моноблоки</h2>";
foreach ($cc as $k=>$v) {
echo "<h3>$k</h3>";
print_table($v."*");
}
echo "<h2>Ноутбуки</h2>";
print_table("n*");
 
?>
</body>
</html>
 
</syntaxhighlight>


Необходимо создать каталог /var/www/html/base/ и дать ему права на доступ от php




[[Участник:Kekaloav]]


Вопросы? kekalo@mail.ru
[[Категория:Скрипты]]
[[Категория:Скрипты]]
[[Категория:МОС]]
[[Категория:МОС]]
[[Категория:FAQ]]

Текущая версия на 21:55, 20 сентября 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

Альтернатиыный вариант для ТОЛЬКО для установки veyon на MOS12

также заполняет поле макадреса, что дает возможность использоват WOL

sudo dnf in comp-cab-setup

потом запустить comp-cab-setup или

#!/bin/bash

#настройка veyon запуск от root (вход от root без пароля root: "sudo su -" ) на компе учителя
# должен быть файл /root/hosts.txt со списком имен компов c расширением local вида
# m648-2-119-1.local
#все компы учеников должны быть в сети (проверки этого нет)
# на компах учеников должны быть пользователи student
# на компе учителя пользователь teacher, вход в veyon 
#осуществляется из под него и с его паролем (пользователь должен иметь непустой пароль!)

#название кабинета
CAB=41
#пользователь с правами на sudo на компе ученика
USER=admin
#пароль пользователя с правами на sudo на компе ученика
USERPASS=""


config_teacher()
{
if [ ! -f ${HOME}/.ssh/id_ed25519.pub ]; then
ssh-keygen -f ${HOME}/.ssh/id_ed25519 -q -t ed25519 -N ""
fi
rm ${HOME}/myconfig.json
rm ${HOME}/teacher_public_key.pem
dnf -y install veyon sshpass
veyon-cli authkeys delete teacher/private; 
veyon-cli authkeys delete teacher/public; 
veyon-cli authkeys create teacher; 
veyon-cli authkeys setaccessgroup teacher/private teacher; 
veyon-cli authkeys export teacher/public ${HOME}/teacher_public_key.pem; 
veyon-cli config set Authentication/Method 1
veyon-cli config set NetworkObjectDirectory/Plugin {14bacaaa-ebe5-449c-b881-5b382f952571}
veyon-cli networkobjects clear
veyon-cli networkobjects add location ${CAB}; 
for i in $(cat ${HOME}/hosts.txt); 
do 
ping -c 1 $i > /dev/null
MAC=`arp $i | grep -v dress  | awk '{print $3}'`
veyon-cli networkobjects add computer $i $i ${MAC} ${CAB}; 
done; 
veyon-cli config export ${HOME}/myconfig.json;
veyon-cli service restart
}

config_student()
{
echo IP ${IP}
SSHKEY=`cat ${HOME}/.ssh/id_ed25519.pub`
ANS=`sshpass -p 1 ssh -l root ${IP} echo accessok`
if [ -z "${ANS}" ]; then
(sleep 1;echo "${USERPASS}";sleep 1; echo "echo \"${SSHKEY}\" >> ${HOME}/.ssh/authorized_keys " ; echo exit; sleep 1; echo exit) | sshpass -p ${USERPASS} ssh -tt -oStrictHostKeyChecking=no ${USER}@${IP} sudo su
fi
scp ${HOME}/teacher_public_key.pem root@${IP}:${HOME}/ 
scp ${HOME}/myconfig.json root@${IP}:${HOME}/ 
ssh -l root ${IP} dnf -y install veyon-core 
ssh -l root ${IP} veyon-cli authkeys delete teacher/public; 
ssh -l root ${IP} veyon-cli authkeys import teacher/public ${HOME}/teacher_public_key.pem 
ssh -l root ${IP} veyon-cli config import ${HOME}/myconfig.json 
ssh -l root ${IP} veyon-cli service restart
}


config_teacher
for i in $(cat ${HOME}/hosts.txt); 
do 
IP=${i}
config_student
done; 
reboot


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

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

#!/bin/bash
#впишите сюда свою сеть
YOUR_NET="172.xx.xx.0"

nmap -n --stats-every 1s -p 22,631 ${YOUR_NET}/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

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

https://os.mos.ru/git/andreyka648/adminka


Участник:Kekaloav