This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
средства_программирования_shell [2022/06/06 10:17] val [Web сервер на shell] |
средства_программирования_shell [2025/10/19 07:52] (current) 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://unix.stackexchange.com/questions/159513/what-are-the-shells-control-and-redirection-operators|What are the shell's control and redirection operators?]] | ||
| + | |||
| * [[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.]] | ||
| + | |||
| + | * [[http://redsymbol.net/articles/unofficial-bash-strict-mode/|Use Bash Strict Mode (Unless You Love Debugging)]] | ||
| ===== Проверка синтаксиса ===== | ===== Проверка синтаксиса ===== | ||
| + | |||
| + | * [[https://www.shellcheck.net/wiki/]] | ||
| + | |||
| <code> | <code> | ||
| # apt install shellcheck | # apt install shellcheck | ||
| - | $ shellcheck script.sh | + | $ shellcheck webd/webd |
| </code> | </code> | ||
| ===== Переменные окружения ===== | ===== Переменные окружения ===== | ||
| Line 73: | Line 82: | ||
| ==== Целочисленный цикл (поиск хостов в подсети) ==== | ==== Целочисленный цикл (поиск хостов в подсети) ==== | ||
| + | |||
| + | * [[Утилита nmap#Ping диапазона адресов с verbose и debug]] | ||
| + | |||
| <code> | <code> | ||
| $ cat test_ping.sh | $ cat test_ping.sh | ||
| Line 78: | Line 90: | ||
| #!/bin/sh | #!/bin/sh | ||
| - | test -z $1 && exit 1 | + | #test -z $1 && exit 1 |
| + | #[ "$1" ] || { echo Example: ./test_ping.sh 10.5.11; exit 1; } | ||
| i=1 | i=1 | ||
| Line 84: | Line 97: | ||
| do | do | ||
| test $i = 50 && continue | test $i = 50 && continue | ||
| - | ping -c 1 -W 1 $1.$i > /dev/null 2>&1 && echo $1.$i | + | ping -c 1 -W 1 $1.$i > /dev/null 2>&1 && echo $1.$i || echo No $i |
| i=$(($i + 1)) | i=$(($i + 1)) | ||
| done | done | ||
| Line 181: | Line 194: | ||
| <code> | <code> | ||
| - | $ cat log_gen.sh | + | bash -c 'cat <<END >log_gen.sh |
| - | </code><code> | + | |
| while : | while : | ||
| do | do | ||
| Line 188: | Line 200: | ||
| logger -t cisco -p local0.info "Message 2" | logger -t cisco -p local0.info "Message 2" | ||
| done | done | ||
| + | END' | ||
| </code><code> | </code><code> | ||
| - | $ sh cisco_log_gen.sh | + | $ sh log_gen.sh |
| </code> | </code> | ||
| ===== Примеры использования скриптов sh в системах загрузки ===== | ===== Примеры использования скриптов sh в системах загрузки ===== | ||
| Line 369: | Line 382: | ||
| * [[http://underpop.online.fr/c/cgi/docs/creating-cgi-programs-with-bash/|Creating CGI Programs with Bash: Introduction]] | * [[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://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 ==== | ||
| + | |||
| + | * [[Сервис HTTP]] | ||
| + | * [[Переменные окружения#Чтение значений переменных окружения]] | ||
| <code> | <code> | ||
| Line 378: | Line 396: | ||
| #!/bin/bash | #!/bin/bash | ||
| base=/var/www | base=/var/www | ||
| + | #exec 2>>/var/log/webd.log | ||
| + | #echo "ARGS: $*" >&2 | ||
| read request | read request | ||
| + | ##echo "$request" >&2 # for educational demonstration | ||
| + | |||
| + | filename="${request#GET }" | ||
| + | filename="${filename% HTTP/*}" | ||
| + | |||
| + | test $filename = "/" && filename="/index.html" | ||
| + | |||
| + | filename="$base$filename" | ||
| while : | while : | ||
| do | do | ||
| - | read header | + | read -r header |
| + | ## echo "$header" >&2 # for educational demonstration | ||
| [ "$header" == $'\r' ] && break; | [ "$header" == $'\r' ] && break; | ||
| + | ## [ "$header" == $'' ] && break; # for STDIN/STDOUT educational demonstration | ||
| done | done | ||
| - | |||
| - | url="${request#GET }" | ||
| - | url="${url% HTTP/*}" | ||
| - | |||
| - | test $url = "/" && url="/index.html" | ||
| - | |||
| - | filename="$base$url" | ||
| if [ -e "$filename" ] | if [ -e "$filename" ] | ||
| then | then | ||
| + | # echo `date` OK $filename on `hostname` >&2 | ||
| echo -e "HTTP/1.1 200 OK\r" | echo -e "HTTP/1.1 200 OK\r" | ||
| - | echo -e "Content-Type: `/usr/bin/file -bi \"$filename\"`\r" | + | echo -e "Content-Type: $(/usr/bin/file -bi "$filename")\r" |
| echo -e "\r" | echo -e "\r" | ||
| /bin/cat "$filename" | /bin/cat "$filename" | ||
| else | else | ||
| + | # echo "$(date)" ERR "$filename" on "$(hostname)" >&2 | ||
| echo -e "HTTP/1.1 404 Not Found\r" | echo -e "HTTP/1.1 404 Not Found\r" | ||
| echo -e "Content-Type: text/html;\r" | echo -e "Content-Type: text/html;\r" | ||
| echo -e "\r" | echo -e "\r" | ||
| - | echo -e "<h1>Not Found</h1>" | + | echo -e "<h1>File $filename Not Found</h1>" |
| + | # ip=$(awk '/32 host/ { print f } {f=$2}' /proc/net/fib_trie | sort -u | grep -v 127.0.0.1) | ||
| + | # echo -e "Host: $(hostname), IP: $ip, ver 1.1" | ||
| fi | fi | ||
| - | |||
| </code> | </code> | ||
| Line 415: | Line 441: | ||
| ==== Ресурсы Web сервера на shell ==== | ==== Ресурсы Web сервера на shell ==== | ||
| <code> | <code> | ||
| - | # mkdir /var/www | + | # mkdir -p /var/www/img |
| # cat /var/www/index.html | # cat /var/www/index.html | ||
| Line 424: | Line 450: | ||
| </html> | </html> | ||
| </code><code> | </code><code> | ||
| - | # mkdir /var/www/img | + | # wget -O /var/www/img/logo.gif https://val.bmstu.ru/unix/Media/logo.gif |
| - | </code> | + | |
| - | + | ||
| - | <code> | + | |
| - | # wget -O /var/www/img/logo.gif http://val.bmstu.ru/unix/Media/logo.gif | + | |
| </code> | </code> | ||
| + | * [[Сервис INETD]] | ||
| + | * [[Управление сервисами в Linux#Systemd Sockets]] | ||
| ==== Проверка ==== | ==== Проверка ==== | ||
| Line 440: | Line 464: | ||
| * [[Сервис Asterisk#Asterisk AGI]] | * [[Сервис Asterisk#Asterisk AGI]] | ||
| + | |||
| + | ==== Отправка email с вложениями ==== | ||
| + | |||
| + | * [[Утилита curl]] | ||
| + | * [[https://serverfault.com/questions/38919/send-an-email-with-an-attached-file-using-telnet-or-netcat|Send an email with an attached file using telnet or netcat]] | ||
| + | |||
| + | <code> | ||
| + | $ cat mail.sh | ||
| + | </code><code> | ||
| + | #!/bin/sh | ||
| + | |||
| + | [ -f "$1" ] || { echo Example: ./mail.sh attach_file_name; exit 1; } | ||
| + | |||
| + | EMAIL="val@bmstu.ru" | ||
| + | MAILSERVER="mailhub.bmstu.ru" | ||
| + | FILENAME=$1 | ||
| + | |||
| + | { | ||
| + | sleep 2; | ||
| + | echo "EHLO $MAILSERVER"; sleep 1; | ||
| + | echo "MAIL FROM: <$EMAIL>"; sleep 1; | ||
| + | echo "RCPT TO: <$EMAIL>"; sleep 1; | ||
| + | echo "DATA"; sleep 1; | ||
| + | echo "To: $EMAIL" | ||
| + | echo "Subject: $FILENAME" | ||
| + | echo "MIME-Version: 1.0 (mime-construct 1.9)" | ||
| + | echo "Content-Type: $(/usr/bin/file -bi $FILENAME); name=\"$FILENAME\"" | ||
| + | echo "Content-Transfer-Encoding: base64"; | ||
| + | echo | ||
| + | cat $FILENAME | openssl base64; | ||
| + | echo '.'; | ||
| + | echo "QUIT"; | ||
| + | echo | ||
| + | } | nc $MAILSERVER 25 | ||
| + | </code> | ||
| ==== Использование диалоговых окон ==== | ==== Использование диалоговых окон ==== | ||
| + | |||
| + | <code> | ||
| + | ansible-pull-gpo# cat start.sh | ||
| + | </code><code> | ||
| + | #!/bin/bash | ||
| + | |||
| + | on_off() { | ||
| + | grep -q "$1" "$2" && echo ON || echo OFF | ||
| + | } | ||
| + | |||
| + | if [ -z ${BR+x} ]; then echo -e "Variable BR (branch) is not set, specify, for example\nexport BR=master"; exit 1; fi | ||
| + | |||
| + | apt update || exit 0 | ||
| + | |||
| + | apt install dialog ansible git -y | ||
| + | |||
| + | GP_OP_FILE=/usr/local/etc/gpo_options.yml | ||
| + | GP_EX_FILE=/usr/local/bin/ansible-pull-gpo.sh | ||
| + | |||
| + | TEMP_FILE=$(mktemp -t 'XXXX') | ||
| + | |||
| + | touch "$GP_OP_FILE" | ||
| + | |||
| + | dialog --title "Configurations, Roles and Programs" --clear --nocancel\ | ||
| + | --checklist "Choose Options" 19 56 15 \ | ||
| + | CONF_RUS_INT: "Russian Interface" "$(on_off CONF_RUS_INT "$GP_OP_FILE")" \ | ||
| + | PROG_THBIRD: "Mail client Thunderbird" "$(on_off PROG_THBIRD "$GP_OP_FILE")" \ | ||
| + | ROLE_ZAB_AG: "Zabbix Agent" "$(on_off ROLE_ZAB_AG "$GP_OP_FILE")" \ | ||
| + | ROLE_OVPN1_CL: "OpenVPN Client" "$(on_off ROLE_OVPN1_CL "$GP_OP_FILE")" \ | ||
| + | 2>"$TEMP_FILE" | ||
| + | |||
| + | < "$TEMP_FILE" tr " " "\n" > "$GP_OP_FILE" | ||
| + | |||
| + | rm "$TEMP_FILE" | ||
| + | |||
| + | echo -e "\nEND:" >> "$GP_OP_FILE" | ||
| + | |||
| + | echo "/usr/bin/ansible-pull -U http://server.corpX.un/student/ansible-pull-gpo.git -C $BR -e @$GP_OP_FILE" > "$GP_EX_FILE" | ||
| + | |||
| + | chmod +x "$GP_EX_FILE" | ||
| + | |||
| + | ##exit 0 | ||
| + | |||
| + | echo -e "0 */2 * * * sleep \${RANDOM:0:2}m; $GP_EX_FILE\n@reboot sleep 3m; $GP_EX_FILE" | crontab - | ||
| + | |||
| + | "$GP_EX_FILE" | ||
| + | |||
| + | #apt upgrade -y | ||
| + | |||
| + | #reboot | ||
| + | </code> | ||
| === Использование программы whiptail (Linux) === | === Использование программы whiptail (Linux) === | ||