This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
средства_программирования_shell [2018/10/19 13:13] val [Система загрузки SysV (Linux)] |
средства_программирования_shell [2022/09/22 11:44] val [Web сервер на shell] |
||
---|---|---|---|
Line 4: | Line 4: | ||
* [[http://mywiki.wooledge.org/BashFAQ|Часто задаваемые вопросы про bash (eng)]] | * [[http://mywiki.wooledge.org/BashFAQ|Часто задаваемые вопросы про bash (eng)]] | ||
* [[https://habrahabr.ru/post/335960/|Играючи BASH'им]] | * [[https://habrahabr.ru/post/335960/|Играючи BASH'им]] | ||
+ | |||
* [[https://youtu.be/GxVmukxVUo0|Видео урок]] | * [[https://youtu.be/GxVmukxVUo0|Видео урок]] | ||
+ | |||
* [[https://www.tutorialspoint.com/execute_bash_online.php|Execute Bash Shell Online]] | * [[https://www.tutorialspoint.com/execute_bash_online.php|Execute Bash Shell Online]] | ||
+ | * [[https://www.shellcheck.net/|ShellCheck finds bugs in your shell scripts.]] | ||
+ | |||
+ | ===== Проверка синтаксиса ===== | ||
+ | <code> | ||
+ | # apt install shellcheck | ||
+ | |||
+ | $ shellcheck webd/webd | ||
+ | </code> | ||
===== Переменные окружения ===== | ===== Переменные окружения ===== | ||
Line 62: | Line 72: | ||
===== Примеры простых алгоритмов и вариантов использования ===== | ===== Примеры простых алгоритмов и вариантов использования ===== | ||
+ | |||
+ | * [[Коды завершения#Проверка наличия аргументов в скриптах]] | ||
==== Целочисленный цикл (поиск хостов в подсети) ==== | ==== Целочисленный цикл (поиск хостов в подсети) ==== | ||
Line 79: | Line 91: | ||
done | done | ||
</code><code> | </code><code> | ||
- | $ cat test_arp_ping.sh | + | $ cat arp_ping.sh |
</code><code> | </code><code> | ||
#!/bin/sh | #!/bin/sh | ||
Line 88: | Line 100: | ||
while : | while : | ||
do | do | ||
- | ping -c 1 -W 1 $1.$i > /dev/null 2>&1 | + | ip=$1.$i |
- | arp -an | grep "($1.$i)" | grep -q ':..:..:' && echo + $1.$i || echo - $1.$i | + | |
+ | ping -c 1 -W 1 $ip >/dev/null | ||
+ | ip n | grep "$ip " | grep -q ':..:..:' && echo $ip | ||
i=$(($i + 1)) | i=$(($i + 1)) | ||
test $i -eq 254 && break | test $i -eq 254 && break | ||
Line 348: | Line 363: | ||
===== Дополнительные материалы ===== | ===== Дополнительные материалы ===== | ||
+ | ==== Расширения BASH ==== | ||
+ | <code> | ||
+ | $ echo a{1..5}b | ||
+ | |||
+ | $ echo a{1,3,5}b | ||
+ | </code> | ||
==== CGI на shell ==== | ==== CGI на shell ==== | ||
- | * [[http://www.team2053.org/docs/bashcgi/gettingstarted.html|Creating CGI Programs with Bash: Getting Started]] | + | * [[http://underpop.online.fr/c/cgi/docs/creating-cgi-programs-with-bash/|Creating CGI Programs with Bash: Introduction]] |
+ | * [[https://debian-administration.org/article/371/A_web_server_in_a_shell_script|A web server in a shell script]] | ||
+ | * [[https://stackoverflow.com/questions/16640054/minimal-web-server-using-netcat|Minimal web server using netcat]] | ||
+ | * [[https://funprojects.blog/2021/04/11/a-web-server-in-1-line-of-bash/|A Web Server in 1 Line of Bash Code]] | ||
==== Web сервер на shell ==== | ==== Web сервер на shell ==== | ||
- | * [[https://debian-administration.org/article/371/A_web_server_in_a_shell_script|A web server in a shell script]] | + | * [[Сервис HTTP]] |
- | === Debian/Ubuntu === | ||
<code> | <code> | ||
# cat /usr/local/sbin/webd | # cat /usr/local/sbin/webd | ||
Line 362: | Line 385: | ||
#!/bin/bash | #!/bin/bash | ||
base=/var/www | base=/var/www | ||
+ | log=/var/log/webd.log | ||
read request | read request | ||
Line 367: | Line 391: | ||
while : | while : | ||
do | do | ||
- | read header | + | read -r header |
[ "$header" == $'\r' ] && break; | [ "$header" == $'\r' ] && break; | ||
done | done | ||
Line 373: | Line 397: | ||
url="${request#GET }" | url="${request#GET }" | ||
url="${url% HTTP/*}" | url="${url% HTTP/*}" | ||
- | filename="$base$url" | ||
- | echo -e "HTTP/1.1 200 OK\r" | + | test $url = "/" && url="/index.html" |
- | echo -e "Content-Type: `/usr/bin/file -bi \"$filename\"`\r" | + | |
- | echo -e "\r" | + | |
- | /bin/cat "$filename" | ||
- | </code> | ||
- | |||
- | === FreeBSD === | ||
- | <code> | ||
- | # cat /usr/local/sbin/webd | ||
- | </code><code> | ||
- | #!/bin/sh | ||
- | base=/var/www | ||
- | |||
- | read request | ||
- | |||
- | url="${request#GET }" | ||
- | url="${url% HTTP/*}" | ||
filename="$base$url" | filename="$base$url" | ||
- | echo "HTTP/1.1 200 OK" | + | if [ -e "$filename" ] |
- | echo "Content-Type: `/usr/bin/file -bi \"$filename\"`" | + | then |
- | echo "" | + | echo `date` OK $url >> $log |
- | + | echo -e "HTTP/1.1 200 OK\r" | |
- | /bin/cat "$filename" | + | echo -e "Content-Type: $(/usr/bin/file -bi \"$filename\")\r" |
+ | echo -e "\r" | ||
+ | /bin/cat "$filename" | ||
+ | else | ||
+ | echo "$(date)" ERR $url >> $log | ||
+ | echo -e "HTTP/1.1 404 Not Found\r" | ||
+ | echo -e "Content-Type: text/html;\r" | ||
+ | echo -e "\r" | ||
+ | ip=$(cat /proc/net/fib_trie | awk '/32 host/ { print f } {f=$2}' | sort -u | grep -v 127.0.0.1) | ||
+ | echo -e "<h1>$url Not Found in container $(hostname) with ip $ip</h1>" | ||
+ | echo "ver 1.1" | ||
+ | fi | ||
</code> | </code> | ||
- | === Debian/Ubuntu/FreeBSD === | ||
<code> | <code> | ||
# chmod +x /usr/local/sbin/webd | # chmod +x /usr/local/sbin/webd | ||
+ | </code> | ||
+ | ==== Ресурсы Web сервера на shell ==== | ||
+ | <code> | ||
# mkdir /var/www | # mkdir /var/www | ||
Line 418: | Line 438: | ||
</code> | </code> | ||
- | === Debian/Ubuntu === | ||
<code> | <code> | ||
# wget -O /var/www/img/logo.gif http://val.bmstu.ru/unix/Media/logo.gif | # wget -O /var/www/img/logo.gif http://val.bmstu.ru/unix/Media/logo.gif | ||
</code> | </code> | ||
- | === FreeBSD === | + | ==== Проверка ==== |
<code> | <code> | ||
- | # fetch -o /var/www/img/logo.gif http://val.bmstu.ru/unix/Media/logo.gif | + | http://server.corpX.un/ |
</code> | </code> | ||
- | |||
==== Asterisk AGI ==== | ==== Asterisk AGI ==== | ||
- | * [[Сервис Asterisk#Тарификация звонков]] | + | * [[Сервис Asterisk#Asterisk AGI]] |
Line 438: | Line 457: | ||
* [[http://rus-linux.net/MyLDP/consol/whiptail.html|Создание диалоговых боксов в интерактивных скриптах оболочки]] | * [[http://rus-linux.net/MyLDP/consol/whiptail.html|Создание диалоговых боксов в интерактивных скриптах оболочки]] | ||
+ | * [[https://unix.stackexchange.com/questions/286103/change-edit-text-of-whiptail-gauge|Change/edit text of whiptail gauge]] | ||
=== Использование программы dialog (FreeBSD) === | === Использование программы dialog (FreeBSD) === | ||
Line 488: | Line 508: | ||
%manager ALL = NOPASSWD: /etc/rc.d/pf reload | %manager ALL = NOPASSWD: /etc/rc.d/pf reload | ||
</code> | </code> | ||
- | |||
==== Работа с mysql ==== | ==== Работа с mysql ==== | ||
<code> | <code> | ||
Line 498: | Line 517: | ||
mysql mybd -B --skip-column-names -e "$sql" | mysql mybd -B --skip-column-names -e "$sql" | ||
+ | </code> | ||
+ | |||
+ | ===== Отладка ===== | ||
+ | |||
+ | <code> | ||
+ | set +x | ||
+ | set -n | ||
</code> | </code> |