anonymous@RULINUX.NET~# Last login: 2024-12-25 10:31:41
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

flash-writer.sh

По материалам, представленным в статье п. 2.2.3 накатал башевский сценарий, который показывает прогресс выполнения копирования образа на флешку. Сценарий адаптировал под себя, под другие системы, возможно, потребуется правка. Если запускать в голой консоли - используется dialog; в X-ах - zenity.

bash

#!/bin/sh

# Утилита для копирования файлов-образов (*.iso) на диск /dev/sd* (чаще USB)

ERROR_USAGE=1
ERROR_FILE_NOT_FOUND=2
ERROR_DEVICE_NOT_FOUND=3
ERROR_UNKNOWN_ENVIRONMENT=4

if [ $# -ne 2 ]; then
        echo "Usage: $0 <file> <disk>"
        exit ${ERROR_USAGE}
fi

FILE="$1"
DEV="$2"

# проверка корректности имени файла;
# файл существует и доступен для чтения
if [ ! -r "${FILE}" ]; then
        echo "File not exist or it is not readable by user"
        exit ${ERROR_FILE_NOT_FOUND}
fi

# это не директория
if [ -d "${FILE}" ]; then
        echo "${FILE} is a directory"
        exit ${ERROR_FILE_NOT_FOUND}

fi

# проверка устройства
# файл устройства существует
if [ ! -e "${DEV}" ]; then
        echo "Device not found"
        exit ${ERROR_DEVICE_NOT_FOUND}
fi

# -b is block special
if [ ! -b "${DEV}" -a "${DEV}" != "/dev/null" ]; then
        echo "Device is not special block device"
        exit ${ERROR_DEVICE_NOT_FOUND}
fi                                              

#TODO: проверка на removable и USB
case "${DEV}" in
        "/dev/sda"*)
                echo -e "\033[41;37;5;1mДУРАК! ТЫ ЧУТЬ НЕ УНИЧТОЖИЛ ВСЮ СИСТЕМУ!\033[0m"
                exit ${ERROR_USAGE}
                ;;
        "/dev/sdb"* | \
        "/dev/null")
                echo "${DEV} находится в списке допустимых устройств, продолжаем"
                ;;

        *)
                echo "Недопустимое устройство ${DEV}"
                exit ${ERROR_USAGE}
                ;;
esac

TEXT="Copy '${FILE}' to ${DEV}, please wait..."

# определения окружения - мы в консоли или в X-ах
case "${TERM}" in
        "linux")
                echo "Console edition..."
                (pv -n "${FILE}" | dd of=${DEV} bs=1M conv=notrunc,noerror) 2>&1 |
                        dialog --gauge "${TEXT}" 10 70 0
                ;;

        "xterm")
                echo "X Server edition..."
                (pv -n "${FILE}" | dd of=${DEV} bs=1M conv=notrunc,noerror) 2>&1 |
                        zenity --progress --auto-kill --auto-close --text="${TEXT}"
                ;;
        *)
                echo "Unknown environment (TERM=${TERM})"
                exit ${ERROR_UNKNOWN_ENVIRONMENT}
                ;;
esac

# синхронизуем диски
echo "Sync... "
sync
# пауза на всякий случай
sleep 3
 


Ссалка на pastebin

anonymous(*) (2017-08-03 14:54:22)

[Ответить на это сообщение]
[#] [Добавить метку] [Редактировать] Ответ на: flash-writer.sh от anonymous 2017-08-03 14:54:22
avatar
Скрыть

Re:flash-writer.sh

Список допустимых устройств:

bash

for i in $(ls -1 `readlink -f /sys/block/*/device | grep usb`/block); do X=$(mount | grep -c "$i") >/dev/null; if [ $X -eq 0 ]; then echo "$i"; fi;  done
 

anonymous(*)(2017-08-03 18:06:17)

Mozilla/5.0 (X11; Fedora; Linux i686; rv:54.0) Gecko/20100101 Firefox/54.0
[#] [Добавить метку] [Редактировать] Ответ на: Re:flash-writer.sh от anonymous 2017-08-03 18:06:17
avatar
Скрыть

Re:flash-writer.sh

1. У тебя какой-то неуставной символ затесался между fi; и done, отчего bash впадает в фрустрацию:

>for i in $(ls -1 `readlink -f /sys/block/*/device | grep usb`/block); do X=$(mount | grep -c "$i") >/dev/null; if [ $X -eq 0 ]; then echo "$i"; fi; ═done
>

> bash: ошибка синтаксиса: неожиданный конец файла

2. readlink-у тоже чего-то не нравится:

readlink: лишний операнд <</sys/block/sr0/device>>
Попробуйте `readlink --help' для получения более подробного описания.

anonymous(*)(2017-08-03 18:31:27)

[#] [Добавить метку] [Редактировать] Ответ на: Re:flash-writer.sh от anonymous 2017-08-03 18:31:27
avatar
Скрыть

Re:flash-writer.sh

Не знаю где ты "равно" это подцепил.

У меня блочные девайсы выглядят так:

bash

$ ls -ld /sys/block/*/device
lrwxrwxrwx. 1 root root 0 Aug  3 07:56 /sys/block/sda/device -> ../../../0:0:0:0
lrwxrwxrwx. 1 root root 0 Aug  4 00:05 /sys/block/sdb/device -> ../../../4:0:0:0
 

Соотв. readlink выдаёт:
bash

readlink -f /sys/block/*/device
/sys/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0
/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-7/1-7:1.0/host4/target4:0:0/4:0:0:0
 

Грепом выгреповываем только USB-устройства и смотрим что у них там в /block находится:
bash

ls -1 `readlink -f /sys/block/*/device | grep usb`/block
sdb
 

Остальное там для не очень корректной проверки нет ли такого устройства в выхлопе маунта (мы же не хотим писать в смонтированный диск).

Хотя, конечно, любое другое решение было бы лучше..

anonymous(*)(2017-08-04 03:20:18)
Отредактировано anonymous по причине "не указана"
Mozilla/5.0 (X11; Fedora; Linux i686; rv:54.0) Gecko/20100101 Firefox/54.0
[#] [Добавить метку] [Редактировать] Ответ на: Re:flash-writer.sh от anonymous 2017-08-04 03:20:18
avatar
Скрыть

Re:flash-writer.sh

> Не знаю где ты "равно" это подцепил.
У тебя там nbsp затесался. А при копировании туда-сюда он стал =, в консоли я никакого символа не увидел, только когда открыл строку в редакторе смог понять в чём дело. Движок сжирает nbsp, поэтому пришлось его последним седом поменять.

bash

wget -q http://rulinux.net/thread_42957_comment_220912 -O - | grep -m1 mount | sed -e 's@.*fi@fi@' | sed -e 's/ /nbsp/'
fi</span>; nbsp<span class="kw1">done</span><br />
 


У меня какой-то неправильный readlink и так, как у тебя, не умеет:

bash

~>ls -ld /sys/block/*/device
lrwxrwxrwx 1 root root 0 Авг  4 13:28 /sys/block/sda/device -> ../../../2:0:0:0
lrwxrwxrwx 1 root root 0 Авг  4 13:28 /sys/block/sr0/device -> ../../../0:0:0:0
~>readlink -f /sys/block/*/device
readlink: лишний операнд <</sys/block/sr0/device>>
Попробуйте `readlink --help' для получения более подробного описания.

anonymous(*)(2017-08-04 14:49:27)

[#] [Добавить метку] [Редактировать] Ответ на: flash-writer.sh от anonymous 2017-08-03 14:54:22
avatar
Скрыть

flash-writer.sh v0.2

v0.2 Добавлена обработка файлов /dev/zero, /dev/urandom

После использования забить флешку случайным мусором/нулями (и лучше не один раз) - обязательное условие! А то мало ли что там у тебя в карманах найдут - обрывки федоры или зеркало рулина - посодют в любом случае.

Патч

diff

--- flash-writer.sh.orig        2017-09-08 12:40:25.522768514 +0300
+++ flash-writer.sh     2017-09-08 12:36:07.253790563 +0300
@@ -1,11 +1,16 @@
 #!/bin/sh
 
 # Утилита для копирования файлов-образов (*.iso) на диск /dev/sd* (чаще USB)
+# v0.1
+# v0.2 Добавлена обработка файлов /dev/zero, /dev/urandom
+# TODO: все сообщения либо по-русски, либо нет
 
 ERROR_USAGE=1
-ERROR_FILE_NOT_FOUND=2
-ERROR_DEVICE_NOT_FOUND=3
-ERROR_UNKNOWN_ENVIRONMENT=4
+ERROR_FILE_NOT_FOUND=21
+ERROR_FILE_NOT_ALLOWED=22
+ERROR_FILE_TOO_BIG=23
+ERROR_DEVICE_NOT_FOUND=31
+ERROR_UNKNOWN_ENVIRONMENT=91
 
 if [ $# -ne 2 ]; then
        echo "Usage: $0 <file> <disk>"
@@ -28,6 +33,22 @@
        exit ${ERROR_FILE_NOT_FOUND}
 fi
 
+# проверка на специальные файлы и определение размера файла
+case "${FILE}" in
+       "/dev/zero" | \
+       "/dev/urandom")
+               echo "Используется специальный файл ${FILE}"
+               FILE_SIZE=-1
+               ;;
+       "/dev/"*)
+               echo "Специальный файл ${FILE} недопустим"
+               exit ${ERROR_FILE_NOT_ALLOWED}
+               ;;
+       *)
+               FILE_SIZE=$(stat --printf="%s" "${FILE}")
+               ;;
+esac
+
 # проверка устройства
 # файл устройства существует
 if [ ! -e "${DEV}" ]; then
@@ -39,7 +60,7 @@
 if [ ! -b "${DEV}" -a "${DEV}" != "/dev/null" ]; then
        echo "Device is not special block device"
        exit ${ERROR_DEVICE_NOT_FOUND}
-fi                                              
+fi
 
 #TODO: проверка на removable и USB
 case "${DEV}" in
@@ -57,18 +78,36 @@
                ;;
 esac
 
+# определение размера блочного устройства
+DEV_SIZE=$(blockdev --getsize64 "${DEV}")
+
+# а влезет ли файл?
+if [ ${FILE_SIZE} -gt ${DEV_SIZE} ]; then
+       echo "This file does not fit to this device"
+       echo "(filesize=${FILE_SIZE}, devsize=${DEV_SIZE})"
+       exit ${ERROR_FILE_TOO_BIG}
+fi
+
+# для специальных файлов размер определяется через размер блочного устройства
+if [ ${FILE_SIZE} -eq -1 ]; then
+       echo "Special file has no size, use device size instead"
+       FILE_SIZE=${DEV_SIZE}
+fi
+
 TEXT="Copy '${FILE}' to ${DEV}, please wait..."
 
 # определения окружения - мы в консоли или в X-ах
 case "${TERM}" in
        "linux")
                echo "Console edition..."
-               (pv -n "${FILE}" | dd of=${DEV} bs=1M conv=notrunc,noerror) 2>&1 |
+               (pv -n -s ${FILE_SIZE} "${FILE}" |
+                       dd of=${DEV} bs=1M conv=notrunc,noerror) 2>&1 |
                        dialog --gauge "${TEXT}" 10 70 0
                ;;
        "xterm")
                echo "X Server edition..."
-               (pv -n "${FILE}" | dd of=${DEV} bs=1M conv=notrunc,noerror) 2>&1 |
+               (pv -n -s ${FILE_SIZE} "${FILE}" |
+                       dd of=${DEV} bs=1M conv=notrunc,noerror) 2>&1 |
                        zenity --progress --auto-kill --auto-close --text="${TEXT}"
                ;;
        *)
@@ -81,4 +120,4 @@
 echo "Sync... "
 sync
 # пауза на всякий случай
-sleep 3
\ В конце файла нет новой строки
+sleep 3
 


NB! Сценарий не совместим с предыдущей версией по возвращаемым кодам ошибок.

anonymous(*)(2017-09-08 13:56:09)
Отредактировано anonymous по причине NB!
Этот тред читают 2 пользователя:
Анонимных: 2
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!