Список команд, которые иногда вылетают из головы, но которыми так или иначе приходится часто пользоваться.
- ssh-keygen
- scp
- tar gz
Команды
Добавить ssh ключ
Как не вводить пароль при подключении к ssh
Генерация ключа
Не обязательно делать, если вы уже генерировали, поскольку вы можете затереть уже существующий ключ, а значит есть вероятность потерять контроль над теми доступами, к которым этот ключ создавался.
ssh-keygen -t rsa
После создаются два ключа: приватный (/home/username/.ssh/id_rsa
), публичный (/home/username/.ssh/id_rsa.pub
)
Добавление ключа не сервер
Вариант 1
ssh-copy-id demo@198.51.100.0
(для MacOS может потребоваться установить ssh-copy-id)
Вариант 2
cat ~/.ssh/id_rsa.pub | ssh demo@198.51.100.0 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys"
Редактирование файлов через SSH
sudo apt install sshfs
mkdir ~/remote_code
sshfs $USER@remote.example.com:/home/$USER/code ~/remote_code
если необходимо примомнтировать папку без возможности изменения, т.е. в read-only, то при монтировании необходимо добавить ключ -o ro
sshfs $USER@remote.example.com:/home/$USER/code ~/remote_code -o ro
Запуск команд на SSH из файла
cat script.sh | ssh user@server /bin/bash
SCP — копирование файлов через ssh
Использование
Скопировать локальный файл на сервер:
scp file.gz root@server.my:/home/dir
Скопировать всё содержимое папки на сервере (рекурсивно) в локальную папку (с подробным выводом):
scp -r root@server.my:/home/dir/ /home/local/my/
Между серверами:
scp -r root@server1.my:/home/dir/ root@server2.my:/home/dir/
С указанием порта:
scp -P 9999 file.zip user@server.my:~/
Копирование с удаленного сервера через несколько ssh:
scp -r -oProxyJump=user@host user@host2:/path/to/source/folder/ /path/to/destination/folder/
scp -oProxyJump=userB@hostB,userC@hostC infile.txt userD@hostD:"~/outfile.txt"
Копирование на удаленный север hostC (используя выполнение команды):
scp -oProxyCommand="ssh hostB socat stdio tcp:%h:%p" thefile hostC:destination
Дополнительные флаги
-r — рекурсивное копирование (для директорий)
-C — использовать сжатие при передачи
-P — порт ssh
Автоподстановка команды из истории (autocomplete from history)
Для поиска можно пользоваться CTRL+R
но можно дополнительно добавить автодополение из истории
добавляет поведение на кнопки вверх и вниз
cat >> ~/.inputrc <<'EOF'
"\e[A": history-search-backward
"\e[B": history-search-forward
EOF
перезагружаем текущую сессию терминала
bind -f ~/.inputrc
Создать папку, если её нет
Вариант 1
[[ -d dir ]] || mkdir dir
Вариант 2
mkdir -p dir
TAR GZ — Создание архива
Как создать архив .tar.gz
tar -cvf file.tar /full/path - создать .tar
tar -czvf file.tar.gz /full/path - создать .tar.gz (архив)
tar -cjvf file.tar.bz2 /full/path - создать .tar.bz2 (архив)
Синтаксис этих примеров:
tar [-ключи] [название архива] [путь, что запаковать]
Как открыть (распаковать) .tar
Чтобы распаковать запаковывай .tar: tar -xvf file.tar.gz
Синтаксис: tar [-ключи] [название архива]
Распаковка всех файлов
бывает так, что структура вся правильная, но во всех папках лежат отдельные архивы каждого файла. В этом случае можно воспользоваться утилитой find
в этом случае команда будет выглядеть так (правда тут используется gunzip в качестве распаковщика):
find . -name '*.gz' -exec gunzip '{}' \;
Ключи архиватора
с — (Create) создать архив.
z – создает архив .tar.gz
j — создает архив .tar.bz2
x — (eXtract) позволяет вам извлекать файлы из архива.
v — делает вывод tar подробным. Это означает, что на экран будут выведены все найденные в архиве файлы. Если эта опция опущена, информация, выводимая в процессе обработки, будет ограничена.
f — является обязательной опцией. Без неё tar пытается использовать магнитную ленту вместо файла архива.
z — позволяет вам обрабатывать архив, сжатый gzip’ом (с расширением .gz). Если вы забудете указать эту опцию, tar выдаст ошибку. И наоборот, эта опция не должна использоваться для несжатых архивов.
t — (Test) просмотреть содержимое архива.
Поиск
Поиск файла с именем thisfile.txt
в текущей директории
find . -name thisfile.txt
Поиск всех файлов с расширением *.jpg
в папке /home
find /home -name ""*.jpg"
Поиск пустых файлов в текущей директории
find . -type f -empty
Поиск всех .db
файлов (без учета регистра) измененные в течении предыдущих 6 дней пользователем randomperson
find /home -user randomperson -mtime 6 -iname ".db"
другие варианты можно посмотреть на сайте plesk
Циклы
Создание 100 пустых файлов размером 10кб
for (( i = 0; i < 100; i++ )) { fallocate -l 10k empty$i.txt; }
Поиск файлов в папке, в названиях которых могут быть пробелы
IFS=$'\n' # разделитель
for file in $(find . -name "*" -printf "%p\n")
do
echo "${file}"
done
Строки
Замена в строке
Формат sed
sed "s/AAAA/BBBB/options"
Поиск в строках в файлах
grep -rnw ./ -e "string-to-search"
`-r` - рекурсивно, в поддиректориях (не следовать по ссылкам в отличии от `-R`)
`-n` - номер строки
`-w` - искать целое слово
`-e` - следовать паттерну
Вывести окружающих строк для grep: -B (--before-context)
, -A (--after-context)
, -C (--context)
Поиск через less. Внутри программы нажать / и вводить текст, будет выделен искомый текст
less path/to/file
Замена текста в строке
find . -type f -exec sed -i 's/string-to-find/replacement-string/g' {} +
Удаление строк содержащих определенное слово в файлах *.txt
sed -i '/\<keyword\>/d' *.txt
Удаление одинарных кавычек в строке
tr -d \''\\'
Удаление двойных кавычек или замена текста
awk '{gsub("\"", "", $1); print $1}'
Считывание элементов из строки
Строка будет разделена пробелами, где каждое значение будет размещено в соответствующие индекса переменные $0, $1..$n. При указание директивы -F будет работать с файлом
awk -F'"' '{print "set", $4, "\""$6"\""}' testme.csv
Команда подсчитывает количество слов, строк или символов в файле:
wc -l path/to/file # количетсво строк
-c
— bytes
-m
— chars
-l
— lines
-L
— longest line length
w
— words
Проверка является ли строка цифровой
re='^[0-9]+$'
if ! [[ $yournumber =~ $re ]] ; then
echo "error: Not a number" >&2; exit 1
fi
Подтверждение выполнения скрипта
read -p "Are you sure? " -n 1 -r
echo # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]
then
# do dangerous stuff
fi
Вывод дат в строке
echo $(date +"<строка форматирования>")
Пример:
echo dump$(date +%Y%m%d_%H%M%S).gz
Выведет: dump20210721_075853.gz
Базы данных
Использование файла паролей для логирования в БД без указания параметров через командную строку
создаем файл ~/.pgpass
(по умолчанию в домашней директории, но через переменную окружения можно изменить точку чтения)
содержимое файла: сервер:порт:база_данных:имя_пользователя:пароль
Подробнее Postgres Pro Standard : Документация: 9.5: 31.15. Файл паролей : Компания Postgres Professional
Потоки
0 - STDIN
1 - STDOUT
2 - STDERR
обычный поток (результат) отправится в файл output
ls > output
Отправить поток STDOUT
в output
, и поток 2 (STDERR
) в первый &1
ls lala > output 2>&1
Перенаправить конкретный поток, указать номер потока перед >
cd lala 2> output
cat output
в output
окажется ошибка при выполнении строки 1
перенаправление обоих потоков в файл:
cd lala &> output
теперь все из STDOUT
и из STDERR
будет перенаправлено в output
Источники
- How To Set Up SSH Keys
- scp — копирование файлов через ssh
- Как создать архив .tar.gz в Linux
- scp files via intermediate host
- How to scp through two intermediate servers to a third-hop server
- Quickly create a large file on a Linux system — Stack Overflow
- Bash-скрипты, часть 2: циклы / Блог компании RUVDS.com / Хабр
- linux — How do I test if a variable is a number in Bash? — Stack Overflow
- coding style — How do you edit files over SSH? — Stack Overflow
- Postgres Pro Standard : Документация: 9.5: 31.15. Файл паролей : Компания Postgres Professional
- PostgreSQL: Documentation: 9.0: Environment Variables
- Remove Quotes (double or single) with Awk — Unix & Linux Stack Exchange
- configuration — How do I run a local bash script on remote machines via ssh? — Server Fault
- bash: smart autocomplete based on history? — Super User
- Команда date — Linux FAQ
- How do I prompt a user for confirmation in bash script? — Stack Overflow
- Потоки | Основы командной строки
- How To Find a File In Linux From the Command Line — Plesk Tips
- bash — Only mkdir if it does not exist — Stack Overflow