1 (30.08.2014 22:48:11 отредактировано MIcov15)

Нужно запаролить папку в ридере(эл.книга) pocketbook (ОС linux).На форуме этого ридера мне кое что написали(но как я понял не доделано) :

fprintf (stderr,"password=%s\n", text);
book="$1"
dir_path="`dirname \"$book\"`"
dir="`basename \"$dir_path\"`"
# критерий необходимости проверки может быть любым, в том числе и таким ;)
if [ "$dir" = "hidden" ]
then
# не помню, как это делалось..
#  проверить пароль
   pass="`/mnt/ext1/system/bin/password.app 2>&1|awk -F = '/^password=/ {print $2}'`"
  if [ "$pass" = 123 ] ;  then
    exec /ebrmain/bin/`basename $0` "$book"
  else
    exit 1
  fi
else
 exec /ebrmain/bin/`basename $0` "$book"
fi 

Язык Shell  Bash, но я совершненно  не разбираюсь.
файл password.app выводит клавиатуру для ввода пароля и выводит полученный пароль в stderr виде .Могу выложить если что.
Хотелось бы еще иметь возможность сменить пароль и папку.
Заранее спс
Вот программа которая делает похожие вещи(для pocketbook):
www3.telus.net/rkomar/sh_ivtool/

2

MIcov15 пишет:

файл password.app выводит клавиатуру для ввода пароля и выводит полученный пароль в stderr виде

Вывод этой команды подаётся на разбор awk, который вырезает из вывода введённой слово (пароль) и всё это помещается в переменную pass:

pass="`/mnt/ext1/system/bin/password.app 2>&1|awk -F = '/^password=/ {print $2}'`"

Далее идёт простая проверка, что введённое слово (пароль) равно выбранному паролю, в данном случае "123":

if [ "$pass" = 123 ] ;  then

Ну и если условие выполняется, то должна выполняться команда по переходу в директорию, но здесь подразуменвается открытие книги, только команда какая-то несколько странная, но в случае, если вы ввели "123" она должна сработать. Странная она в том плане, что несколько непонятно зачем ещё раз вызывается этот же скрипт и передаёься ему параметр book.

 exec /ebrmain/bin/`basename $0` "$book"

MIcov15 пишет:

Хотелось бы еще иметь возможность сменить пароль и папку.

Пароль вы теперь знаете как менять. Ну а папка здесь подразумевается, что её имя "hidden", тогда будет выполняться запрос пароля.

3

kostik87, спасибо что ответили .
Я в начале думал что скрип для открытия папки а не для книги.
Переделайте пожалуйста для открытия папки,и еще ,не совсем понятно с папкой hidden, на сколько я могу понять она должна находиться в той же папке что и файл скрипта?Хотелось бы чтобы можно было указать путь к определенной папке,на которую надо поставить пароль

4

MIcov15 пишет:

Я в начале думал что скрип для открытия папки а не для книги.

На вход скрипту подаётся параметр,  этот параметр помещается в переменную book

Затем посредством вызова утилиты dirname в переменную dir_name помещается путь до файла, который передан в качестве параметра, то что это книга я сужу по названия переменной book

dir_path="`dirname \"$book\"`"

Далее от пути до директории берётся собственно имя директории и помещается в переменную dir:

dir="`basename \"$dir_path\"`"

Ну а дальше уже идут проверки.

MIcov15 пишет:

Переделайте пожалуйста для открытия папки,и еще ,не совсем понятно с папкой hidden, на сколько я могу понять она должна находиться в той же папке что и файл скрипта?

Так что, как видите, поведение скрипта несколько другое.

MIcov15 пишет:

Хотелось бы чтобы можно было указать путь к определенной папке,на которую надо поставить пароль

MIcov15 пишет:

Хотелось бы чтобы можно было указать путь к определенной папке,на которую надо поставить пароль

Перепишите немного скрипт, по комментариям в этой теме вам будет легко это сделать.

Плюс раз у вас есть книга вам будет на чём тестировать этот скрипт.  Потому, что я даже не представляю как он в книге вызывается. Могли бы хотя бы ссылку на форум скинуть откуда скрипт взяли.

5

форум вот http://www.the-ebook.org/forum/viewforum.php?f=40
конкретно тема - http://www.the-ebook.org/forum/viewtopic.php?t=27611
Скрипт на 2 странице.Я если честно сам не совсем понимаю что с ним дальше делать,книга сенсорная ,все приложения ,игры и т.п с расширением .app .Надо как-то скомпилировать в этот формат ,для книги.Надеюсь найду как это сделать на форуме

6 (30.08.2014 23:52:35 отредактировано kostik87)

MIcov15 пишет:

Я если честно сам не совсем понимаю что с ним дальше делать

Там же написали, что текст этого скрипта нужно сохранить  в файл bookshelf.app и положить в директорию system/bin/ текст лучше сохраните в UTF-8, с концом строки Unix., вам в этом поможет Notepad++

Положить в system/bin/ свой bookshelf.app, который будет проверять пароль и запускать системный bookshelf.app. Но это обходится загрузкой в безопасном режиме.

Точнее не так, вам же там всё расписали, почему вы не читаете?

Если пароль набирается часто (при каждом включении) - рано или поздно его подсмотрят. А шнур такой идет в комплекте с практически каждым гаджетом. Стандарт же.

Проверку пароля при открытии книги можно сделать, например, так:
в system/bin/ положить скрипты с именами AdobeViewer.app, djviewer.app, fbreader.app вида

Теперь ставновится ясной суть вот этой команды:

exec /ebrmain/bin/`basename $0` "$book"

В system/bin вы помещаете указанный скрипт под указанными именами (AdobeViewer.app, djviewer.app, fbreader.app), этим вы перекрываете просто вызов просмотрщиков книг из /ebrmain/bin, затем если пароль введён верно, то из /ebrmain/bin будет вызван просмотрщик, соответствующий формату книги, а в качестве параметра передан путь до книги.

7

не обратил на это внимания т.к изначально в теме вопрос был "как поставить пароль на вход" в саму книжку.

8 (31.08.2014 00:09:13 отредактировано kostik87)

MIcov15 пишет:

не обратил на это внимания т.к изначально в теме вопрос был "как поставить пароль на вход" в саму книжку.

Перечитайт предыдущее моё сообщение, я его поправил.

Для пароля на книжку достаточно вот такого скрипта:

         pass=""
         until ! [  "$pass"=123 ]; do
             pass="`/mnt/ext1/system/bin/password.app 2>&1|awk -F = '/^password=/ {print $2}'`" 
         done

и "Положить в system/bin/ свой bookshelf.app".

Ну и ваш запрос на выбор директории так же вам уже должен быть ясен.

9 (31.08.2014 00:15:19 отредактировано MIcov15)

kostik87 пишет:

В system/bin вы помещаете указанный скрипт под указанными именами (AdobeViewer.app, djviewer.app, fbreader.app), этим вы перекрываете просто вызов просмотрщиков книг из /ebrmain/bin, затем если пароль введён верно, то из /ebrmain/bin будет вызван просмотрщик, соответствующий формату книги, а в качестве параметра передан путь до книги.

С этим понятно.Я все равно не очень понимаю как изменить скрипт под нужную директорию
Та тема создавалась не мной

10

MIcov15 пишет:

С этим понятно,но а как запаролить нужную папку?

Вас интересует именно запароливание "папки" или предотвращение просмотра книг в ней, если достаточно лишшь предотвращение просмотра в ней книг, то скрипт с этим справится, онн создаёт "заглушки" для программ просмотра книг указанных форматов и если пароль введён верно, то открывает книгу, если нет - ничего не делает.

В некотором роде это тоже запароливание "папки".

Если вам нужно именно предотвратить даже возможность перехода в директорию и просмотра её содержимого, то тут нужно чётко понимать как работает операционная система книги и можно ли повесить какой-либо скрипт на событие смены директории, я если честно не уверен. Думаю всё, что возможно - это именно то, что вам уже предложили, а именно "заглушки" на программы просмотра, которые будут срабатывать в указанной директории, в других директориях просто будет запускаться программа просмотра. Как эти "заглушки" работают, каждому формату книги сопоставлена определённая программа просмотра, она ищется по определённому пути с определённым именем, вам предлагают поместить в путь, который проверяется раньше скрипт с тем же именем, что и программа просмотра и если книга находится в указанной директори, то "заглушка" запросит пароль и если он верен, то запустит программу просмотра. Вот и получается, что обработать открытие книги легко, а смену директории ("папки") не ясно как. Ну или ставьте пароль на книгу, я вам уже описал как.

11

MIcov15 пишет:

Я все равно не очень понимаю как изменить скрипт под нужную директорию

dir_path="`dirname \"$book\"`"
dir="`basename \"$dir_path\"`"
if [ "$dir" = "hidden" ]

В место этого можете написать либо полный путь до директории, если вы знаете как книга его представляет:

dir_path="`dirname \"$book\"`"
if [ "$dir_path" = "/путь/до/директории" ]

ну или вместо hidden указать вашу директорию, но скрипт будет срабатывать на все директории с таким именем, без разницы на каком уровне вложенности они находятся

dir_path="`dirname \"$book\"`"
dir="`basename \"$dir_path\"`"
if [ "$dir" = "ваша_директория" ]

12 (31.08.2014 00:54:37 отредактировано drBatty)

MIcov15 пишет:

как запаролить нужную папку?

этот вопрос не имеет смысла. Если программа для чтения не умеет "паролить папку", то вы её и не "запаролите". И как я понимаю, программа умеет "паролить" только книжки по отдельности.

PS: однако я ошибся, и скрипт таки проверяет пароль.

Вам значит надо получить полный путь, в обычном linux это делается так:

 Консоль:
$ readlink -f time.h
/usr/include/bits/time.h

если эта команда у вас работает(в чём я не уверен), то всё просто, надо извлечь путь
 Консоль:
$ FULL_NAME=$(readlink -f time.h)
$ PATH_NAME=$(dirname "$FULL_NAME")

и теперь можно проверять путь. Если этот путь входит в список "запароленых", то нужно проверить пароль перед запуском программы-читалки.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

13

kostik87 пишет:

dir_path="`dirname \"$book\"`"

точнее

dir_path=$(dirname "$book")
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

14

drBatty пишет:

точнее

dir_path=$(dirname "$book")

Да, но я ленив, мне проще скопировать кусок готового скрипта для ответа и не править его, но работать будет и так, т.к. значение переменной экранируется кавычками и подаётся на вход dirname.

15

MIcov15, вот две ссылки на книгу по написанию скриптов в Bash:
- http://rus-linux net/MyLDP/BOOKS/abs-gu … -book.html
- http://www.opennet.ru/docs/RUS/bash_scripting_guide/

Это для большего понимания написанного и возможности вам править самостоятельно скрипт.

16

kostik87 пишет:

но работать будет и так, т.к. значение переменной экранируется кавычками и подаётся на вход dirname.

да, но кавычки вокруг `` лишние.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

17

drBatty пишет:

да, но кавычки вокруг `` лишние.

Они указывают, что нужно выполнить команду в них, если их убрать, то в dir_path будет строка "dirname \"/путь/до/книги/файл_книги\"", а не "/путь/до/книги".

18

kostik87,
тут вообще никаких кавычек не нужно, кроме те, что вокруг $book

 Консоль:
$ book="/a a/b b/c c"
$ dir_path=`dirname "$book"`; echo "dir_path='$dir_path'"
dir_path='/a a/b b'

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

19

спасибо что помогаете ,буду пробовать разные варианты ,в конце отпишу.
kostik87, спасибо за ссылки ,не все понятно,но надеюсь поможет

20

в общем скрипт похоже работает ,но клавиатура не вызывается и книга просто не открывается,может я как то не так вызвал программу password.app ?

21 (31.08.2014 15:04:43 отредактировано MIcov15)

Пробовал по разному, может она просто не работает.
Тут http://www3.telus.net/rkomar/sh_ivtool/ программа ,которая как я понял тоже может вызывать клавиатуру,ее надо положить в mnt/ext1/system/bin ,а потом обратиться к ней с определенной командой.
Вот список команд которая она может выполнять :

+ открыть спойлер
Here are the various options that can be used, along with an example of each:

-s <message>    Show message to user via Dialog box.

  sh_ivtool -s "Hello world!"


-q <question>   Show question in Dialog box and return the character 'y'
                for 'Yes' and 'n' for 'No'.
                The output should only be used if the error code is '0'.

  ANSWER=`sh_ivtool -q "Yes or no?"`
  if [ $? -eq 0 ]; then
      echo $ANSWER
  else
      echo Keeping mum!
  fi


-t <message>    Get text input from Keyboard, showing message in header.
                The output should only be used if the error code is '0'.

  TEXT=`sh_ivtool -t "Enter some text:"`
  if [ $? -eq 0 ]; then
    #use string $TEXT
  fi


-n <message>    Get number from Numeric Keyboard, showing message in header.
                The output should only be used if the error code is '0'.

  NUM=`sh_ivtool -n "Enter a number:"`
  if [ $? -eq 0 ]; then
    #use string $NUM
  fi


-d <message>    Get directory name using OpenDirectorySelector(), showing
                message in header.
                The output should only be used if the error code is '0'.

  DIR=`sh_ivtool -d "Select a folder:"`
  if [ $? -eq 0 ]; then
    #use string $DIR
  fi

-f <dir> [ [ext1,ext2] [ext3] ... ]
                Show all files in the given directory and subdirectories,
                and return the name of the chosen file.  Only files with
                the given extensions are shown if the [ext] are given.  The
                OpenContent dialog is used to show the files.  The BACK
                button is used to exit without making a choice.
                The output should only be used if the error code is '0'.

                By default, extensions are separated by spaces and commas,
                however, you can specify a different set of separators using
                the SHIVFS environmental variable.

-F <dir> [ [ext1,ext2] [ext3] ... ]
                Same as for "-f", except that only files in the given directory
                are shown, and subdirectories are ignored.

  export SHIVFS=";, "
  FILE=`sh_ivtool -f "/mnt/ext2/my_ebooks/" ".epub,.pdf;.fb2" ".cbr .rar"`
  if [ $? -eq 0 ]; then
    #use $FILE
  fi

-o <opt1[,opt2,...]> [ [opt4[,opt5,...]] ... ]
                Show the given options and return the chosen one.
                Options are delimited with commas only so that spaces can
                be used in the text.  If you include spaces as part of the
                option, be sure to put quotes around the text.  The
                OpenContent dialog is used to show the options.
                The output should only be used if the error code is '0'.

  OPT=`sh_ivtool -o "opt1,opt2,opt 3" "opt4"`
  if [ $? -eq 0 ]; then
    #use $OPT
  fi

Вот перевод в гугле :

+ открыть спойлер
Здесь есть варианты, которые можно использовать, наряду с примера друг:

s <сообщение> Показать сообщение пользователю через диалог.

   sh_ivtool -s "Привет, мир!"


-q <вопрос> Показать вопрос в диалоговом окне и возвращают символ 'у'
                 для 'Да' и 'п' для 'Нет'.
                 Вывод должен быть использован, только если код ошибки «0».

   ОТВЕТ = `sh_ivtool д" Да или нет? "`
   если [$? -eq 0]; затем
   Эхо $ ОТВЕТ
   еще
   эхо Молчи в тряпочку!
   фантастические


-t <сообщение> Получить ввода текста с клавиатуры, показывая сообщение в заголовке.
                 Вывод должен быть использован, только если код ошибки «0».

   ТЕКСТ = `sh_ivtool -t" Введите текст: "`
   если [$? -eq 0]; затем
     #use строка $ ТЕКСТ
   фантастические


-n <сообщение> Получить номер из цифровой клавиатурой, показывая сообщение в заголовке.
                 Вывод должен быть использован, только если код ошибки «0».

   NUM = `sh_ivtool n" Введите число: "`
   если [$? -eq 0]; затем
     #use строка $ NUM
   фантастические


d <сообщение> Получить имя каталога с помощью OpenDirectorySelector (), показывая
                 сообщение в заголовке.
                 Вывод должен быть использован, только если код ошибки «0».

   DIR = `sh_ivtool -d" Выберите папку: "`
   если [$? -eq 0]; затем
     #use строка $ DIR
   фантастические

-f <каталог> [[ext1, ext2] [ext3] ...]
                 Показать все файлы в данном каталоге и подкаталогах,
                 и возвращает имя выбранного файла. Только файлы с
                 данными расширениями показаны, если [доб] приведены.
                 OpenContent диалоговое окно используется для просмотра файлов.НАЗАД
                 кнопка используется для выхода без выбора.
                 Вывод должен быть использован, только если код ошибки «0».

                 По умолчанию, расширения разделяются пробелами и запятыми,
                 Однако, вы можете указать другой набор разделителей с помощью
                 переменная среды SHIVFS.

-F <Каталог> [[ext1, ext2] [ext3] ...]
                 То же, что для "-f", за исключением того, что только те файлы в данном каталоге
                 показаны и подкаталоги игнорируются.

   экспортные SHIVFS = ";,"
   Файл = `sh_ivtool -f" / шоссе / ext2 / my_ebooks / "" .epub, .pdf; .fb2 "" .cbr .rar "`
   если [$? -eq 0]; затем
     #use $ FILE
   фантастические

-o <opt1 [, OPT2, ...]> [[OPT4 [, opt5, ...]] ...]
                 Показать заданные опции и вернуться избранницу.
                 Опции разделяются запятыми только потому, что пространства может
                 использоваться в тексте. Если вы включать пробелы как часть
                 вариант, не забудьте поставить кавычки вокруг текста.
                 OpenContent диалог используется для отображения параметров.
                 Вывод должен быть использован, только если код ошибки «0».

   OPT = `sh_ivtool -o" opt1, OPT2, выбрать 3 "" OPT4 "`
   если [$? -eq 0]; затем
     #use $ ОПТ
   фантастические

А вот как пользоваться этим не знаю .Для -t и -n пробовал просто копировать в фаил скрипта ,пробовал копировать в начало файла и после

if [ "$dir" = "hidden" ]
then

название папки изменял,не получилось ,пробовал просто создавать фаил с именем программы AdobeViewer.app или fbreader.app и скопировать туда параметры для -n или -t  ,так же само не получилось ,книга просто не открывается и все

22

MIcov15, попробуйте
1. создать текстовый файл и узнать его полный путь. Предположим это будет /path/file.txt

2. добавить после строчки

   pass="`/mnt/ext1/system/bin/password.app 2>&1|awk -F = '/^password=/ {print $2}'`"

строчку

echo "password='$pass'" >/path/file.txt

3. почитать файл /path/file.txt после запуска скрипта, если пароль 12345, то в файле бедет

password='12345'
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

23 (31.08.2014 16:30:47 отредактировано MIcov15)

щас попробую,а нужно ли в начало скрипта писать

 fprintf (stderr,"password=%s\n", text);

?
В общем попробовал ,в файле ничего не появилось.Книга так же не зжапускается.Может программа password.app не работает?

24

MIcov15 пишет:

а нужно ли в начало скрипта писать

fprintf (stderr,"password=%s\n", text);

?

не нужно. Это вообще C, а не BASH.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

25

Я отредактировал предыдущее сообщение

26 (31.08.2014 19:11:59 отредактировано kostik87)

pass="`/mnt/ext1/system/bin/password.app 2>&1|awk -F = '/^password=/ {print $2}'`"

Вообще похоже, что вместо этого можно написать вызов password.app так:

pass="`password.app 2>&1|awk -F = '/^password=/ {print $2}'`"

Ведь заглушки для вызова программ просмотра помещаются просто в system/bin/ и вызываются оттуда сами при открытии книги определённого формата, в общем попробуйте изменить скрипт так.

Ну и ещё учтите, что в Linux учитывается регистр имён файлов, т.е. Fbreader.app и fbreader.app - это разные файлы и вам нужно создать скрипт с правильным именем, как указано выше, ну либо посмотрите какие есть программы просмотра по пути, указанном в скрипте.

27

увы,все без толку  ac

28 (31.08.2014 20:51:21 отредактировано MIcov15)

kostik87, на форуме этого ридера мне кое что исправили в скрипте ,который вы выложили выше

  pass=""
         until ! [  "$pass"=123 ]; do
             pass="`/mnt/ext1/system/bin/password.app 2>&1|awk -F = '/^password=/ {print $2}'`" 
         done

Вот сообщение:

+ открыть спойлер

В конструкции

until ! [  "$pass"=123 ]; do 

нет пробелов слева и справа от = . Это важно.

; либо используйте while вместо until , либо ! уберите bx

В скрипте нет попытки запустить системный /ebrmain/bin/bookshelf.app

Ну, и сам скрипт должен быть в UNIX-формате.

Програмка должна работать ; для проверки положите ее в applications и запустите из меню приложений bx

Я щас ухожу ,чуть позже проверю.Может и в заглушках проблема такая?

29

MIcov15 пишет:

В конструкции

until ! [  "$pass"=123 ]; do

нет пробелов слева и справа от = . Это важно.

4.2

пробелы вокруг "=" нужны. Правильно

until ! [ "$pass" == "123" ]; do

(кавычки нужны на случай, если в пароле есть пробелы и т.п. Если нет, то не нужны)

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)