В Ubuntu придется часто использовать терминал. Его можно вызвать сочетанием клавиш Ctr+Alt+T
. Важно запомнить, что для большинства команд можно вызвать краткую справку:
<command> -h
Или если не работает первая:
<command> --help
Некоторые имеют подробный манул:
man <command>
Сочетания клавиш для операций копировать, вставить, вырезать работают только с зажатым Shift
, например, Shift+Ctrl+V
.
После запуска терминала мы по-умолчанию находимся в нашем домашнем каталоге. Он обозначается как ~. В терминале тильда в начале пути заменяется на /home/$USER
. Файл ~/.bashrc
сожержит команды, выполняемые интепретатором баша после запуска (например, при старте терминала). Имена исполняемых фалов, размещенных в каталогах /usr/bin
или /usr/local/bin
, доступны как команды.
Ctrl+D
- вставить символ EOF закрыть (закрывает терминал).
Если нужно выполнить одну единственную команду, то можно нажать Alt+F2 и ввести ее в поле.
sudo - это утилита, позволяющая выполнить команды с правами суперпользователя root. Перед именами команд, которые работают с файловой системой вне домашнего каталога, а так же для остановки root-процессов, нужно писать sudo. sudo используется для консольных приложений, в старых версиях убунту была утилита gksu которая позволяла запускать из под рута графические приложения (показывала окно ввода пароля перед запуском). Из Ubuntu 18.04 убрали ее, вместо нее предлагается использовать что-то типа gedit admin:///etc/hosts
.
Если надоело sudo
вводить можно авторизоваться под рутом:
sergey@sergey-pc:~$ sudo -i
[sudo] password for sergey:
root@sergey-pc:~#
Либо можно использовать sudo -s
или sudo su
.
Чтобы использовать в качестве команд исполняемые файлы из других каталогов, нужно добавить их в переменную PATH. В переменной PATH хранятся пути, разделенные двоеточиями. Для этого в ~/.bashrc
нужно добавить строку:
export PATH="/path/to/executable:$PATH"
Это важно: если мы вводим команду python
, то интерпретатор bash начинает сканирование списка каталогов в переменной PATH. Поиск продолжается пока не будет найден исполняемый файл в каком-то из каталогов, именно поэтому старое значение PATH добавляется в конец.
Дескриптор файла - это число, которое ассоциируется с открытым файлом (либо с соединением, так как в Linux все файлы).
Значение |
Описание |
---|---|
0 | stdin - входные данные для сценария (если поддерживает) |
1 | stdout - стандартный вывод |
2 | stderr - ошибки |
# Передаем данные в stdin сценария
echo "foo" | somecommand
# Либо так
somecommand <<< "foo"
# Вывод ошибки в stderr
echo "An error has occurred" >&2
# Игнорирование ошибок. `/dev/null` - как-бы файл в который записываем все, что не хотим видеть в консоли.
somecommand 2> /dev/null
# А можно их записывать в error log. `>>` запись в режиме добавления
somecommand 2>> /path/to/error.log
$ echo test
test
$ echo $_
test
# move all media files in subdirectories into the current directory
find ./ \( -name '*.JPG' -or -name '*.jpg' -or -name '*.MOV' -or -name '*.mp4' \) -exec mv '{}' ./ \;
# tar.gz a director
tar czvf wordpress-orig.tar.gz /var/www/
# add user to linux
adduser david
# add existing user to existing group
usermod -g www david
Команда |
Описание |
---|---|
gnome-session-quit |
Выйти из системы |
Команда |
Описание |
---|---|
set -e |
Отключить выход из сценария при ошибке. |
set +e |
Включить выход из сценария при ошибке. |
Команда |
Описание |
---|---|
expr 2 + 2 или echo $((2+2)) |
Выполняет выражение и возвращает результат |
Помимо apt-get
на Ubuntu доступен пакетный менеджер snap
. Он более продвинутый. Все доступные пакеты для установки с помощью него можно увидеть на сайте snapcraft.io.
Also: GDebi Package Installer - программа для установки .deb
пакетов.
Команда |
Описание |
---|---|
service --status-all |
Список сервисов |
systemctl list-unit-files --type=service | grep enabled |
Список включенных сервисов |
journalctl -xe |
Журнал ошибок сервисов |
Выкачать весь сайт:
wget --mirror \
--convert-links \
--html-extension \
--wait=2 \
-o log \
http://howisoldmybusiness.com
Команда |
Описание |
---|---|
psql databasename < data_base_dump |
Импорт дампа |
pg_dump -d mydb -f schema.sql |
Сделать дамп бд |
Команда |
Описание |
---|---|
/q |
Выход |
/d <tablename> |
Просмотр информации о колонках таблиц |
Команда |
Описание |
---|---|
mysql -u root -p |
Запуск с вводом пароля |
mysqladmin -u root -p'qwerty' password '' |
Удаляем пароль чтобы его больше не вводить |
mysql -u root -e 'show databases;' |
Выполнение запроса |
Команда |
Описание |
---|---|
npm init |
создать новый проект |
npm -g i vue |
установить модуль глобально |
npm i express --save |
установить модуль и добавить зависимости в package.json |
Команда |
Описание |
---|---|
git config --global user.email [email protected] |
Указать email пользователя |
git config --global user.name "John Doe" |
Указать имя пользователя |
git config --global credential.helper "cache --timeout=2592000" |
Хранить введенные логин и пароль в течении 30 дней |
git clone https://github.com/requests.git |
Создать локальную копию репозитория |
git pull |
Обновить локальный репозиторий с сервера |
git reset --hard |
Please commit your changes or stash them before you merge |
git add . |
Добавить все файлы из текущего и вложенных каталогов |
git reset |
Отменить предыдущую операцию |
git restet <file> |
отмена добавления файла |
git commit -m "message" |
Коммитим измения с целью их публикации |
git push |
Загружаем измененнные файлы на сервер |
git checkout <branch> |
Меняем ветку |
git checkout -b <branch> |
Создаем новую ветку и переключаемся на нее |
git rm -r --cached |
Удалить каталог из отслеживания |
git subtree push --prefix <path/to/folder> <remote-repo> <branch> |
Push отдельной папки |
git log --all --grep=<pattern> |
Поиск коммита по названию |
git log -S<text> |
Поиск коммита по содержимому |
git log -n 10 |
вывести 10 последних коммитов |
git stash |
Сохранить и откатить измения (многие действия не возможно сделать без пуша) |
git stash apply |
Восcтанавливаем откаченные изменения |
git show HASH:path/to/file |
посмотреть старую версию файла |
Git Flow - это обертка над git.
$ docker-compose up -d # start containers in background
$ docker-compose kill # stop containers
$ docker-compose up -d --build # force rebuild of Dockerfiles
$ docker-compose rm # remove stopped containers
$ docker ps # see list of running containers
$ docker exec -ti [NAME] bash # ssh to the container
# list all images
docker images
# tag and publishing
docker tag <id> buonzz/name:version
docker login
docker push buonzz/name
# delete image
docker rmi -f <id>
# run an image
docker run yourusername/docker-whale
# view logs
docker logs [OPTIONS] CONTAINER
# set the port to expose in host
docker run -p 3000 my_image
# start new container interactively
docker container run -it
Деплой на удаленном сервере:
$ docker-compose build
$ docker-compose up -d
В котором все строки, даже небо, даже Аллах. Отсюда, низкая скорость работы и куча неочевидных ошибок пр написании кода.
Дело в том, что при вызове:
foo $bar
Моет произойти не то, что ожидается, например:
bar="bar baz"
В foo будут сл. аргументы:
echo $1 # выведет "bar"
echo $2 # выведет "baz"
Текущий рабочмий каталог привязан к терминалу. Чтобы работать с путями относительно каталога в котором пасположен скрипт используем сл. сниппеты:
# Делаем рабочим
cd `dirname $0`
# Делаем рабочим и запоминаем в переменную
script_dir=$(cd `dirname $0` | pwd)
Pyenv - менеджер версий Python, позволяет использовать определенную версию для каждого проекта. Прост в использовании.
Установка:
$ curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
Перед установкой стоит установить все зависимости, из установка описана тут.
Ссылки:
IPython (англ. Interactive Python) — интерактивная оболочка для языка программирования Python, которая предоставляет расширенную интроспекцию, дополнительный командный синтаксис, подсветку кода и автоматическое дополнение. Является компонентом пакетов программ SciPy и Anaconda.
Установка:
$ pip install ipython
Запуск:
$ python -m IPython
Tab
- автодополнение. Ctrl + Space
- это режим выделения. Что он делает не знаю.
BPython практически полный аналог IPython. Так же существует Ptpython. Все эти модули созданы для работы в консоли. Что из них выбрать каждый решит сам.
Spyder - это IDE для Python, написанная на Python.
Установка:
$ sudo apt-get install spyder3
Либо можно установить как модуль:
$ pip install spyder
Запуск выглядит так:
$ python -m spyder.app.start
Как man только ничего лишнего.
Если устройство примонтировано:
$ umount /dev/sdb
Если разметка карты испорчена:
$ sudo dd if=/dev/zero of=/dev/sdb bs=512 count=1
Забиваем null-байтами первые 512 байт, где хранится информация о разметке.
Далее нужно создать файловую систему, раздел (sdb1) и отформатировать диск (sdb1).
Запись образа на диск:
sudo dd if=~/Downloads/Win10.iso of=/dev/sdb bs=8M
umount /dev/sdb1
sudo dd if=~/Downloads/manjaro-xfce-17.1.12-stable-x86_64.iso of=/dev/sdb bs=1M status=progress
Устанавливаем Postgres:
$ sudo apt update
$ sudo apt install postgresql postgresql-contrib
Запускаем сервер:
$ sudo systemctl start postgresql
Создаем пользователя чье имя соответствует вашему:
$ sudo -u postgres createuser --superuser $USER
Нужно так же создать одноименную БД:
$ sudo -u postgres createdb $USER
Устанавливаем пароль для юзера sergey:
$ sudo -u sergey psql
psql (10.4 (Ubuntu 10.4-0ubuntu0.18.04))
Type "help" for help.
sergey=# \password
Enter new password:
Enter it again:
sergey=#
Команды в интерактивной консоли начинаются с "", т.е. надо писать "\help".
Сначала небольшое введение. В Ubuntu при стандартной установке доступны старые версии интрепретатора Python. Чтобы использовать для команды python
другую версию интепретатора, я рекомендую установить менеджер версий pyenv.
$ python --version
Python 3.6.5
pgAdmin 4 не работает с Python 3.7.0: падает, встретив async как имя аргумента.
Если у вас не установлен pyenv, то вызов python
везде замените на python3
.
Создаем и активируем виртуальное окружение:
$ python -m venv pgadmin4
$ . pgadmin4/bin/activate
Качаем wheel:
$ wget https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v3.1/pip/pgadmin4-3.1-py2.py3-none-any.whl
$ pip install pgadmin4-3.1-py2.py3-none-any.whl
Создадим локальные настройки:
$ cd /pgadmin4/lib/python3.6/site-packages/pgadmin4
$ nano config_local.py
Содержимое файла config_local.py
:
import os
SERVER_MODE = False
DATA_DIR = os.path.realpath(os.path.expanduser('~/.pgadmin/'))
LOG_FILE = os.path.join(DATA_DIR, 'pgadmin4.log')
SQLITE_PATH = os.path.join(DATA_DIR, 'pgadmin4.db')
SESSION_DB_PATH = os.path.join(DATA_DIR, 'sessions')
STORAGE_DIR = os.path.join(DATA_DIR, 'storage')
Создадим сервис. Сервис не привязан к терминалу. Его можно добавить в автозагрузку, остановить и т.д.
$ gedit admin:///etc/systemd/system/pgadmin4.service
Пример файла:
[Unit]
Description=pgAdmin 4
[Service]
Type=simple
ExecStart=/home/sergey/dev/pgadmin4/bin/python /home/sergey/dev/pgadmin4/lib/python3.6/site-packages/pgadmin4/pgAdmin4.py
[Install]
WantedBy=multi-user.target
Запуск:
$ sudo systemctl start pgadmin4
Проблема у меня возникла с модулем pylint, для установки которого требуется gcc. Приложения я запускаю через Docker. Используемые образы не имеют пакета gcc, его приходится ставить, что влияет как на размер образа так и на время сборки.
Для решения этой проблемы:
- Создаем виртуальное окружение и устанавливаем модули, которые нужно игнорировать;
- Выполняем
pip freeze > ~/dev/ignore-requirements.txt
; - Добавляем в
.bashrc
строкуalias pipfreezeignore='pip freeze | grep -vFxf ~/dev/ignore-requirements.txt'
.
Использование:
$ pipfreezeignore > requirements.txt
Возможно, в текущем каталоге либо в родительских имеется файл .python-version
. Его нужно удалить.
В папке /etc/systemd/system
создаем файл <service-name>.service
.
Пример:
[Unit]
Description=<description>
[Service]
Type=simple
ExecStart=<command>
[Install]
WantedBy=multi-user.target
Нужно прописывать полный путь до команды (~ нельзя использовать).
Запомнить:
- Dockerfile может иметь сколько угодно инструкций FROM.
Добавить в ~/.bashrc
следующие строки:
alias docker-stop-all='docker stop $(docker ps -qa)'
alias docker-rm-all='docker rm -f $(docker ps -qa)'
alias docker-rmi-all='docker rmi $(docker images -q)'
alias docker-clean='docker-stop-all; docker-rm-all; docker-rmi-all'
Самое простое решение - это docker run --network host...
либо в docker-compose.yml
добавить:
version: '3'
services:
myservice:
// ...
network_mode: host
По целому ряду причин эти решения могут нам не подходить.
Можно запустить базу данных в контейнере и смонтировать путь до файлов БД с помощью volume описание тут.
Можно указать свой локальный айпи-адрес в качестве хоста базы, но перед этим нужно настроить сервера баз данных, так чтобы они слушали хост локальный айпи либо 0.0.0.0
.
Итак, для начала нам нужно узнать свой локальный ip-адрес:
$ hostname -I | cut -d ' ' -f1
192.168.0.82
Этот айпи мы будем указывать в своих скриптах в качестве хоста. Сервера баз данных должны слушать этот адрес (универсальное решение в качестве хоста указать 0.0.0.0).
$ sudo nano /etc/postgresql/10/main/postgresql.conf
Ищем "listen_adresses":
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
# - Connection Settings -
listen_addresses = 'localhost,192.168.0.82'
# либо можно слушать все адреса
# listen_addresses = '*'
В конец /etc/postgresql/10/main/hba_conf.conf
нужно добавить строку:
host all all 172.17.0.0/8 md5
Это позволит избежать ошибок вида:
asyncpg.exceptions.InvalidAuthorizationSpecificationError: no pg_hba.conf entry for host "172.17.0.x"
Перезапускаем Postgres:
$ sudo sytemctl restart postgresql
Нужно в файле /etc/my.cnf
или /etc/mysql/my.cnf
изменить параметр bind-address:
[mysqld]
bind-address = 0.0.0.0
Мне этого делать не потребовалось netstat -lt
показал что мускул и так слушает все хосты.
$ sudo nano /etc/redis/6379.conf
Находим и комментриуем bind 127.0.0.1
:
# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
# JUST COMMENT THE FOLLOWING LINE.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# bind 127.0.0.1
Перезапускаем сервис:
$ sudo systemctl restart redis_6379
$ sudo apt-get install --no-install-recommends gnome-panel
$ gnome-desktop-item-edit --create-new ~/Desktop
/sbin
, as distinct from/bin
, is for system management programs (not normally used by ordinary users) needed before/usr
is mounted./usr/bin
is for distribution-managed normal user programs. .../usr/local/bin
is for normal user programs not managed by the distribution package manager, e.g. locally compiled packages.
Для начала создадим новый проект:
npm init
Установим зависимости:
npm i --save-dev @babel/core @babel/cli @babel/node @babel/preset-env nodemon
Теперь создадим в корне проекта файл .babelrc
:
{
"presets": ["@babel/preset-env"]
}
Отредактируем package.json
:
"scripts": {
// ...
"start": "nodemon --exec babel-node src/server.js",
"build": "babel src --out-dir dist",
"serve": "node dist/server.js"
},
В папке src
будут наши исходники. Пример src/server.js
:
import express from 'express'
const app = express()
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(3000)
Запуск проекта в режиме отладки:
node start
Сборка проекта:
npm run-script build
Запуск в production:
node serve
Для начала нужно узнать UUID раздела, а затем добавить в /etc/fstab
строку наподобие:
UUID=003fad47-a30b-45b0-acce-5e69a0de2011 /home ext4 defaults 0 2
Устпановим необходимые пакеты:
apt-get install zsh
apt-get install git-core
Теперь нужно установить Oh My ZSH!:
wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | zsh
Меняем командую оболочку:
chsh -s `which zsh`
Перезагружаемся:
sudo shutdown -r 0
При использовании темы agnoster шрифт в терминале нжно сменить, например, на Souce Code Pro.
#!/usr/bin/env bash
cd Downloads
wget https://github.com/adobe-fonts/source-code-pro/archive/2.030R-ro/1.050R-it.zip
if [ ! -d "~/.fonts" ] ; then
mkdir ~/.fonts
fi
unzip 1.050R-it.zip
cp source-code-pro-*-it/OTF/*.otf ~/.fonts/
rm -rf source-code-pro*
rm 1.050R-it.zip
cd ~/
fc-cache -f -v
Модифицируем settings.json
:
{
// ...
"terminal.integrated.fontFamily": "Source Code Pro",
// ...
}
Для zsh есть подсветка синтаксиса https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/INSTALL.md
Добавление
$ sudo adduser <username>
$ sudo usermod -aG sudo <username>
Удаление
$ sudo deluser <username>
$ sudo nano /etc/sudoers # отсюда тоже может потребоваться удаление юзера
Создаем раздел, задаем точку входа "/", помечаем как boot Чтобы загрузчик grub увидел новый дистрибутив выполняем:
$ sudo update-grub
$ sudo mkdir /mnt/storage
$ sudo mount /dev/sda2 /mnt/storage
Чтобы посмотреть доступные разделы:
$ sudo fdisk -l
Создание:
$ sudo tar -cvpzf /path/to/backups/root.tar.gz --exclude=/dev --exclude=/mnt --exclude=/tmp --one-file-system /
$ sudo tar -cvpzf /path/to/backups/home.tar.gz --one-file-system /home/
Восстановление бэкапа будет выглядеть так:
$ sudo tar -xvpzf /mnt/storage/Backups/root.tar.gz -C /dev/vg1/lv1 --numeric-owner
Иерархия LVM: физический раздел -> группа разделов -> логический раздел.
Через GParted создаем раздел с разметкой "lvm2 pv".
Далее создаем группу разделов:
ubuntu@ubuntu:~$ sudo vgcreate vg1 /dev/nvme0n1p5
Volume group "vg1" successfully created
Убедимся, что группа создана:
ubuntu@ubuntu:~$ sudo pvscan
PV /dev/nvme0n1p5 VG vg1 lvm2 [82.28 GiB / 82.28 GiB free]
Total: 1 [82.28 GiB] / in use: 1 [82.28 GiB] / in no VG: 0 [0 ]
Теперь в группе создадим два логических раздела под корень и каталог home:
ubuntu@ubuntu:~$ sudo lvcreate -n lv1 -L 20G vg1
Logical volume "lv1" created.
ubuntu@ubuntu:~$ sudo lvcreate -n lv2 -L 30G vg1
Logical volume "lv2" created.
Убедимся в том, что все сделано правильно:
ubuntu@ubuntu:~$ sudo pvscan
PV /dev/nvme0n1p5 VG vg1 lvm2 [82.28 GiB / 32.28 GiB free]
Total: 1 [82.28 GiB] / in use: 1 [82.28 GiB] / in no VG: 0 [0 ]
Теперь на каждом логическом разделе создадим файловую систему:
ubuntu@ubuntu:~$ sudo mkfs.ext4 /dev/vg1/lv1
mke2fs 1.44.1 (24-Mar-2018)
Discarding device blocks: done
Creating filesystem with 5242880 4k blocks and 1310720 inodes
Filesystem UUID: 780e791b-488b-430e-a1b8-1b304ad249c8
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
ubuntu@ubuntu:~$ sudo mkfs.ext4 /dev/vg1/lv2
mke2fs 1.44.1 (24-Mar-2018)
Discarding device blocks: done
Creating filesystem with 7864320 4k blocks and 1966080 inodes
Filesystem UUID: 5633959e-5f43-40f3-8078-7fa870e422a8
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
Для управления LVM можно установить пакет kvpm.
Для этого нам потребуются загрузочная флешка и наличие Интернета. Грузимся, открываем терминал и выполняем:
$ sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update && sudo apt-get install boot-repair -y && boot-repair
Далее следуем инструкциям.
Нужно ли править /etc/fstab перед этим?
echo 1 > /sys/devices/pci0000:00/0000:00:02.0/rom
cat /sys/devices/pci0000:00/0000:00:02.0/rom > vbios.dump
echo 0 > /sys/devices/pci0000:00/0000:00:02.0/rom
Создание ssh ключа:
В настройках создаем SSH ключ.
Иногда нужно поправить
.git/config
, чтобы можно было работать с репозиторием через SSH: