монтирование сетевого диска.
Подключение данным скриптом проверено на Alt Linux 8
05.06.2021 На некоторых ПК
выходила ошибка
mount error(121): Remote I/O error
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
Пришлось добавить в команды vers=2.1
PASSWD="$p" mount "//$fs" "$mountdir" -o username="$l",vers=2.1,iocharset=utf8,file_mode=0666,dir_mode=0777
echo -e "//$fs $mountdir cifs vers=2.1,iocharset=utf8,file_mode=0666,dir_mode=0777,suid,credentials=$pwdfile 0 0\n" >> /etc/fstab
Скачать Что делает скрипт:
0. От монтирование старой папки (была под гостем) иначе будет ошибка
1. Определяет текущую сеть и поставляет ip файлового сервера с рашареной папкой. Пример 192.168.121.7/docs
2. Так как сrрипт запускается удалено под ssh root, нужно указать вывод графического интерфейса пользователю (это как vnc настройки)
3. Далее получаем переменные от пользователя (Логин Пароль для подключения сетевой папки с файлового через доменную учетку)
4. Проверяем что путь правильно сформировался
5. Создаем папку для монтирования /mnt/docs
6. Проверяем что директория создалась
7. Проверка что ведены логин пароль, а не пустые строки
8. Пробуем тестовое монтирование, что логин пароль и путь указанные верно
9. Бейкапим конфиг, удаляем старый логин пароль строку для гостя.
10. Шифруем пароль сохраняем в отдельный файл в шифрованном виде
11. Прописываем новую строку авторизации в файл /etc/fstab
12. Выводим результат об удачном монтировании, если где то ошибка начинаем сначала.
shareconnect.sh
Код: Выделить всё
#!/bin/sh
# Отмонтировать старую папку
umount /mnt/docs
# IP Хоста
ip=`hostname -i`
#Разбираем IP адрес по точкам, берем первые 3 блока и подставляем .7
SAVEIFS=$IFS
IFS='.'
read -a iparr <<< "$ip"
IFS=$SAVEIFS
# Подставляем начало IP
fs=${iparr[0]}.${iparr[1]}.${iparr[2]}.7
# Получаем IP путь след вида переменная fs="xxx.xxx.xxx.7/docs"
fs="$fs/docs"
# Выбираем экран для вывода графического запроса пользователю
export DISPLAY=:0.0; export XAUTHORITY='/var/run/lightdm/root/:0';
while true; do
# Запрашиваем Данные у пользователя и заносим их в переменные
fsq=$(zenity --entry --title="Монтирование ФС" --text="Адрес подключения:" --entry-text="$fs")
l=$(zenity --entry --title="Монтирование ФС" --text="Введите имя пользователя (логин почты Zimbra):")
p=$(zenity --entry --title="Монтирование ФС" --text="Введите пароль (пароль почты Zimbra):" --hide-text)
# Разбираем путь по слешу / подставляем второе значение docs
SAVEIFS=$IFS
IFS='/'
read -a fsp <<< "$fsq"
IFS=$SAVEIFS
# Выводим 2 значение docs
mountdir=${fsp[1]}
# Проверяем что в строке не 0 символов, если 0 то ошибка , нет продолжаем
if [ -z "$mountdir" ]; then
zenity --error --title="Монтирование ФС" --text="1-Не удалось! Попробуйте снова."
continue
fi
# Создаем каталог mkdir "/mnt/docs"
mountdir="/mnt/$mountdir"
mkdir "$mountdir" > /dev/null 2>&1
# Проверка существования дириктории
if ! [ -d "$mountdir" ]; then
zenity --error --title="Монтирование ФС" --text="2-Не удалось! Попробуйте снова."
continue
fi
# Проверяем что в строках не 0 символов т.е. есть логин пароль
if [[ -n "$l" && -n "$p" ]]; then
# Путь на подключение fs="xxx.xxx.xxx.7/docs"
fs="$fsq"
# Пробуем монтируем папку, проверяем
#mount "//$fs" "$mountdir" -o username="$l",password="$p",iocharset=utf8,file_mode=0666,dir_mode=0777
PASSWD="$p" mount "//$fs" "$mountdir" -o username="$l",vers=2.1,iocharset=utf8,file_mode=0666,dir_mode=0777
#PASSWD="$p" mount "//$fs" "$mountdir" -o dom="csvvo",username="$l",iocharset=utf8,file_mode=0666,dir_mode=0777
# Пример что должно выйти
#mkdir "/mnt/docs"
#mount "//xxx.xxx.xxx.7/docs" "/mnt/docs" -o username="Логин",password="Пароль",iocharset=utf8,file_mode=0666,dir_mode=0777
# Входная переменная с проверки, результат
res=$?
# Если результат монтирования 0=0 то сохраняем настройки, удалив предыдущие
if [[ $res -eq "0" ]]; then
# Делаем бэйкап файла с текущей датой, перед изменениями
cp /etc/fstab /etc/fstab.$(date +%d%m%Y%H%M%S)
#Если переменная содержит /mnt/docs и = /mnt/docs
if [ "${mountdir}" == "/mnt/docs" ]; then
# Удалить строку содержащую /mnt/docs
sed -i '/\/mnt\/docs/d' /etc/fstab
fi
#Передаем логин пароль в криптографические стойки генератора псевдослучайных чисел
pwdfile=/root/.`cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1`.pwd
# Создаем шифрованный файл с логином паролем построчно в папке root и даем права
echo -e "username=$l\npassword=$p" > $pwdfile && chmod 600 $pwdfile
# удаляем символы перевода строки
sed -i '/^$/d' /etc/fstab
# Добавляем строку монтирования в файл fstab
echo -e "//$fs $mountdir cifs vers=2.1,iocharset=utf8,file_mode=0666,dir_mode=0777,suid,credentials=$pwdfile 0 0\n" >> /etc/fstab
zenity --info --title="Монтирование ФС" --text="Всё ГУД!"
break
else
zenity --error --title="Монтирование ФС" --text="3-Не удалось! Попробуйте снова."
fi
fi
done
Резервный случай если отвалилась связь и сервер не загрузил с ldap учетные записи , никто зайти в общий ресурс не сможет
Так как есть Учетки Администраторов домена и они же Локальные временно до перезапуска хостов выполним вход от этой учетки.
Стоит учесть что данным способом для всех хостов пользователей применяются одинаковые права доступа!
Seti-shareconnect.sh
Показать
#!/bin/bash
# Автор Мамзиков Артём Андреевич 2021.06.10
echo "Seti-shareconnect.sh"
# Получим текущую подсеть
IP=`ip address|sed 's/inet//'|grep -E '192.168.*.5|172.16.*.5'|tr -d ' ' |awk -F'.' '{print $1,$2,$3}' OFS='.'`
# Список IP которые пропускаем
skip="$IP.1$\|$IP.3$\|$IP.5$\|$IP.7$\|$IP.10$\|$IP.15$\|$IP.75$\|$IP.253$"
# Выберем доступные хосты где есть пинг
IPHOST=`nmap -sn "${IP}".0/24|grep -E "Nmap scan report for "|sed 's/Nmap scan report for //'|sed 's/[()]//g'|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|sed -e "s/$skip//g"|sed -e '/^$/d'`
#echo "${IPHOST}"
# Переменные логина пароля для подключения к хосту
USER=root
PASS=Пароль
# Логин пароль для подключения к общей папке
DOCSLOGIN=MamzikovAA
DOCSPASS=Пароль
# Переменные IP для перебора подсетей
for IPH in $IPHOST
do
/usr/bin/expect<<EOF
# spawn - вызов программы
# expect - ожидание вывода запущенной программой строки (дословно: ожидаем, что скажет выполняемая программа);
# send - передача данных или команд в вызванную программу (выполняется так, как будто вы сами набираете команды в консоли)
# close - завершение сценария
# Время ожидания
set timeout 7
# Подключаемся по ssh
spawn ssh -p 22 $USER@$IPH
# Если выходит запрос потверждаем yes
expect {
"(yes/no)?*" {
send "yes\r"
}
}
# Ждем строку запроса пароля password:
expect "word:"
# Водим пароль
send "$PASS\r"
# Ждем строку для ввода команд от root #
expect "#*"
# Создадим дирикторию
send "mkdir '/mnt/$mountdir' > /dev/null 2>&1\r"
# Ждем строку для ввода команд от root #
expect "#*"
# До перезапуска подключим общую папку
send "mount '//$IP.7/docs' '/mnt/docs' -o username='$DOCSLOGIN',password='$DOCSPASS',iocharset=utf8,file_mode=0666,dir_mode=0777\r"
# Время ожидания установки
set timeout 5
# Проверяем что перешли в папку root
expect "~]#*"
set timeout 3
expect eof
# Выполняем выход из сеанса
send "exit\r"
EOF
done
# Автор Мамзиков Артём Андреевич 2021.06.10
echo "Seti-shareconnect.sh"
# Получим текущую подсеть
IP=`ip address|sed 's/inet//'|grep -E '192.168.*.5|172.16.*.5'|tr -d ' ' |awk -F'.' '{print $1,$2,$3}' OFS='.'`
# Список IP которые пропускаем
skip="$IP.1$\|$IP.3$\|$IP.5$\|$IP.7$\|$IP.10$\|$IP.15$\|$IP.75$\|$IP.253$"
# Выберем доступные хосты где есть пинг
IPHOST=`nmap -sn "${IP}".0/24|grep -E "Nmap scan report for "|sed 's/Nmap scan report for //'|sed 's/[()]//g'|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|sed -e "s/$skip//g"|sed -e '/^$/d'`
#echo "${IPHOST}"
# Переменные логина пароля для подключения к хосту
USER=root
PASS=Пароль
# Логин пароль для подключения к общей папке
DOCSLOGIN=MamzikovAA
DOCSPASS=Пароль
# Переменные IP для перебора подсетей
for IPH in $IPHOST
do
/usr/bin/expect<<EOF
# spawn - вызов программы
# expect - ожидание вывода запущенной программой строки (дословно: ожидаем, что скажет выполняемая программа);
# send - передача данных или команд в вызванную программу (выполняется так, как будто вы сами набираете команды в консоли)
# close - завершение сценария
# Время ожидания
set timeout 7
# Подключаемся по ssh
spawn ssh -p 22 $USER@$IPH
# Если выходит запрос потверждаем yes
expect {
"(yes/no)?*" {
send "yes\r"
}
}
# Ждем строку запроса пароля password:
expect "word:"
# Водим пароль
send "$PASS\r"
# Ждем строку для ввода команд от root #
expect "#*"
# Создадим дирикторию
send "mkdir '/mnt/$mountdir' > /dev/null 2>&1\r"
# Ждем строку для ввода команд от root #
expect "#*"
# До перезапуска подключим общую папку
send "mount '//$IP.7/docs' '/mnt/docs' -o username='$DOCSLOGIN',password='$DOCSPASS',iocharset=utf8,file_mode=0666,dir_mode=0777\r"
# Время ожидания установки
set timeout 5
# Проверяем что перешли в папку root
expect "~]#*"
set timeout 3
expect eof
# Выполняем выход из сеанса
send "exit\r"
EOF
done
# a, --all - примонтировать все устройства, описанные в fstab; (Обратите внимание, что если вы добавите файл подкачки в свой fstab, mount -aон не будет включен : вы захотите запустить swapon -a.)
mount -a
Можно прописать в крон или вывести ярлык
Код: Выделить всё
#!/bin/bash
# reconnecting-mout
# создадим файл для проверки
#echo "Proverka mount" > /mnt/docs/access
# Проверка доступности общей папки
#if [[ `ls -aF /mnt/docs |grep -av "/" | grep "access"` != "access" ]]
# Проверка через память диска
if [[ `timeout 5 df -h|grep "/mnt/docs"` = "" ]]
then
# a, --all - примонтировать все устройства, описанные в fstab;
mount -a
fi
reconnecting-mout.sh
Код: Выделить всё
#!/bin/bash
# reconnecting-mout
# Выберем строку для переподключения сетевого диска.
dan=$(cat /etc/fstab|grep "/mnt/docs"|grep -o '.*pwd')
#auth=$(echo "${dan}"|sed 's|.*credentials=||'|xargs -I {} bash -c 'cat {}'|sed ':a;N;$!ba;s/\n/,/g')
#echo "${auth}"
us=$(echo "${dan}"|sed 's|.*credentials=||'|xargs -I {} bash -c 'cat {}'|sed 's|username=||'|sed 's/pas.*//g'|tr -d ' ')
pwd=$(echo "${dan}"|sed 's|.*credentials=||'|xargs -I {} bash -c 'cat {}'|tr -d '\n'|sed 's|.*password=||'|tr -d ' ')
#echo $us $pwd
put=$(echo "${dan}"|sed 's|cifs.*||')
# Отмонтировать старую папку
#umount /mnt/docs
#mkdir "/mnt/docs"
# Повторное подключение
#mount $put-o "${auth}",iocharset=utf8,file_mode=0666,dir_mode=0777
PASSWD="${pwd}" mount $put cifs -o username="${us}",vers=2.1,iocharset=utf8,file_mode=0666,dir_mode=0777
#echo PASSWD="${pwd}" mount $put-o username="${us}",vers=2.1,iocharset=utf8,file_mode=0666,dir_mode=0777
# Пример:
#mount "//xxx.xxx.xxx.7/docs" "/mnt/docs" -o username="Логин",password="Пароль",iocharset=utf8,file_mode=0666,dir_mode=0777
#PASSWD=Пароль mount //xxx.xxx.xxx.xxx/docs /mnt/docs -o username=Логин,vers=2.1,iocharset=utf8,file_mode=0666,dir_mode=0777