LinuxForum.Fans
Тема

Запрос ввода из скрипта

Автор: sotariz 31 сообщений 11053 просмотров
#343516

Спасибо всем за участие! Но ребята, почти весь этот спор не имеет смысла.... все что я хотел бы сделать так это проверку случайного нажатия shift при вводе чисел, более чем достаточно.
А вот в продолжение реализации сего чудо-действенного скрипта возник вопрос...
Как же правильно разложить все это в скрипте.
1. Спрашиваем значение переменной (имя ключа)
2. Проверяем ввод и при необходимости заменяем
3. Если замены не было выполняем генерацию
4. Если замена была выводим что вышло и спрашиваем пользователя продолжать или нет
5. Пользователь ответил ДА - выполняем пункт 3
6. Если пользователь ответил НЕТ - выполняем пункт 1

text

name()
{
        echo "имя?"
        read VALUE
        CLIENT_NAME=$(echo $VALUE | tr "[:cntrl:][:space:]/?~!@#$%^&*()+=|\"\'\`\\,." "-")
}
if [ "$VALUE" == "$CLIENT_NAME" ]
        then
                gen-key ()
                {
                        генерируем ключ и выполняем все что задумали
                }
        else
                echo "Ошибка"
                echo $CLIENT_NAME
                echo "Использовать это?(y/n)"
                read ANSWER
                if [ "$ANSWER" == "Y" ] || [ "$ANSWER" == "y" ] || [ "$ANSWER" == "N" ] || [ "$ANSWER" == "n" ]
                        then
                                 if [ "$ANSWER" == "Y" ] || [ "$ANSWER" == "y" ]
                                        then
                                                gen-key (использовал while do done, как правильно?)
                                        else
                                                name
                                fi
                        else
                                echo "Операция прервана!"
                fi
fi

Так не выполняется, точнее ничего не запрашивает. Если выполнять от обычного пользователя ругается что нет доступа (логично), а если от рута то просто спустя секунду я снова в консоли.

#343712

sotariz,

1. у вас синтаксически неверная функция внутри блока if/then/fi с именем gen-key

Кроме того, не советую писать имя функции через "минус" (-). Используйте подчерк, gen_key.

2. функция в bash НЕ выполняется в первый раз. Это её описание. Например:

text
#!/bin/bash
# не забываем в первой строке указывать ЯП, их много, и у них разный синтаксис!

пожарить_рыбу() { кинуть рыбу на сковородку, и жарить 5 минут рыба готова }

if мы_поймали_рыбу then пожарить_рыбу fi

в этом коде сначала выполняется функция(её мне лень писать) мы_поймали_рыбу, и если она удачно выполнилась, то выполняется функция пожарить_рыбу.

#343722

drBatty, про первую строку понятно, я просто передавал примерную структуру
суть уловил, буду пробовать дальше. Спасибо! :)

UPD
При проверке имени добавляется лишний символ замены в конец имени, от чего это?

text
./keys-creater.sh
Введи имя клиента:
test&key%ovpn
Была допущена ошибка ввода, имя преобразовано в:
test-key-ovpn-
Использовать это имя для генерации ключей?(y/n)
n
Введи имя клиента:
^C
#343724

sotariz, первая строка с интерпретатором вопервых мне нужна, ибо сложно понять, ЧТО вы тут написали, вот так с ходу. Во вторых вашей ОС. Ей тоже так проще. Не всегда bash === /bin/sh.

#343728
"drBatty" написал:
первая строка с интерпретатором

#!/bin/bash

"drBatty" написал:
Во вторых вашей ОС

Debian 7

#343731

В целом выглядит так... топорно, но главное результат :)

text
cat keys-creater.sh
#!/bin/bash
name()
{
        echo "Введи имя клиента:"
        read VALUE
        CLIENT_NAME=$(echo $VALUE | tr "[:cntrl:][:space:]/?~!@#$%^&*()+=|\"\'\`\\,." "-")
}

gen_key() { echo "Начинается генерация ключей, дождитесь завершения..." cd /etc/openvpn/easy-rsa/2.0/ source ./vars ./pkitool $CLIENT_NAME cp keys/"$CLIENT_NAME".* ../../keys/ cd /etc/openvpn/ccd/ touch $CLIENT_NAME echo "ifconfig-push 10.0.0.100 10.0.0.101" > $CLIENT_NAME cd /etc/openvpn/easy-rsa/2.0/ mkdir -p /home/sotariz/vpn-keys/$CLIENT_NAME cp keys/"$CLIENT_NAME".* /home/sotariz/vpn-keys/$CLIENT_NAME/ cp keys/ca.crt ../../keys/ta.key keys/dh2048.pem /home/sotariz/vpn-keys/$CLIENT_NAME

echo "client" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf echo "dev tun" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf echo "remote xxx.xxx.xxx.xxx" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf echo "resolv-retry infinite" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf echo "nobind" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf echo "persist-key" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf echo "persist-tun" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf echo "ca /etc/openvpn/ca.crt" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf echo "cert /etc/openvpn/$CLIENT_NAME.crt" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf echo "key /etc/openvpn/$CLIENT_NAME.key" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf echo "comp-lzo" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf echo "float" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf echo "verb 3" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf echo "script-security 2" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf echo "tls-client" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf echo "tls-auth /etc/openvpn/ta.key 1" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf echo "auth MD5" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf echo "cipher BF-CBC" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf echo "ns-cert-type server" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf

sleep 5 echo "...done!" }

name

if [ "$VALUE" == "$CLIENT_NAME" ] then gen_key else echo "Была допущена ошибка ввода, имя преобразовано в:" echo $CLIENT_NAME echo "Использовать это имя для генерации ключей?(y/n)" read ANSWER if [ "$ANSWER" == "Y" ] || [ "$ANSWER" == "y" ] || [ "$ANSWER" == "N" ] || [ "$ANSWER" == "n" ] then if [ "$ANSWER" == "Y" ] || [ "$ANSWER" == "y" ] then gen_key else name fi else echo "Ошибка ввода!" echo "Операция прервана!" fi fi

#343744
"sotariz" написал:
Debian 7
там вроде по дефолту в некоторых случаях более простенький dash http://ru.wikipedia.org/wiki/Debian_Almquist_shell

"sotariz" написал:
cp keys/"$CLIENT_NAME".* ../../keys/

тут не нужны кавычки ИМХО

"sotariz" написал:
echo "client" >> /home/sotariz/vpn-keys/$CLIENT_NAME/"$CLIENT_NAME".conf
что-бы так не мучится, используйте встроенные документы http://www.bash-scripting.ru/abs/chunks/ch18.html

"sotariz" написал:
но главное результат
угу. Это же скрипт, а не программный продукт...
#343751

Но вот все же как побороть вставку символа замены в конец?.. какого лешего он вообще туда попадает? 0_о

#343779

Вместо "echo $VALUE ..." нужно "echo -n $VALUE ..." поскольку echo добавляет в конец вывода перевод строки "\n"?

#343797

bormant, ну то что это реакция на Enter я предполагал, сейчас попробую с -n

#343904
"sotariz" написал:
Но вот все же как побороть вставку символа замены в конец?.. какого лешего он вообще туда попадает? 0_о

вот так сделайте:

text
$ read -p'Введите текст: ' VALUE; echo "VALUE: '$VALUE'"
Введите текст: aaa
VALUE: 'aaa'
Войдите или зарегистрируйтесь, чтобы ответить.