Несмотря на разнообразие (sh
, csh
, bash
, zsh
), все командные интерпретаторы обладают схожим набором возможностей, включающие
в себя язык скриптового программирования. Рассмотрим основные возможности интерпретатора bash
:
Задаём значение:
DATESTR=`date` # угловые кавычки сохраняют стандартный вывод в переменной
UNIXTIMESTAMP=`date +%s`
Используем переменные:
echo "Дата по человечески: $DATESTR"
echo "Дата по компьютерному: $UNIXTIMESTAMP"
Аналог switch
, однако с другим синтаксисом:
#считываение ввода пользователя
echo -n 'Ваша любимый ЯП'
read lang
#осуществляем сравнения с шаблонами
case $lang in
php)
echo "серьезно?";;
js|javascript)
echo 'вранье';;
cpp)
echo 'вы помещением не ошиблись?';;
esac
#простая последовательность чисел и текста
#всё в одну строку
for value in 'one' 'two' 3 4; do echo $value; done
#на отдельных строках
for value in 'one' 'two' 3 4
do
echo $value
done
#перебор подготовленного массива в цикле
langs=('PHP' 'JS' 'SQL')
for lang in ${langs[@]}
do
echo $lang
done
#использование подстановочного механизма
for letter in {a..z}
do
echo $letter
done
#перебираем результат выполнения команды
for file in $(ls ~/)
do
echo $file
done
for
классическийfor ((i=1; i<=15 ; i++))
do
echo $i
done
#выполняем пока счетчик ниже порогового значения
counter=0
while [[ $counter -le 20 ]]
do
echo $counter
(( counter++ ))
done
# чтения потока ввода по строкам:
counter=0
while read line
do
echo "$counter: $line"
(( counter++ ))
done
В bash
нет полноценного механизма возвращения значений из функций, поэтому подпрограммы реализуют возврат результата через стандартный вывод, в месте
вызова значение сохраняется с помощью угловых кавычек (backtick)
ssh
, rsync
, ftp
, telnet
, netcat
, sshfs
)Крайне популярная программа для сетевого доступа к терминалу, ко всему прочему позволяет передавать файлы и потоки ввода-вывода через шифрованный туннель для данных. Этот набор возможностей, в комбинации с возможностями потоков ввода-вывода утилит и ssh-ключами позволяет автоматизировать любой процесс через сеть. SSH часто используется как транспорт другими программами.
Существует ssh сервер (sshd
) и ssh клиент (ssh
).
Как в putty:
ssh user@host
SSH позволяет не только заходить на сервер удаленно, но и запускать там команды:
Как видите, ssh
при этом перенаправляет потоки ввода вывода с удаленной стороны на локальный компьютер и назад.
ssh умеет использовать криптографические ключи для аутентификации. Очень нужная штука в условиях, когда ssh используется
не изредка и напрямую, а как транспорт в другой программе (sshfs
, rsync
, so on)
rsync означает Remote Syncronization. Утилита, которая позволяет скопировать файлы с другого компьютера по сети, при этом используя разные протоколы (ftp, ssh, ...) и экономя трафик (копируя только измененные файлы). Используется для бэкапов и, наоборот, деплоя.
FTP (File Transfer Protocol) - протокол, который изначально был задуман для закачки и скачки файлов и папок по сети. Для работы требуется ftp сервер и ftp клиент. Клиенты:
Telnet - программа для удаленного доступа, которая обеспечивает передачу терминала по сети. Нешифрованная предтеча ssh. Однако, во времена, когда
telnet
придумали, еще не было множества клиентов для интернет-сервисов, поэтому многие сервисы имеют дружественный к telnet
сетевой протокол. Например:
И до сих пор telnet
удобен для проверки работы почти или вебсервера.
Программа для перенаправление потоков ввода-вывода в TCP-соединения
# Изобразим из себя веб-браузер
echo "GET http://gitlab.a-level.com.ua/" | netcat gitlab.a-level.com.ua 80
# Изобразим из себя веб-сервер
(echo -e "HTTP/1.1 200 OK\nContent-Type: text/html\n\n Hello World";) | nc -vv -l -p 8080
# Создадим одноразовый вебсервер для отдачи файла однократно
(echo -e "HTTP/1.1 200 OK\nContent-Disposition: attachment; filename=целевое-имя-которое-увидит-клиент\nContent-Type: application/octet-stream\nConnection: close\n"; cat имя-файла-на-диске ) | nc -vv -l -p 8080
Про sshfs
говорилось, эта программа использует подсистему FUSE (filesystem in the user space) для создания виртуальной файловой системы, в которой вы можете работать с файлами через сеть используя
ssh
.
В целом команда работает аналогично любому монтированию:
sshfs <шо подключить> <куда подключить>
Однако скриптинг позволяет упростить и эту несложную операцию:
#!/bin/bash
# vim: filetype=sh
SSHFS_ROOT="$HOME/sshfs"
PERSISTENT_CHECK_TIMEOUT=5
if [ "$1" == '' ] ; then
echo "Usage: $0 user@host:remotepath - Single mount"
echo 'Sample: `sfs guest@example.com:` - mounts home directory of guest on exapmle.com into your home on localhost in folder sshfs: ~/sshfs/example.com/guest/'
echo "Usage: $0 user@host:remotepath -p & - Persistent mount"
echo 'Sample: `sfs guest@example.com: -p &` - Same as previous sample, but sfs works in background and checks for some files in local mount directory. If there no files found'
echo ' it tries to remount remote directory again. Useful for non-stable connections like fucking ukrtelecom or GPRS.'
echo ' REQUIRES SSH KEY AUTHENTICATION FOR PROMPTLESS sshfs MOUNT'
exit 1
fi
USER=`echo $1 | cut -f 1 -d '@'`
echo "User: $USER"
HOST=`echo $1 | cut -f 2 -d '@'`
HOST=`echo $HOST | cut -f 1 -d ':'`
echo "Host: $HOST"
SSHFS_PATH="$SSHFS_ROOT/$HOST/$USER"
mkdir -p $SSHFS_PATH > /dev/null 2>&1
sshfs -o reconnect,ServerAliveInterval=15,ServerAliveCountMax=3 $1 $SSHFS_PATH
if [ "$2" == '-p' ] ; then
echo "Persistent mode. Are you sure that you already set your public key on $1 ?"
while true ; do
sshfs $1 $SSHFS_PATH > /dev/null 2>&1
sleep $PERSISTENT_CHECK_TIMEOUT
done
fi
rsync умеет --link-dest, а именно - синхронизировать удаленное дерево, на базе предыдущего бэкапа, делая хардлинки на неизменные файлы.
Что нужно для того, что бы сделать свой личный скриншот-хостинг?
если есть mysqldump
, mysql
и ssh
, как залить дамп базы на сервер без лишнего головняка?