Полезные команды Linux: различия между версиями

мНет описания правки
м Фикс категории
 
(не показано 68 промежуточных версий этого же участника)
Строка 1: Строка 1:
В данном руководстве перечислен список команд к различным Linux приложениям. Некоторые из этих команд могут быть применены и к Windows версиям программ.
В данном руководстве перечислен список команд к различным Linux приложениям. Некоторые из этих команд могут быть применены и к Windows версиям программ.


== Базовые команды ==
== Файловые операции ==
<code>setxkbmap -layout us,ru -option grp:alt_shift_toggle</code>
=== Базовые команды ===


Включение возможности изменения раскладки клавиатуры через Alt + Shift.
Создать символическую ссылку


<code>xrandr --output eDP1 --dpi 135.09</code>
<code>ln -s /original/path/to/file /path/to/symlink</code>


Установить DPI для подключенного дисплея/монитора ([https://www.sven.de/dpi/ Подсчитать DPI можно тут]).
<code>DISPLAY=:0 anydesk</code>
Удаленно запустить приложение на основном дисплее (X11).
== Файловые операции ==
=== Общие команды ===
=== Общие команды ===
<code>find . -type d -exec sh -c 'cd -P -- "{}" && pwd -P' \;</code>


Запустить команду pwd -P в текущем каталоге и в поддиректориях.
Запустить команду pwd -P в текущем каталоге и в поддиректориях.


<code>find -mindepth 1 -exec sh -c 'mv "$1" "$(echo "$1" | iconv -f cp1252 -t cp850 | iconv -f cp866 )"' sh {} \;</code>
<code>find . -type d -exec sh -c 'cd -P -- "{}" && pwd -P' \;</code>


Переименовать кириллические файлы в каталоге
Переименовать кириллические файлы в каталоге
<pre>find -mindepth 1 -exec sh -c 'mv "$1" "$(echo "$1" | iconv -f cp1252 -t cp850 | iconv -f cp866 )"' sh {} \;</pre>


=== Права доступа ===
=== Права доступа ===
Изменить владельца и группу для файла.


<code>chown username:usergroup file.txt</code>
<code>chown username:usergroup file.txt</code>


Изменить владельца и группу для файла.  
Показать режима доступа файла или папки в восьмеричной системе счисления Октал.  


<code>stat -c %a file.txt</code>
<code>stat -c %a file.txt</code>


Показать режима доступа файла или папки в восьмеричной системе счисления Октал.  
=== Оценка использования пространства накопителя ===
Общий отчёт об использовании пространства файловой системы.


=== Оценка использования пространства накопителя ===
<code>df -h /</code>
<code>df -h /</code>


Общий отчёт об использовании пространства файловой системы.
Информация об использовании файлами и директориями пространства файловой системы.


<code>du -h file.bin</code>
<code>du -h file.bin</code>


Информация об использовании файлами и директориями пространства файловой системы.
Поиск 10 наибольших файлов и директорий с сортировкой по убыванию их размера.


<code>du -ahx . | sort -rh | head -10</code>
<code>du -ahx . | sort -rh | head -10</code>
Поиск 10 наибольших файлов и директорий с сортировкой по убыванию их размера.


=== Форматирование накопителя ===
=== Форматирование накопителя ===
<code>sudo dd if=/dev/zero of=/dev/sdb bs=1M</code>
Низкоуровневое форматирование накопителя.
Низкоуровневое форматирование накопителя.


<code>sudo partprobe</code>
<code>sudo dd if=/dev/zero of=/dev/sdb bs=1M status=progress</code>


Принудительно обновить таблицу разделов.
Принудительно обновить таблицу разделов.
<code>sudo partprobe</code>


=== Архивы ===
=== Архивы ===
==== Создание ====
Создать tar архив.
<code>tar -cf archive.tar file1 file2</code>
Создать tar архив и исключить добавление отдельного файла.
<code>tar --exclude='file3' -cf archive.tar file1 file2</code>
Создать tar архив директории без сохранении информации о полном пути файлов. Обратите внимание что перед site стоит пробел. Это позволяет при распаковке получить корневую директорию site со всем содержимым.
<code>tar -cf site1.tar -C /var/www/ site</code>
Создать tar архив с Gzip сжатием.
<code>tar -czf archive.tar.gz file1 file2</code>
Создать tar архив с Bz2 сжатием.
<code>tar -cjf archive.tar.bz2 file1 file2</code>
==== Просмотр содержимого ====
Посмотреть содержимое tar архива.
<code>tar -tf archive.tar</code>
Посмотреть содержимое Zip архива
<code>unzip -l archive.zip</code>
Если архив был случайно распакован не в ту папку и нужно удалить новые файлы, то можно воспользоваться списком файлов архива
<code>unzip -Z1 archive.zip | xargs -I {} rm -v "{}"</code>
Посмотреть содержимое Zip архива с кириллическими именами в названии файлов.
<code>unzip -l Архив.zip | grep -aEv '^Archive:' | iconv -f iso8859-1 -t cp850 | iconv -f cp866</code>
<code>unzip -l Архив.zip | grep -aEv '^Archive:' | iconv -f iso8859-1 -t cp850 | iconv -f cp866</code>


Посмотреть содержимое архива с кириллическими именами в названии файлов.
==== Распаковка ====
Распаковать tar архив в текущую директорию.
 
<code>tar -xf archive.tar</code>
 
Распаковать tar архив в требуемую директорию.
 
<code>tar -xf archive.tar -C ~/folder</code>
 
Другие возможные tar команды собраны здесь:
 
https://linuxize.com/post/how-to-create-and-extract-archives-using-the-tar-command-in-linux/
 
Распаковать zip архив в требуемую директорию.
 
<code>unzip archive.zip -d ~/folder</code>
 
==== Модификация архива ====
 
Добавить новый файл в tar архив.
 
<code>tar -rvf archive.tar newfile</code>
 
Удалить файл из tar архива.
 
<code>tar --delete -f archive.tar file1</code>


=== Portable Document Format (PDF) ===
=== Portable Document Format (PDF) ===
Склеить несколько pdf файлов в один.


<code>pdftk A=1.pdf B=2.pdf cat A1 B2-4 output Result.pdf</code>
<code>pdftk A=1.pdf B=2.pdf cat A1 B2-4 output Result.pdf</code>


Склеить несколько pdf файлов в один.
Разрезать pdf по листам.


<code>pdftoppm Input.pdf outputname -png</code>
<code>pdftoppm Input.pdf outputname -png</code>
Разрезать pdf по листам.


=== Изображения ===
=== Изображения ===
==== ExifTool ====
==== ExifTool ====
Прочитать EXIF атрибуты.


<code>exiftool 1.jpg</code>
<code>exiftool 1.jpg</code>


Прочитать EXIF атрибуты.
Удалить все EXIF атрибуты.


<code>exiftool -all= 2.jpg</code>
<code>exiftool -all= 2.jpg</code>


Удалить все EXIF атрибуты.
==== ImageMagick ====
Изменить размер изображения


==== ImageMagick ====
<code>convert 3.jpg -resize 128x128 1.png</code>
<code>convert 3.jpg -resize 128x128 1.png</code>


Изменить размер изображения
Перевернуть изображение


<code>convert 4.jpg -rotate 90 2.jpg</code>
<code>convert 4.jpg -rotate 90 2.jpg</code>


Перевернуть изображение
Конвертировать изображение в pdf файл


<code>convert 5.jpg Result.pdf</code>
<code>convert 5.jpg Result.pdf</code>


Конвертировать изображение в pdf файл
Конвертировать изображение в pdf файл с параметрами формата листа и заполнения заднего фона.


<code>convert 6.jpg -background white -page a4 Output.pdf</code>
<code>convert 6.jpg -background white -page a4 Output.pdf</code>


Конвертировать изображение в pdf файл с параметрами формата листа и заполнения заднего фона.
==== SANE ====
==== SANE ====
Получить изображение со сканера или МФУ.
<code>scanimage --format=png --output-file test.png --progress</code>
<code>scanimage --format=png --output-file test.png --progress</code>
Получить изображение со сканера или МФУ.


=== Видео ===
=== Видео ===
==== FFmpeg ====
==== FFmpeg ====
<code>ffmpeg -i "Made_in_Abyss_Retsujitsu_no_Ougonkyou_[02]_[AniLibria_TV]_[WEBRip_1080p].mkv" -vf subtitles="02.ass" -c:v libx264 -crf 23 -c:a aac -b:a 192k output-02.mp4</code>
Конвертировать аудиодорожку видео в формат MP3.
 
<code>ffmpeg -i filename.mp4 filename.mp3</code>
 
Сделать копию видео в формате mp4.
 
<code>ffmpeg -i example.mkv -c copy example.mp4</code>


Кодировать видео с наложением субтитров (Создание хардсаба).
Кодировать видео с наложением субтитров (Создание хардсаба).


<code>ffmpeg -i "Made_in_Abyss_Retsujitsu_no_Ougonkyou_[03]_[AniLibria_TV]_[WEBRip_1080p].mkv" -vf subtitles="03.ass" -map 0:0 -map 0:2 -c:v libx264 -crf 23 -c:a:2 aac -b:a 192k output-03.mp4</code>
<pre>ffmpeg -i "Made_in_Abyss_Retsujitsu_no_Ougonkyou_[02]_[AniLibria_TV]_[WEBRip_1080p].mkv" -vf subtitles="02.ass" -c:v libx264 -crf 23 -c:a aac -b:a 192k output-02.mp4</pre>


Кодировать видео с наложением субтитров и сделать 2-ую аудио-дорожку основной.
Кодировать видео с наложением субтитров и сделать 2-ую аудио-дорожку основной.
<pre>ffmpeg -i "Made_in_Abyss_Retsujitsu_no_Ougonkyou_[03]_[AniLibria_TV]_[WEBRip_1080p].mkv" -vf subtitles="03.ass" -map 0:0 -map 0:2 -c:v libx264 -crf 23 -c:a:2 aac -b:a 192k output-03.mp4</pre>
Вырезать отрезок видео в выбранном диапазоне времени.
<code>ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -c copy output.mp4</code>


==== MKVToolNix ====
==== MKVToolNix ====
<code>mkvextract tracks Made_in_Abyss_Retsujitsu_no_Ougonkyou_\[03\]_\[AniLibria_TV\]_\[WEBRip_1080p\].mkv 4:AniLibria_TV-03.ass</code>
Извлечь 4-ую дорожку (счёт ведётся с нуля) содержащую встроенные субтитры.
 
<pre>mkvextract tracks Made_in_Abyss_Retsujitsu_no_Ougonkyou_\[03\]_\[AniLibria_TV\]_\[WEBRip_1080p\].mkv 4:AniLibria_TV-03.ass</pre>
 
==== yt-dlp ====
 
Cкачать плейлист YT с названием плейлиста в качестве имени папки


Извлечь 4-ую дорожку (счёт ведётся с нуля) содержащую встроенные субтитры.
<pre>yt-dlp -f "bestvideo[height<=1080]+bestaudio/best[height<=1080]" --yes-playlist --write-auto-subs --embed-subs --embed-chapters --embed-thumbnail -o /"path/%(playlist_title)s/%(playlist_index)s - %(title)s.%(ext)s" --embed-chapters https://youtube.com/playlist?list=xyz</pre>


== Сетевые команды ==
== Сетевые команды ==
<code>netstat -na</code>
Отобразить информацию о сетевых соединениях.
Отобразить информацию о сетевых соединениях.


<code>nmcli connection import type openvpn file ~/VPNs/name.ovpn</code>
<code>netstat -na</code>


Импорт OpenVPN профиля в NetworkManager.
Импорт OpenVPN профиля в NetworkManager.


<code>wol 00:00:00:00:00:00 -h example.com -p 9</code>
<code>nmcli connection import type openvpn file ~/VPNs/name.ovpn</code>


Послать Wake-on-LAN пакет на удаленную машину.
Послать Wake-on-LAN пакет на удаленную машину.


<code>ssh -X comminux@example.com -c chacha20-poly1305@openssh.com -C</code>
<code>wol 00:00:00:00:00:00 -h example.com -p 9</code>


Оптимизированная передача изображения с удаленного X сервера.
Оптимизированная передача изображения с удаленного X сервера.


<code>sudo grep -r '"-" "-"' /var/log/nginx</code>
<code>ssh -X comminux@example.com -c chacha20-poly1305@openssh.com -C</code>


Найти GET запросы в директории логов сервера Nginx, которые характерны DoS-атакам.
Найти GET запросы в директории логов сервера Nginx, которые характерны DoS-атакам.


<code>wget -r -k -l 2 -p -E -nc http://site.com/</code>
<code>sudo grep -r '"-" "-"' /var/log/nginx</code>


Загрузить копию веб-сайта и другие страницы посредством рекурсивного прохода по найденным веб-ссылкам.
Загрузить копию веб-сайта и другие страницы посредством рекурсивного прохода по найденным веб-ссылкам.


Полное описание параметров команды: https://pingvinus.ru/note/wget-download-sites
Полное описание параметров команды: https://pingvinus.ru/note/wget-download-sites
<code>wget -r -k -l 2 -p -E -nc http://site.com/</code>
=== Настройка файрвола ===
=== Настройка файрвола ===
==== UFW - Uncomplicated Firewall ====
==== UFW - Uncomplicated Firewall ====
Используется по умолчанию в Ubuntu.
Используется по умолчанию в Ubuntu.
Отобразить список активных правил в файрволе UFW.


<code>sudo ufw status numbered</code>
<code>sudo ufw status numbered</code>


Отобразить список активных правил в файрволе UFW.
Удалить 7-е правило.


<code>sudo ufw delete 7</code>
<code>sudo ufw delete 7</code>


Удалить 7-е правило.
Создать новое правило блокировки IP и поместить его в начало списка. Если не соблюдать порядок блокирующих (DENY) и разрешающих правил (ALLOW), то добавленные правила могут не исполняться.


<code>sudo ufw insert 1 deny from 52.185.71.28 to any</code>
<code>sudo ufw insert 1 deny from 52.185.71.28 to any</code>


Создать новое правило блокировки IP и поместить его в начало списка. Если не соблюдать порядок блокирующих (DENY) и разрешающих правил (ALLOW), то добавленные правила могут не исполняться.
== Базы данных ==
 
==== MariaDB ====
Подключиться к серверу MariaDB.
 
<code>mariadb -u root -p</code>
 
Проверка подключения к базе данных.
 
<code>mariadb -u db_user -p -D db_name</code>
 
Экспортировать базу данных.
 
<code>mariadb-dump -u db_user -p db_name > backup.sql</code>
 
Импортировать базу данных из резервной копии. Необходимо, чтобы база данных была [[Конфигурации приложений#MariaDB|создана перед импортом]].
 
<code>mariadb -u db_user -p new_db < backup.sql</code>
 
{{Примечание|Если при импорте будет возникать ошибка ERROR at line 1: Unknown command '\-'., то требуется дополнительное действие: https://habr.com/ru/articles/824490/}}
 
==== PostgreSQL ====
Дамп всех баз данных в один файл
 
<code>postgres pg_dumpall > postgres_databases.sql</code>
 
== Виртуализация ==
== Виртуализация ==
=== Контейнеры ===
=== Контейнеры ===
==== Docker ====
==== Docker ====
Собрать новый образ из Dockerfile, расположенного в текущей директории.
<code>sudo docker buildx build --platform=linux/amd64 .</code>
<code>sudo docker buildx build --platform=linux/amd64 .</code>


Собрать новый образ из Dockerfile, расположенного в текущей директории.
Создать новый контейнер в фоне и дать ему определенное имя.
 
<code>sudo docker run -d --name godot-ci-4.5-beta1 lourensrich/godot-ci-4.5-beta1</code>
 
Отобразить список всех контейнеров.


<code>sudo docker ps -a</code>
<code>sudo docker ps -a</code>


Отобразить список всех контейнеров.
Отобразить список загруженных или собранных образов.


<code>sudo docker images</code>
<code>sudo docker images</code>


Отобразить список загруженных или собранных образов.
Открыть bash сессию в запущенном контейнере


<code>sudo docker exec -it container_id bash</code>
<code>sudo docker exec -it container_id bash</code>


Открыть bash сессию в запущенном контейнере
Создать контейнер и запустить в нём bash-сессию. Параметр image_id является хэш указателем или тэгом уникального образа.


<code>sudo docker run -it image_id bash</code>
<code>sudo docker run -it image_id bash</code>


Создать контейнер и запустить в нём bash-сессию. Параметр image_id является хэш указателем или тэгом уникального образа.
Удалить контейнер с данными.


<code>sudo docker container rm container_id</code>
<code>sudo docker container rm container_id</code>


Удалить контейнер с данными.
Удалить контейнеры с данными по наименованию образа, от которого они были созданы.
 
<code>sudo docker container rm $(docker ps -a -q --filter "ancestor=containrrr/watchtower")</code>
 
Удалить образ.


<code>sudo docker rmi image_id</code>
<code>sudo docker rmi image_id</code>


Удалить образ.
Удалить все неактивные образы из системы.
 
<code>sudo docker rmi $(docker images -q)</code>
 
Показать пути к файловым системам используемых контейнеров.
 
<code>sudo docker inspect $(sudo docker ps -qa) |  jq -r 'map([.Name, .GraphDriver.Data.MergedDir]) | .[] | "\(.[0])\t\(.[1])"'</code>
 
Удалить неиспользуемые элементы файловых систем неиспользуемых контейнеров.
 
<code>sudo docker system prune -a -f</code>
 
Автоматическое обновление требуемого образа каждые 12 часов при помощи [http://watchtower.nickfedor.com/ nickfedor/watchtower].
 
<pre>docker run -d --name watchtower-openwebui --restart=always -v /var/run/docker.sock:/var/run/docker.sock nickfedor/watchtower open-webui --interval 43200</pre>
 
Ручное обновление требуемого образа при помощи [http://watchtower.nickfedor.com/ nickfedor/watchtower] в режиме отладки.
 
<pre>docker run -v /var/run/docker.sock:/var/run/docker.sock nickfedor/watchtower --run-once open-webui --debug</pre>
 
Создание контейнера с перенаправлением портов, постоянным хранением данных и установкой требуемой переменной окружения.
 
<pre>docker run -d -p 3000:8080 -v open-webui:/app/backend/data -e ENV=dev --name open-webui ghcr.io/open-webui/open-webui:main</pre>
 
Изменить политику перезапуска для существующего контейнера.
 
<code>docker update --restart unless-stopped open-webui</code>
 
== Обслуживание компьютера ==
=== Очистка кэша ===
 
<code>ccache -C</code>
 
Очистить ccache кэш.
 
<code>trizen -Scc</code>
 
Очистить trizen кэш.
 
== Пакетные менеджеры ==
=== Composer ===
Создать новый проект.
 
<code>composer create-project laravel/laravel example-site</code>
 
Установить необходимые зависимости в существующий проект.
 
<code>composer install</code>
 
Запустить скрипт dev, определенный в composer.json проекта.
Данный скрипт запускает локальный веб-сервер для проверки Laravel приложения.
 
<code>composer run dev</code>
 
=== pacman  ===
<code>pacman -q</code>
 
Отобразить пакеты установленные вручную, которые не были найдены в базе данных синхронизации. К примеру из AUR.
 
<code>rm /var/lib/pacman/db.lck</code>
 
Удалить файл блокировки базы данных pacman.
 
== Системы сборки ==
=== Scons ===
 
<code>scons -c</code>
 
Очистить scons кэш.
 
== Android ==
=== Android Debug Bridge (adb) ===
Создать резервную копию данных выбранного приложения. После ввода команды потребуется выполнить подтверждение операции на самом устройстве. Некоторые приложения могут иметь флаг запрещающий создание подобных резервных копий.
 
<code>adb backup -noapk com.unciv.app -f unciv-data.ab</code>
 
Получить список приложений, которые могут читать последний элемент в буфере обмена.
 
<code>adb shell cmd appops query-op READ_CLIPBOARD allow</code>
 
Запретить доступ к буферу обмена.
 
<code>adb shell cmd appops set com.octopod.russianpost.client.android READ_CLIPBOARD ignore</code>
 
== Bash ==
=== Служебные символы ===
Запуск скрипта через эквивалент команды <code>source</code>. Экспортированные переменные устанавливаемые данным способом сохраняются в текущем процессе, то есть их можно использовать через <code>echo</code> и регулярные выражения ($).


== Менеджер загрузки EFI ==
<code>. environment.sh</code>


== EFI - менеджер загрузки ==
=== efibootmgr ===
=== efibootmgr ===
==== Восстановление загрузочной записи ====
Обычно восстановление загрузочной записи загрузчика '''systemd-boot''' требуется после обновления прошивки (BIOS) материнской платы.


==== Восстановление загрузочной записи ====
<code>efibootmgr -c -d /dev/sdX -p Y -l "\EFI\systemd\systemd-bootx64.efi" -L "Linux Boot Manager"</code>
<code>efibootmgr -c -d /dev/sdX -p Y -l "\EFI\systemd\systemd-bootx64.efi" -L "Linux Boot Manager"</code>


Обычно восстановление загрузочной записи загрузчика '''systemd-boot''' требуется после обновления прошивки (BIOS) материнской платы.
==== Очистка и сортировка загрузочных записей ====
==== Очистка и сортировка загрузочных записей ====
Отобразить очередь загрузки.
<code>efibootmgr</code>
<code>efibootmgr</code>


Отобразить очередь загрузки.
Удалить 4-ую запись из очереди загрузки.


<code>efibootmgr -b 4 -B</code>
<code>efibootmgr -b 4 -B</code>


Удалить 4-ую запись из очереди загрузки.
Изменить порядок загрузки.  


<code>efibootmgr -o 0,1,2</code>
<code>efibootmgr -o 0,1,2</code>


Изменить порядок загрузки.  
== Git ==
=== Работа с репозиториями ===
Инициализировать структуру Git репозитория.
 
<code>git init</code>
 
Добавить файл README.md в индекс существующего репозитория.
 
<code>git add README.md</code>
 
Осуществить коммит изменений с выбранным заголовком.
 
<code>git commit -m 'Initial commit'</code>
 
Добавить удаленный репозиторий.
 
<code>git remote add origin <GIT_URL_HERE></code>
 
Отправить код на удаленный репозиторий и сделать main ветку основной при отправке.
 
<code>git push -u origin main</code>
 
Показать адреса удаленных репозиториев.
 
<code>git remote -v</code>
 
Изменить адрес удаленного репозитория.
 
<code>git remote set-url origin <NEW_GIT_URL_HERE></code>
 
=== Ветвление ===
Создать новую ветку.
 
<code>git branch branch_name</code>
 
Переключиться на требуемую ветвь.
 
<code>git checkout branch_name</code>
 
Создать новую ветвь и переключиться на неё в одной команде.
 
<code>git checkout -b branch_name</code>
 
Удалить локальную ветку.
 
<code>git branch -d branch_name</code>
 
Удалить удаленную ветку.
 
<code>git push -d origin branch_name</code>
 
Загрузить удаленную ветку в новую для этого локальную ветвь.
 
<code>git fetch gitea master:fork</code>
 
Выгрузка локальной ветки может осуществляться в другую удаленную ветвь.
 
<code>git push gitea fork:master</code>
 
Для GitHub имеется возможность загрузить запрос на слияние в новую локальную ветвь для тестирования нового функционала или исправления ошибки.
 
<pre>git fetch origin pull/103781/head:pr-103781
git checkout pr-103781</pre>
 
Удалить все ветви, которых больше нет на удалённом репозитории.
 
<code>git fetch --prune</code>
 
=== Подмодули ===
Инициализация, получение и извлечение всех существующих вложенных подмодулей.
 
<code>git submodule update --init --recursive</code>
 
=== Bare репозиторий ===
Bare репозиторий — это репозиторий, который не содержащий рабочего каталога. Явным признаком bare репозитория является наличие следующего содержимого в корневой директории:
 
<pre>branches  config  description  FETCH_HEAD  HEAD  hooks  info  objects  packed-refs  refs</pre>
 
Для конвертации bare репозитория в "нормальное" состояние, требуется выполнить следующие действия:
 
<pre>git config core.bare false
mkdir .git
mv * .git/
git reset --hard</pre>
 
=== SOPS ===
SOPS - простой и удобный инструмент для управления секретами.
 
Зашифровать файл.
 
<pre>sops --encrypt --age $(cat $SOPS_AGE_KEY_FILE |grep -oP "public key: \K(.*)") --in-place ./secret.yaml</pre>
 
Расшифровать файл.
 
<pre>sops --decrypt --age $(cat $SOPS_AGE_KEY_FILE |grep -oP "public key: \K(.*)") --in-place ./secret.yaml</pre>
 
== systemd ==
=== journalctl ===
<code>sudo journalctl -u act_runner.service</code>
 
Показать все сообщения для определенного сервиса.
 
== X11-сервер ==
Включение возможности изменения раскладки клавиатуры через Alt + Shift.
 
<code>setxkbmap -layout us,ru -option grp:alt_shift_toggle</code>
 
Установить DPI для подключенного дисплея/монитора ([https://www.sven.de/dpi/ Подсчитать DPI можно тут]).
 
<code>xrandr --output eDP1 --dpi 135.09</code>
 
Удаленно запустить приложение на основном дисплее.


== Android ==
<code>DISPLAY=:0 anydesk</code>
=== Android Debug Bridge (adb) ===
<code>adb backup -noapk com.unciv.app -f unciv-data.ab</code>


Создать резервную копию данных выбранного приложения. После ввода команды потребуется выполнить подтверждение операции на самом устройстве. Некоторые приложения могут иметь флаг запрещающий создание подобных резервных копий.
[[Категория:Руководства]]
[[Категория:Руководства]]