<?xml version="1.0" encoding="UTF-8"?><feed
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:thr="http://purl.org/syndication/thread/1.0"
	xml:lang="ru-RU"
	>
	<title type="text">linux &#8212; dimio.org</title>
	<subtitle type="text">Perl, Linux, программирование, настройка и что-нибудь ещё...</subtitle>

	<updated>2024-08-27T18:59:05Z</updated>

	<link rel="alternate" type="text/html" href="https://dimio.org" />
	<id>https://dimio.org/feed/atom</id>
	<link rel="self" type="application/atom+xml" href="https://dimio.org/tag/linux/feed/atom" />

	<generator uri="https://wordpress.org/" version="6.8.3">WordPress</generator>
	<entry>
		<author>
			<name>dimio</name>
							<uri>http://dimio.org</uri>
						</author>

		<title type="html"><![CDATA[Git: извлечение первого и последнего коммита по автору]]></title>
		<link rel="alternate" type="text/html" href="https://dimio.org/git-izvlechenie-pervogo-i-poslednego-komita-po-avtoru.html" />

		<id>https://dimio.org/?p=1877</id>
		<updated>2023-05-05T05:48:05Z</updated>
		<published>2023-05-04T11:43:15Z</published>
		<category scheme="https://dimio.org" term="Кодинг" /><category scheme="https://dimio.org" term="Памятки" /><category scheme="https://dimio.org" term="git" /><category scheme="https://dimio.org" term="linux" /><category scheme="https://dimio.org" term="notes" />
		<summary type="html"><![CDATA[В силу определённых обстоятельств &#8212; периодически стал возникать вопрос, в каких временных рамках я занимался тем или иным проектом. И готового ответа на него у меня не было &#8212; как-то не приходило в голову фиксировать подобную информацию. Но есть же git &#8212; ведь он поможет? Ведь поможет, да? Git поможет! Возникла тривиальная идея &#8212; вытащить &#8230; <a href="https://dimio.org/git-izvlechenie-pervogo-i-poslednego-komita-po-avtoru.html" class="more-link">Читать далее <span class="screen-reader-text">Git: извлечение первого и последнего коммита по автору</span> <span class="meta-nav">&#8594;</span></a>]]></summary>

					<content type="html" xml:base="https://dimio.org/git-izvlechenie-pervogo-i-poslednego-komita-po-avtoru.html"><![CDATA[
<p>В силу определённых обстоятельств &#8212; периодически стал возникать вопрос, в каких временных рамках я занимался тем или иным проектом. И готового ответа на него у меня не было &#8212; как-то не приходило в голову фиксировать подобную информацию.</p>



<div class="wp-block-media-text alignwide is-stacked-on-mobile is-vertically-aligned-top is-style-default" style="grid-template-columns:30% auto"><figure class="wp-block-media-text__media"><img decoding="async" width="200" height="200" src="https://dimio.org/wp-content/uploads/2023/05/padme-i-enakin-shablon-mema-200x200.png?v=1683192386" alt="" class="wp-image-1879 size-thumbnail"/></figure><div class="wp-block-media-text__content">
<p>Но есть же <code>git</code> &#8212; ведь он поможет? Ведь поможет, да?</p>
</div></div>



<span id="more-1877"></span>



<h2 class="wp-block-heading">Git поможет!</h2>



<p>Возникла тривиальная идея &#8212; вытащить эту информацию из гит-лога. Первый и последний коммиты &#8212; плюс-минус дадут требуемые рамки. Достаточно найти все коммиты определённого автора (в данном случае &#8212; себя) и взять первый+последний.</p>



<h3 class="wp-block-heading" id="git-alias-find-commits-by-author">Git alias для поиска по автору</h3>



<p>Чтобы не запоминать (или не искать в истории) довольно длинную команду &#8212; её удобно запихать в пользовательский alias (именно гита, не оболочки). Например &#8212; в <code>~/.gitconfig</code> прописать (в секции <mark><code>[alias]</code></mark>):</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">[alias]
	first-last-by-author = "!f() { \
	 LOG=$(git log --pretty=format:\"%h%x09%an%x09%ad%x09%s\" --date=short --author=\"${1}\"); \
	 FIRST=$(echo \"${LOG}\" | head --lines=1); \
	 LAST=$(echo \"${LOG}\" | tail --lines=1); \
	 echo \"${FIRST}\"; echo \"${LAST}\"; \
	}; f"</code></pre>



<p>В частном случае &#8212; это уже работает достаточно удобно и выглядит примерно так:</p>



<pre class="wp-block-preformatted">user@host:~/single-repo$ git first-last-by-author dmitry

f887e8aa55      Dmitry        2022-06-26
6f7a97ded7      Dmitry        2021-04-08</pre>



<p>Когда репозиторий для поиска &#8212; один. Или парочка. Или&#8230; Нет, когда их парочка сотен &#8212; становится грустно. Идея явно требует развития!</p>



<h3 class="wp-block-heading">One Function to find them all</h3>



<p>Для решения задачи поиска по набору репозиториев &#8212; пришлось воспользоваться функциями оболочки. Они у меня сложены в отдельном файле <code>~/.config/bash/<a href="https://dimio.org/bash-born-again-shell-obolochka-komandnoj-stroki.html#bash_functions">bash_functions</a></code>.</p>



<p>На базе <a href="/gitlab-sklonirovat-spisok-repozitoriev.html#git-update-repository-collection" data-type="URL" data-id="/gitlab-sklonirovat-spisok-repozitoriev.html#git-update-repository-collection">команды для обновления репозиториев</a> и приведённого выше <a href="#git-alias-find-commits-by-author" data-type="internal" data-id="#git-alias-find-commits-by-author">гит-алиаса для поиска по автору</a> &#8212; сделал такую вот bash-функцию:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">git-first-last-commit-by-author() {
	export GIT_SEARCH_AUTHOR_NAME="${1}"
	LOG=$(find . -type d -name '.git' | xargs -n1 -- \
	 sh -c 'cd "${0}/.." &amp;&amp; git first-last-by-author "${GIT_SEARCH_AUTHOR_NAME}" | sed "/^[[:space:]]*$/d"' \
	 | sort --key=4,4 \
	)
	unset GIT_SEARCH_AUTHOR_NAME
	echo "${LOG}" | head --lines=1
	echo "${LOG}" | tail --lines=1
}</code></pre>



<p>Теперь поиск работает и в общем случае (в каталоге <code>multi-repo</code> лежит куча git-репозиториев):</p>



<pre class="wp-block-preformatted">user@host:~/multi-repo$ git-first-last-commit-by-author dmitry

8f1d4ae         Dmitry        2022-08-16
83a8f89c        Dmitry        2023-02-15</pre>



<p>Видно, что здесь порядок сортировки по датам &#8212; прямой. Мне так удобней, но всегда можно использовать ключ <code><mark>--reverse</mark></code> для <code>sort</code> внутри <code>git-first-last-commit-by-author()</code>.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://dimio.org/git-izvlechenie-pervogo-i-poslednego-komita-po-avtoru.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://dimio.org/git-izvlechenie-pervogo-i-poslednego-komita-po-avtoru.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>dimio</name>
							<uri>http://dimio.org</uri>
						</author>

		<title type="html"><![CDATA[GitLab: склонировать список репозиториев]]></title>
		<link rel="alternate" type="text/html" href="https://dimio.org/gitlab-sklonirovat-spisok-repozitoriev.html" />

		<id>https://dimio.org/?p=1820</id>
		<updated>2023-05-04T10:30:01Z</updated>
		<published>2023-03-15T07:11:28Z</published>
		<category scheme="https://dimio.org" term="Кодинг" /><category scheme="https://dimio.org" term="Памятки" /><category scheme="https://dimio.org" term="git" /><category scheme="https://dimio.org" term="linux" /><category scheme="https://dimio.org" term="notes" />
		<summary type="html"><![CDATA[Решил слегка &#171;причесать&#187; и обобщить свой опыт по этому вопросу. Чтобы удобней было пользоваться, как этакой краткой инструкцией, а не искать разрозненные ответы на SO и т.п. Задача проста &#8212; сделать удобно 🙂 Загрузка списка репозиториев с GitLab Тут всё несложно &#8212; надо получить сам список и по нему всё скачать. Удобнее это делать с &#8230; <a href="https://dimio.org/gitlab-sklonirovat-spisok-repozitoriev.html" class="more-link">Читать далее <span class="screen-reader-text">GitLab: склонировать список репозиториев</span> <span class="meta-nav">&#8594;</span></a>]]></summary>

					<content type="html" xml:base="https://dimio.org/gitlab-sklonirovat-spisok-repozitoriev.html"><![CDATA[
<p>Решил слегка &#171;причесать&#187; и обобщить свой опыт по этому вопросу. Чтобы удобней было пользоваться, как этакой краткой инструкцией, а не искать разрозненные ответы на SO и т.п.</p>



<p>Задача проста &#8212; сделать удобно <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<ol class="wp-block-list">
<li> Взять GitLab (много где используется, как self-hosted) и выкачать с него все репозитории проекта. Чтобы можно было локально работать с ними, не загружая каждый отдельно.</li>



<li>Обновлять эти репозитории одной командой</li>
</ol>



<span id="more-1820"></span>



<h2 class="wp-block-heading">Загрузка списка репозиториев с GitLab</h2>



<p>Тут всё несложно &#8212; надо получить сам список и по нему всё скачать. Удобнее это делать с использованием <a href="https://dimio.org/tag/ssh">ssh</a> ключа (добавляется в GitLab через веб-интерфейс). Но можно и <a href="https://dimio.org/git-config-s-razdeleniem-po-proektam.html#git-http-credentials">git credentials включить</a>. Сам список достаточно просто в браузере открыть и сохранить <em>projects.json</em> (название по умолчанию).</p>



<ul class="wp-block-list">
<li>Список репозиториев: <code>https://your-gitlab-host/api/v4/projects?per_page=1000</code></li>



<li>Или список для группы проектов: <code>https://your-gitlab-host/api/v4/groups/{group-id}/projects?per_page=1000</code></li>
</ul>



<p><code>group-id</code> можно тоже через веб-интерфейс посмотреть, примерно так:</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img fetchpriority="high" decoding="async" width="510" height="275" src="https://dimio.org/wp-content/uploads/2023/03/gitlab-group-id-510x275.png?v=1677671512" alt="" class="wp-image-1821" srcset="https://dimio.org/wp-content/uploads/2023/03/gitlab-group-id-510x275.png?v=1677671512 510w, https://dimio.org/wp-content/uploads/2023/03/gitlab-group-id-400x216.png?v=1677671512 400w, https://dimio.org/wp-content/uploads/2023/03/gitlab-group-id.png?v=1677671512 517w" sizes="(max-width: 510px) 100vw, 510px" /><figcaption class="wp-element-caption">GitLab project group ID</figcaption></figure></div>


<ul class="wp-block-list">
<li>Выкачать (в текущий каталог) репозитории по списку из файла: <code>jq -r '.[].ssh_url_to_repo' &lt; <strong>/path/to/projects.json</strong> | xargs -n1 git clone</code>. Можно аналоги утилиты <code>jq</code> использовать, мне она привычней.</li>



<li>Если авторизация по ssh-ключу не настроена &#8212; придется из json вместо поля <code>ssh_url_to_repo</code> извлекать поле <code>http_url_to_repo</code>. Можно хранить логин/пароль для GitLab в <code><a href="https://dimio.org/git-config-s-razdeleniem-po-proektam.html#git-http-credentials">~/.git-credentials</a></code> (там они лежат в открытом виде!).</li>
</ul>



<p>Первая часть на этом закончена. На очереди &#8212; обновление репозиториев.</p>



<h2 class="wp-block-heading" id="git-update-repository-collection">Обновление списка репозиториев</h2>



<p>Здесь всё ещё проще &#8212; достаточно одной команды. Перейти в каталог со склонированными репозиториями и выполнить:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">find . -type d -name '.git' \
| xargs -n1 -- sh -c \
'cd "${0}/.." &amp;&amp; echo \
&amp;&amp; basename -sa $(git rev-parse --show-toplevel) \
&amp;&amp; git pull --all'</code></pre>



<p>Найдёт все каталоги с директорией <code>.git</code> внутри (а это и есть репозитории) и обновит их через <code>git pull --all</code>. Соответственно, каталоги, не являющиеся репозиториями, будут проигнорированы. Готово!</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://dimio.org/gitlab-sklonirovat-spisok-repozitoriev.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://dimio.org/gitlab-sklonirovat-spisok-repozitoriev.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>dimio</name>
							<uri>http://dimio.org</uri>
						</author>

		<title type="html"><![CDATA[CloudFlare WARP + WireGuard = простой способ разблокировки сайтов]]></title>
		<link rel="alternate" type="text/html" href="https://dimio.org/cloudflare-warp-wireguard-prostoj-sposob-razblokirovki.html" />

		<id>https://dimio.org/?p=1814</id>
		<updated>2024-08-27T18:59:05Z</updated>
		<published>2023-02-27T15:14:01Z</published>
		<category scheme="https://dimio.org" term="*NIX" /><category scheme="https://dimio.org" term="Интернет" /><category scheme="https://dimio.org" term="Памятки" /><category scheme="https://dimio.org" term="linux" /><category scheme="https://dimio.org" term="notes" /><category scheme="https://dimio.org" term="vpn" />
		<summary type="html"><![CDATA[Долгое время пользовался ssh-туннелем для &#171;разблокировки&#187; некоторых сетевых ресурсов, доступ к которым был ограничен для IP Российского диапазона (ну, драйверы там скачать с сайта производителя, и т.п.). Но &#8212; всему приходит конец. Моему терпению &#8212; тоже. Надоело постоянно переключать потребителей на работу через прокси (privoxy), чтобы завернуть трафик в socks-прокси туннеля. TOR стали прикручивать, что &#8230; <a href="https://dimio.org/cloudflare-warp-wireguard-prostoj-sposob-razblokirovki.html" class="more-link">Читать далее <span class="screen-reader-text">CloudFlare WARP + WireGuard = простой способ разблокировки сайтов</span> <span class="meta-nav">&#8594;</span></a>]]></summary>

					<content type="html" xml:base="https://dimio.org/cloudflare-warp-wireguard-prostoj-sposob-razblokirovki.html"><![CDATA[
<p>Долгое время пользовался <a rel="noreferrer noopener" href="https://dimio.org/pamyatki-po-rabote-v-linux.html#ssh-tunnel" target="_blank">ssh-туннелем</a> для &#171;разблокировки&#187; некоторых сетевых ресурсов, доступ к которым был ограничен для IP Российского диапазона (ну, драйверы там скачать с сайта производителя, и т.п.).</p>



<p>Но &#8212; всему приходит конец. Моему терпению &#8212; тоже. Надоело постоянно переключать потребителей на работу через прокси (privoxy), чтобы завернуть трафик в socks-прокси туннеля. <a href="https://dimio.org/tor-the-onion-router-luchshij-iz-besplatnyx-proksi.html">TOR</a> стали прикручивать, что привело к очень долгому поиску мостов. И лень моя победила (в очередной раз).</p>



<p>Очевидно &#8212; нужен был способ попроще, да ещё &#8212; без особых затрат. Ставить VPN сервер (в том или ином виде) на VPS &#8212; хотелось ещё меньше, чем кидать туннель. Всякие платные прокси (типа Mullvad) &#8212; они удобны, позволяют выбрать &#171;точку выхода&#187;, но &#8212; надо изыскивать возможность их оплатить. Бесплатные &#8212; обычно, работают так себе.</p>



<span id="more-1814"></span>



<p>Тут я вспомнил, что есть же CloudFlare и его WARP, причем &#8212; в бесплатной версии, да со всей мощью клаудфлэровских серверов, да без ограничений скорости, да ещё и &#8212; должен, теоретически, работать через нативный клиент WireGuard. &#171;Надо попробовать&#187; &#8212; подумал Штирлиц.</p>



<h2 class="wp-block-heading" id="cloudflare-warp-linux">Настройка WARP в Linux</h2>



<p>В целом, процесс достаточно понятный, на современных системах &#8212; проблем быть не должно (на современных &#8212; это где Network Manager поддерживает Wire Guard, иначе &#8212; можно и через консоль поднимать/гасить интерфейс VPN, но это менее удобно).</p>



<ul class="wp-block-list">
<li>Сгенерировать конфиг для WARP &#8212; <a rel="noreferrer noopener" href="https://github.com/maple3142/cf-warp" target="_blank">консольной утилитой</a> или <a rel="noreferrer noopener" href="https://cf-warp.maple3142.net/" target="_blank">онлайн-генератором</a> на её базе. Ещё есть <a href="https://github.com/ViRb3/wgcf" target="_blank" rel="noreferrer noopener">неофициальный CLI</a>, мне он не пригодился.</li>



<li>Полученный конфиг можно сунуть в <code>/etc/wireguard/</code> и попробовать поднять через <code>systemctl start wg-quick@название-конфига.conf</code>. Но вряд ли это заработает, конфиг придется править.</li>
</ul>



<h3 class="wp-block-heading" id="warp-wireguard-config">Конфиг WireGuard для WARP</h3>



<p>А чтобы не править его, передергивая интерфейс вручную из консоли, &#8212; проще сразу добавить в Network Manager. Подобрать рабочие настройки там, затем &#8212; перенести в конфиг. И получить основной (через графический интерфейс) и резервный (из консоли) способы работы с WARP. Чем и займёмся.</p>



<h4 class="wp-block-heading">Настройка Network Manager</h4>



<p>Тут всё тоже несложно: <em>ПКМ на аплете менеджера &#8212; Соединения VPN &#8212; Настроить VPN &#8212; WireGuard &#8212; &#8216;+&#8217; (добавить новое соединение)</em>.</p>



<p>Дальше настроить по картинке (скопировать значения из файла конфига):</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://dimio.org/wp-content/uploads/2023/02/networkmanager-wireguard-warp-config.png"><img decoding="async" width="853" height="868" src="https://dimio.org/wp-content/uploads/2023/02/networkmanager-wireguard-warp-config.png?v=1677505707" alt="" class="wp-image-1816" style="width:640px;height:651px" srcset="https://dimio.org/wp-content/uploads/2023/02/networkmanager-wireguard-warp-config.png?v=1677505707 853w, https://dimio.org/wp-content/uploads/2023/02/networkmanager-wireguard-warp-config-393x400.png?v=1677505707 393w, https://dimio.org/wp-content/uploads/2023/02/networkmanager-wireguard-warp-config-501x510.png?v=1677505707 501w, https://dimio.org/wp-content/uploads/2023/02/networkmanager-wireguard-warp-config-768x782.png?v=1677505707 768w" sizes="(max-width: 853px) 100vw, 853px" /></a><figcaption class="wp-element-caption">Настройки CloudFlare WARP для WireGuard VPN</figcaption></figure></div>


<p>Но вот адрес для Endpoint придется поподбирать &#8212; на разных провайдерах работают разные IP. Я прошелся по адресам с <code>162.159.193.0</code> по <code>162.159.193.10</code>, пока не нашел работающий.</p>



<p>В целом &#8212; соединение уже должно работать (надо только <code>Address</code> в <code>Параметры IPv4</code> вписать, как ниже показано), проверить можно через 2ip.ru. Вот такая картина у меня:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="459" height="227" src="https://dimio.org/wp-content/uploads/2023/02/networkmanager-wireguard-warp-config-check-ip.png" alt="" class="wp-image-1818" srcset="https://dimio.org/wp-content/uploads/2023/02/networkmanager-wireguard-warp-config-check-ip.png?v=1677507325 459w, https://dimio.org/wp-content/uploads/2023/02/networkmanager-wireguard-warp-config-check-ip-400x198.png?v=1677507325 400w" sizes="auto, (max-width: 459px) 100vw, 459px" /><figcaption class="wp-element-caption">2ip &#8212; check ClaudFlare WARP</figcaption></figure></div>


<p>Подключается не всегда с первого раза, бывает, нужно несколько раз <em>вкл/выкл</em> VPN.</p>



<h3 class="wp-block-heading">Google DNS и Wire Guard WARP</h3>



<p>Но радость была бы не полной, если бы не ещё одна чудесная возможность WireGuard &#8212; он позволяет для соединения легко поменять адрес DNS сервера. Это не защитит от утечки DNS на сто процентов, но позволяет обойти блок, выставляемый на некоторых ресурсах на основе географической принадлежности DNS сервера (а клаудфлэровский <code>1.1.1.1</code> определялся, как находящийся в Москве).</p>



<p>В настройки IPv4 надо вписать гугловый DNS, в настройки IPv6 &#8212; можно по аналогии (IPv6-адрес DNS ищется в гугле же), а можно и обойтись только IPv4.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="846" height="576" src="https://dimio.org/wp-content/uploads/2023/02/networkmanager-wireguard-warp-config-dns.png?v=1677507021" alt="" class="wp-image-1817" style="width:635px;height:432px" srcset="https://dimio.org/wp-content/uploads/2023/02/networkmanager-wireguard-warp-config-dns.png?v=1677507021 846w, https://dimio.org/wp-content/uploads/2023/02/networkmanager-wireguard-warp-config-dns-400x272.png?v=1677507021 400w, https://dimio.org/wp-content/uploads/2023/02/networkmanager-wireguard-warp-config-dns-510x347.png?v=1677507021 510w, https://dimio.org/wp-content/uploads/2023/02/networkmanager-wireguard-warp-config-dns-768x523.png?v=1677507021 768w" sizes="auto, (max-width: 846px) 100vw, 846px" /><figcaption class="wp-element-caption">WireGuard Google public DNS</figcaption></figure></div>


<p>Ещё один неплохой вариант &#8212; использовать один из адресов <a href="https://api.opennic.org/geoip/">DNS от OpenNIC</a>. Это даст возможность доступа к доменным зонам <code>.lib</code> и <code>.coin</code>, в которых имеют зеркала некоторые популярные, но блокируемые, сайты.</p>



<h3 class="wp-block-heading">Итого</h3>



<p>Вот теперь &#171;разблокировка&#187; должна работать нормально.</p>



<p>Из плюсов &#8212; VPN включается сразу на уровне системы, приложения ходят через него. Не надо, как в случае с ssh-туннелем, заворачивать приложения для работы через туннель.</p>



<p>Второй плюс &#8212; ровно тем же способом можно включить WARP на Android. <a href="https://f-droid.org/ru/packages/com.wireguard.android/">Клиент WireGuard под Android</a> есть (ставил из F-Droid), надо только поправить сгенерированный конфиг по аналогии (как в заметке), затем &#8212; импортировать его в клиенте на телефоне. Всё!</p>



<p>Следующим шагом &#8212; можно настроить подключение WARP на роутере, чтобы всю внутреннюю сеть пускать в интернет через VPN. Я на своём Keenetic планирую так и сделать, но это &#171;уже совсем другая история&#187;. <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://dimio.org/cloudflare-warp-wireguard-prostoj-sposob-razblokirovki.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://dimio.org/cloudflare-warp-wireguard-prostoj-sposob-razblokirovki.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>dimio</name>
							<uri>http://dimio.org</uri>
						</author>

		<title type="html"><![CDATA[Midnight Commander]]></title>
		<link rel="alternate" type="text/html" href="https://dimio.org/midnight-commander.html" />

		<id>https://dimio.org/?p=1746</id>
		<updated>2023-10-19T20:04:57Z</updated>
		<published>2022-10-22T15:02:36Z</published>
		<category scheme="https://dimio.org" term="*NIX" /><category scheme="https://dimio.org" term="Памятки" /><category scheme="https://dimio.org" term="linux" /><category scheme="https://dimio.org" term="mc" /><category scheme="https://dimio.org" term="midnight commander" /><category scheme="https://dimio.org" term="notes" />
		<summary type="html"><![CDATA[Решил собрать в одном месте (для памяти и удобства использования) некоторые нужные настройки и возможности MC, ранее валявшиеся разрозненно по разным заметкам. Даже при ежедневном использовании MC в качестве файлового менеджера &#8212; некоторые горячие клавиши забываются и приходится перелистывать справку. Доступ к ним в табличном виде оказывается быстрей и удобней. По мере необходимости &#8212; буду &#8230; <a href="https://dimio.org/midnight-commander.html" class="more-link">Читать далее <span class="screen-reader-text">Midnight Commander</span> <span class="meta-nav">&#8594;</span></a>]]></summary>

					<content type="html" xml:base="https://dimio.org/midnight-commander.html"><![CDATA[
<p>Решил собрать в одном месте (для памяти и удобства использования) некоторые нужные настройки и возможности MC, ранее валявшиеся разрозненно по разным заметкам.</p>



<p>Даже при ежедневном использовании <em>MC</em> в качестве файлового менеджера &#8212; некоторые горячие клавиши забываются и приходится перелистывать справку. Доступ к ним в табличном виде оказывается быстрей и удобней. По мере необходимости &#8212; буду пополнять заметку.</p>



<span id="more-1746"></span>



<h2 class="wp-block-heading">Основные клавиатурные сокращения Midnight Commander</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Сочетание клавишей</th><th>Действие</th></tr></thead><tbody><tr><td><code>Alt + o</code></td><td>Открыть на соседней панели директорию, на которой стоит курсор</td></tr><tr><td><code>Alt + i</code></td><td>Открыть на соседней панели текущую</td></tr><tr><td><code>Alt + t</code></td><td>Переключать режим листинга панели по кругу: по умолчанию, краткий, длинный, пользовательский</td></tr><tr><td><code>Alt + s</code></td><td>Быстрый поиск по имени файла/каталога</td></tr><tr><td><code>Alt + ,</code></td><td>Переключить режим отображения панелей (вертикально/горизонтально)</td></tr><tr><td><code>Alt + .</code></td><td>Показать/скрыть скрытые файлы или каталоги</td></tr><tr><td><code>Alt + `</code></td><td>Список “экранов” &#8212; панели, открытые на просмотр/редактирование файлы</td></tr><tr><td><code>Alt + h</code></td><td>Вызов списка последних выполненных команд</td></tr><tr><td><code>Alt + Shift + ?</code></td><td>Диалог поиска по файлам</td></tr><tr><td><code>Alt + Shift + h</code></td><td>Вызов истории переходов по каталогам</td></tr><tr><td><code>Alt + Shift + !</code></td><td>Вывод внешней команды в “просмотр”</td></tr><tr><td><code>Alt + Shift + e</code></td><td>Вызов истории просмотра/редактирования файлов</td></tr><tr><td><code>Alt + y</code></td><td>Перейти в предыдущий каталог в истории</td></tr><tr><td><code>Alt + u</code></td><td>Перейти к следующему каталогу в истории</td></tr><tr><td><code>Alt + g</code></td><td>Отмечает первый файл или каталог в отображаемом списке на панели</td></tr><tr><td><code>Alt + r</code></td><td>Отмечает средний файл или каталог в отображаемом списке на панели</td></tr><tr><td><code>Alt + j</code></td><td>Отмечает последний файл или каталог в отображаемом списке на панели</td></tr><tr><td></td><td></td></tr><tr><td><code>Ctrl/Alt + Enter</code></td><td>Подставить в консоль имя активного объекта</td></tr><tr><td><code>Ctrl + Shift + Enter</code></td><td>Подставить в консоль имя активного объекта, включая полный путь</td></tr><tr><td><code>Ctrl + x t</code></td><td>Подставить в консоль выделенные объекты (имена)</td></tr><tr><td><code>Ctrl + x c</code></td><td>Посмотреть/поменять права (chmod) для отмеченных файлов</td></tr><tr><td><code>Ctrl + x o</code></td><td>Посмотреть/поменять владельца (chown) для отмеченных файлов</td></tr><tr><td><code>Ctrl + x s</code></td><td>Создать симлинк</td></tr><tr><td><code>Ctrl + x Ctrl + s</code></td><td>Редактировать симлинк</td></tr><tr><td><code>Ctrl + x l</code></td><td>Хардлинк</td></tr><tr><td><code>Ctrl + x d</code></td><td>Сравнить каталоги (diff)</td></tr><tr><td><code>Ctrl + x Ctrl + d</code></td><td>Сравнить файлы (diff)</td></tr><tr><td><code>Ctrl + x a</code></td><td>Открывает диалог виртуальных файловых систем (vfs)</td></tr><tr><td><code>Ctrl + x !</code></td><td>Внешняя панелизация (вывод внешней команды в виде листинга на панели)</td></tr><tr><td><code>Ctrl + x j</code></td><td>Показать все фоновые задачи</td></tr><tr><td><code>Ctrl + x q</code></td><td>Быстрый просмотр содержимого файла на второй панели</td></tr><tr><td><code>Ctrl + x i</code></td><td>Быстрый просмотр информации о текущем объекте на второй панели</td></tr><tr><td><code>Ctrl + \</code></td><td>Меню избранного (закладки)</td></tr><tr><td><code>Ctrl + r</code></td><td>Обновить активную панель</td></tr><tr><td><code>Ctrl + l</code></td><td>Перерисовать интерфейс</td></tr><tr><td><code>Ctrl + u</code></td><td>Поменять панели местами</td></tr><tr><td><code>Ctrl + Space</code></td><td>Рассчитать размер каталога (когда курсор на .. &#8212; рассчитать размер всех каталогов, расположенных в текущем)</td></tr><tr><td></td><td></td></tr><tr><td><code>Shift + F3</code></td><td>Просмотр “сырого” содержимого файла</td></tr><tr><td><code>Shift + F4</code></td><td>Создать файл</td></tr><tr><td></td><td></td></tr><tr><td><code>Alt + r</code></td><td>Переключает отображение линейки при просмотре файлов</td></tr></tbody></table><figcaption class="wp-element-caption">В качестве альтернативы <code>Alt</code> может использоваться <code>Esc</code>.<br />Для многих горячих клавишей применяется префикс в виде <code>Ctrl + x</code> (в таблице приводится без сокращения).</figcaption></figure>



<h3 class="wp-block-heading" id="mc-screens">Необходимое пояснение</h3>



<p>Действие сочетания <code>Alt + `</code>, вызывающего список &#171;экранов&#187;, стоит дополнительно описать подробней и проиллюстрировать. К сожалению, оно не может служить в качестве полноценной замены &#171;вкладкам&#187;, но, в сочетании со списком избранных каталогов и списком открытых VFS, позволяет достаточно удобно использовать MC не только для банальной навигации по файловой системе.</p>



<p>На &#171;вкладке экранов&#187; содержится список файлов, открытых через MC на просмотр/редактирование (при использовании <em>mcedit</em>). На примере ниже &#8212; для просмотра открыты <em>man <a href="https://dimio.org/tag/wget">wget</a></em> и текстовый конфиг. Между &#171;экранами&#187; можно переключаться без выхода из режима просмотра/редактирования.</p>


<div class="wp-block-image is-style-default">
<figure class="aligncenter size-large"><a href="https://dimio.org/wp-content/uploads/2022/10/izobrazhenie.png"><img loading="lazy" decoding="async" width="506" height="510" src="https://dimio.org/wp-content/uploads/2022/10/izobrazhenie-506x510.png?v=1666443773" alt="" class="wp-image-1747" srcset="https://dimio.org/wp-content/uploads/2022/10/izobrazhenie-506x510.png?v=1666443773 506w, https://dimio.org/wp-content/uploads/2022/10/izobrazhenie-397x400.png?v=1666443773 397w, https://dimio.org/wp-content/uploads/2022/10/izobrazhenie-768x773.png?v=1666443773 768w, https://dimio.org/wp-content/uploads/2022/10/izobrazhenie.png?v=1666443773 1296w" sizes="auto, (max-width: 506px) 100vw, 506px" /></a><figcaption class="wp-element-caption">Midnigth Commander Screens</figcaption></figure></div>


<h2 class="wp-block-heading">Кодировка в Midnigth Commander</h2>



<p>Для совмещения англоязычного интерфейса MC (а именно в нём без проблем работают различные хоткеи для меню, да и просто это удобней) с поддержкой юникода в интерфейсе (имена файлов, редактор, просмотрщик) &#8212; различные источники дают совет использовать псевдоним для команды запуска MC в виде <code>LANG=en_EN.utf8 mc</code>.</p>



<p>В Убунту такой подход ломал кодировку при отображении имён файлов (и переключение выбора кодировки панели по <code>Alt+e</code> не спасало ситуацию). Работающий <em>alias</em> выглядит следующим образом: <code>LANGUAGE=en_EN.utf8 mc</code>.</p>



<div class="wp-block-buttons has-custom-font-size has-small-font-size is-content-justification-center is-nowrap is-layout-flex wp-container-core-buttons-is-layout-1fb9aab6 wp-block-buttons-is-layout-flex">
<div class="wp-block-button has-custom-width wp-block-button__width-100 is-style-outline is-style-outline--1"><a class="wp-block-button__link wp-element-button" href="https://t.me/panykey/" target="_blank" rel="noreferrer noopener">Комментировать в телеграм</a></div>
</div>
]]></content>
		
					<link rel="replies" type="text/html" href="https://dimio.org/midnight-commander.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://dimio.org/midnight-commander.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>dimio</name>
							<uri>http://dimio.org</uri>
						</author>

		<title type="html"><![CDATA[Idea &#8212; подключение к Docker в Windows WSL2]]></title>
		<link rel="alternate" type="text/html" href="https://dimio.org/idea-podklyuchenie-k-docker-v-windows-wsl2.html" />

		<id>https://dimio.org/?p=1708</id>
		<updated>2022-08-23T18:32:46Z</updated>
		<published>2021-12-23T17:45:20Z</published>
		<category scheme="https://dimio.org" term="*NIX" /><category scheme="https://dimio.org" term="Кодинг" /><category scheme="https://dimio.org" term="Сервисы" /><category scheme="https://dimio.org" term="Хитрости" /><category scheme="https://dimio.org" term="docker" /><category scheme="https://dimio.org" term="idea" /><category scheme="https://dimio.org" term="linux" /><category scheme="https://dimio.org" term="notes" /><category scheme="https://dimio.org" term="windows" />
		<summary type="html"><![CDATA[Небольшая памятка для себя. Понадобилось воспользоваться докером в Windows 10. При этом &#8212; уже установлена Ubuntu внутри WSL2. То есть &#8212; ставить сверху ещё и графический Docker Desktop, поднимающий свои контейнеры в отдельных виртуалках WSL, особой необходимости нет. Управлять контейнерами можно прямо из Idea. Небольшое неудобство возникло с тем, что Docker плагин в idea (под &#8230; <a href="https://dimio.org/idea-podklyuchenie-k-docker-v-windows-wsl2.html" class="more-link">Читать далее <span class="screen-reader-text">Idea &#8212; подключение к Docker в Windows WSL2</span> <span class="meta-nav">&#8594;</span></a>]]></summary>

					<content type="html" xml:base="https://dimio.org/idea-podklyuchenie-k-docker-v-windows-wsl2.html"><![CDATA[<p>Небольшая памятка для себя. Понадобилось воспользоваться докером в Windows 10. При этом &#8212; уже установлена Ubuntu внутри WSL2. То есть &#8212; ставить сверху ещё и графический Docker Desktop, поднимающий свои контейнеры в отдельных виртуалках WSL, особой необходимости нет. Управлять контейнерами можно прямо из Idea.<br />
Небольшое неудобство возникло с тем, что Docker плагин в idea (под Win) поддерживает Docker for Windows, но не умеет напрямую работать с докером внутри WSL. Вариантов несколько, среди них &#8212; подключение через tcp socket или через ssh.<br />
Против tcp socket возникли два аргумента &#8212; сложнее настроить (чтобы просто пара настроек &#8212; и заработало &#8212; такого не произошло, пришлось повозиться); кроме того &#8212; <a href="https://docs.docker.com/engine/security/#docker-daemon-attack-surface" rel="noopener" target="_blank">руководство Docker не рекомендует пользоваться им</a> из-за наличия потенциальной уязвимости.<br />
Остановился на ssh &#8212; это проще, и в целом удовлетворяет моим потребностям.<br />
<span id="more-1708"></span></p>
<h2>Настройка доступа к Docker в WSL2 через ssh</h2>
<ul>
<li>Убедиться, что установлен ssh сервер (при необходимости &#8212; установить): <code>apt search openssh-server</code></li>
<li>Разрешить подключения к серверу &#8212; отредактировать <em>sshd_config</em> (<code>sudoedit /etc/ssh/sshd_config</code>). Минимально необходимое &#8212; указать порт для подключения и способ аунтефикации (пример настроек: <em>Port 22</em>, <em>PasswordAuthentication yes</em>)</li>
<li>Перезапустить ssh сервер: <code>sudo service ssh restart</code></li>
<li>И проверить возможность подключения: <code>ssh dimio@localhost</code></li>
<li>Наконец &#8212; запустить сам docker (настройки демона лежат в <em>/etc/docker/daemon.json</em>): <code>sudo service docker start</code></li>
<li>Убедиться в работоспособности: <code>docker ps</code></li>
</ul>
<h2>Настройка Idea для подключения к Docker через ssh</h2>
<ul>
<li>Перейти в <strong>Настройки</strong> (<em>Ctrl+Alt+S</em>) -&gt; <strong>Build, Execution, Deployment</strong> -&gt; <strong>Docker</strong></li>
<li>Создать новое подключение к Docker, тип соединения с демоном &#8212; SSH<br />
<img loading="lazy" decoding="async" src="https://dimio.org/wp-content/uploads/2021/12/docker-wsl2-idea-add-connection.png" alt="Idea add Docker connection" class="aligncenter size-full wp-image-1711" width="762" height="362" srcset="https://dimio.org/wp-content/uploads/2021/12/docker-wsl2-idea-add-connection.png?v=1640281100 762w, https://dimio.org/wp-content/uploads/2021/12/docker-wsl2-idea-add-connection-400x190.png?v=1640281100 400w, https://dimio.org/wp-content/uploads/2021/12/docker-wsl2-idea-add-connection-510x242.png?v=1640281100 510w" sizes="auto, (max-width: 762px) 100vw, 762px" /></li>
<li>Добавить конфигурацию SSH для подключения к WSL2, проверить подключение<br />
<img loading="lazy" decoding="async" src="https://dimio.org/wp-content/uploads/2021/12/docker-wsl2-ssh-connect.png" alt="docker-wsl2-ssh-connect" class="aligncenter size-full wp-image-1709" width="1027" height="610" srcset="https://dimio.org/wp-content/uploads/2021/12/docker-wsl2-ssh-connect.png?v=1640279679 1027w, https://dimio.org/wp-content/uploads/2021/12/docker-wsl2-ssh-connect-400x238.png?v=1640279679 400w, https://dimio.org/wp-content/uploads/2021/12/docker-wsl2-ssh-connect-510x303.png?v=1640279679 510w, https://dimio.org/wp-content/uploads/2021/12/docker-wsl2-ssh-connect-768x456.png?v=1640279679 768w" sizes="auto, (max-width: 1027px) 100vw, 1027px" /></li>
</ul>
<h3>Управление контейнерами Docker из Idea</h3>
<p>На этом всё &#8212; теперь можно удобно взаимодействовать с контейнерами прямо из Idea (вкладка <em>Services</em>)<br />
<img loading="lazy" decoding="async" src="https://dimio.org/wp-content/uploads/2021/12/docker-wsl2-idea.png" alt="Docker в IDEA" class="aligncenter size-full wp-image-1710" width="437" height="392" srcset="https://dimio.org/wp-content/uploads/2021/12/docker-wsl2-idea.png?v=1640280667 437w, https://dimio.org/wp-content/uploads/2021/12/docker-wsl2-idea-400x359.png?v=1640280667 400w" sizes="auto, (max-width: 437px) 100vw, 437px" /></p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://dimio.org/idea-podklyuchenie-k-docker-v-windows-wsl2.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://dimio.org/idea-podklyuchenie-k-docker-v-windows-wsl2.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>dimio</name>
							<uri>http://dimio.org</uri>
						</author>

		<title type="html"><![CDATA[Автозапуск tmux и автоподключение к нему]]></title>
		<link rel="alternate" type="text/html" href="https://dimio.org/avtomaticheskoe-podklyuchenie-k-tmux.html" />

		<id>http://dimio.org/?p=1429</id>
		<updated>2022-09-03T16:11:25Z</updated>
		<published>2016-01-18T05:55:15Z</published>
		<category scheme="https://dimio.org" term="*NIX" /><category scheme="https://dimio.org" term="Полезности" /><category scheme="https://dimio.org" term=".rc" /><category scheme="https://dimio.org" term="bash" /><category scheme="https://dimio.org" term="linux" /><category scheme="https://dimio.org" term="tmux" />
		<summary type="html"><![CDATA[Сделал себе автоподключение к сессии tmux (или автозапуск tmux-сервера с новой сессией, если её ещё нет) при заходе в локальную консоль или при подключении по ssh к удалённым машинам (пользоваться бесплатным шеллом bshellz стало удобней). Теперь, при логине в локальную консоль, происходит автоматический запуск tmux-сервера (если нужно) и подключение к нему, при заходе через ssh &#8230; <a href="https://dimio.org/avtomaticheskoe-podklyuchenie-k-tmux.html" class="more-link">Читать далее <span class="screen-reader-text">Автозапуск tmux и автоподключение к нему</span> <span class="meta-nav">&#8594;</span></a>]]></summary>

					<content type="html" xml:base="https://dimio.org/avtomaticheskoe-podklyuchenie-k-tmux.html"><![CDATA[
<p>Сделал себе автоподключение к сессии tmux (или автозапуск tmux-сервера с новой сессией, если её ещё нет) при заходе в локальную консоль или при подключении по ssh к удалённым машинам (пользоваться <a href="https://dimio.org/besplatnyj-linux-shell-s-tmux-na-bortu.html">бесплатным шеллом bshellz</a> стало удобней).</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash"># Autostart tmux on login
 __autostart_tmux() {
     # $( type -p ) - built-in in sh or bash only?
     #TMUX_BIN="$( whereis tmux | cut -d " " -f 2 )"
     # which versions different output format
     TMUX_BIN="$( which tmux 2&gt; /dev/null )"
     if [ -z "${TMUX_BIN}" ]; then
         echo "Tmux not found"
         return 0
     fi

     TMUX_AS_SESS_NAME="$(echo "${USER}" | cut -c '1-3')"
     # return empty line if specified session exist or return 1
     TMUX_AS_SESS_RUN="$( tmux has-session -t "${TMUX_AS_SESS_NAME}" &amp;&gt; /dev/null || echo "$?" )"
     #TMUX_AS_DAEMON_MODE="$1" # $1 == "-d" or " "
     #TMUX_AS_EXIT="$2" # "return 0" or "exit 0"
    
     # do not attach automatically to tmux session if login on local XTerm
     if [ -z "${TMUX_AS_SESS_RUN}" ] &amp;&amp; [ -z "${SSH_TTY}" ] &amp;&amp; [ "${TERM}" = "xterm" ]; then
         echo "Tmux: running, not attached on local XTerm"
         return 0
     # do not run tmux automatically in another tmux (or screen)
     # in exists tmux session shell be started on non-login mode and .profile not used
     # (see set -g default-command "${SHELL}" in tmux.conf)
     elif [ -n "${TMUX}" ] || [ "${TERM}" = "screen" -o "${TERM}" = "screen-256color" ]; then
         echo 'Tmux: not be running in another terminal multiplexer "'${TERM}'"'
         return 0
     # attach to existed tmux session or create it and exit login-shell; or print error message
     else
         ((tmux has-session -t "${TMUX_AS_SESS_NAME}" &amp;&amp; exec tmux attach-session -t "${TMUX_AS_SESS_NAME}") || (tmux new-session -d -s "${TMUX_AS_SESS_NAME}" &amp;&amp; exec tmux attach-session -t "${TMUX_AS_SESS_NAME}")) &amp;&amp; exit 0;
         echo "Tmux: autostart failed: $?"
     fi
 }</code></pre>



<span id="more-1429"></span>



<p>Теперь, при логине в локальную консоль, происходит автоматический запуск tmux-сервера (если нужно) и подключение к нему, при заходе через ssh на удалённую машину (на которую предварительно скопирован <a href="https://dimio.org/cgi-bin/bps/hlghtsrc/sourcehl.cgi?d=conf&amp;s=profile&amp;l=sh">.profile</a>) &#8212; аналогично, при старте X-сервера и <a href="https://dimio.org/tag/openbox">openbox</a> &#8212; запускается tmux в режиме демона, без подключения к сессии.</p>



<p>Правда, для запуска xterm напрямую из меню openbox пришлось сделать костыль &#8212; запускать его сразу с указанием оболочки: <code inline="true" lang="bash">xterm -e bash</code>. В противном случае он то ли не выставляет переменную <code inline="true" lang="bash">${TERM}</code>, то ли выставляет её как-то отлично от <code inline="true" lang="bash">"xterm"</code> &#8212; не удалось разобраться. И в результате происходит подключение к tmux тогда, когда мне этого не нужно. А если сделать <code inline="true" lang="bash">xterm -e bash</code> и из запущенного терминала запустить новый: <code inline="true" lang="bash">xterm &amp;</code>, то в этом новом экземпляре терминала тоже произойдет подключение к сессии tmux. Хотелось бы знать, куда копать для исправления такой ситуации&#8230;</p>



<p><strong>UPD:</strong> Проблема была не в <code inline="true" lang="bash">${TERM}</code>, а в пустой переменной <code inline="true" lang="bash">${TMUX}</code> при запуске нового экземпляра xterm. Решилось добавлением проверки дополнительного условия <code inline="true" lang="bash">TMUX_AS_SESS_RUN=$( tmux has-session -t "${TMUX_AS_SESS_NAME}" )</code> при автозапуске tmux в x-terminal-emulator.</p>



<p><strong>UPD2</strong>: В OpenSSH с некоторых пор была добавлена опция <kbd>RemoteCommand</kbd> &#8212; как ясно из названия, она служит для выполнения команды удалённо после установки соединения. Поэтому, в простом случае, автозапуск <em>tmux</em> с подключением сессии можно выполнять средствами самого <em>ssh</em>. Либо через ключи командной строки, либо добавив в <code>~/.ssh/config</code> следующие параметры (с указанием имени сессии <em>tmux</em> или без оного, как в пример ниже):</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">RequestTTY      yes
RemoteCommand   tmux attach || tmux</code></pre>



<p>Или так, для создания именованой сессии:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">RequestTTY      yes
RemoteCommand   tmux new-session -As dim </code></pre>



<p>P.S.: Кстати, <em>tmux</em> отлично работает внутри <em>tmux</em> же. Для обращения к &#171;вложенному&#187; экземпляру надо использовать &#171;двойной&#187; командный префикс, по умолчанию это будет <code>Ctrl+b+b</code>. Или назначить &#171;вложенному&#187; свой префикс, что, на мой взгляд, менее удобно.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" src="https://dimio.org/wp-content/uploads/2022/09/image.png" alt="" class="wp-image-1737" width="346" height="148"/><figcaption>Удалённый tmux внутри локального</figcaption></figure></div>]]></content>
		
					<link rel="replies" type="text/html" href="https://dimio.org/avtomaticheskoe-podklyuchenie-k-tmux.html#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://dimio.org/avtomaticheskoe-podklyuchenie-k-tmux.html/feed/atom" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>dimio</name>
							<uri>http://dimio.org</uri>
						</author>

		<title type="html"><![CDATA[VCSH &#8212; спасение настроек в $HOME]]></title>
		<link rel="alternate" type="text/html" href="https://dimio.org/vcsh-spasenie-nastroek-v-home.html" />

		<id>http://dimio.org/?p=1359</id>
		<updated>2016-01-19T17:56:41Z</updated>
		<published>2015-10-16T12:34:26Z</published>
		<category scheme="https://dimio.org" term="*NIX" /><category scheme="https://dimio.org" term="Памятки" /><category scheme="https://dimio.org" term="Полезности" /><category scheme="https://dimio.org" term=".rc" /><category scheme="https://dimio.org" term="git" /><category scheme="https://dimio.org" term="linux" /><category scheme="https://dimio.org" term="notes" /><category scheme="https://dimio.org" term="vcsh" />
		<summary type="html"><![CDATA[Как ни странно, я только недавно познакомился с VCHS &#8212; надстройкой над Git, призванной облегчить резервирование конфигурационных файлов, расположенных в домашней директории (Version control system for $HOME &#8212; один из вариантов расшифровки аббревиатуры). Очень жаль, что этого не произошло раньше, и бэкап конфигов делался нерегулярно, кое-как, с изобретением различных костылей. Но, всё это в прошлом! &#8230; <a href="https://dimio.org/vcsh-spasenie-nastroek-v-home.html" class="more-link">Читать далее <span class="screen-reader-text">VCSH &#8212; спасение настроек в $HOME</span> <span class="meta-nav">&#8594;</span></a>]]></summary>

					<content type="html" xml:base="https://dimio.org/vcsh-spasenie-nastroek-v-home.html"><![CDATA[<p>Как ни странно, я только недавно познакомился с VCHS &#8212; надстройкой над Git, призванной облегчить резервирование <a href="https://dimio.org/config-dotfiles">конфигурационных файлов</a>, расположенных в домашней директории (<code lang="bash" inline="true">Version control system for $HOME</code> &#8212; один из вариантов расшифровки аббревиатуры). Очень жаль, что этого не произошло раньше, и бэкап конфигов делался нерегулярно, кое-как, с изобретением различных костылей. Но, всё это в прошлом! Итак, что же представляет собой VCSH и как ей пользоваться?<br />
<span id="more-1359"></span></p>
<h3>Сильные стороны VCSH</h3>
<p>Первое преимущество использования VCSH по сравнению с чистым git &#8212; конфиги остаются лежать в домашней директории, а история их изменений хранится отдельно в каталоге <code lang="bash" inline="true">${HOME}/.config/vcsh/repo.d</code>, что позволяет группировать файлы конфигов в разные наборы, хранящиеся в отдельных репозиториях и не зависящие друг от друг. Зачем это нужно? Таким способом можно синхронизировать на нескольких машинах только нужные везде конфиги, не таская лишние настройки повсюду. Например &#8212; иметь одинаковые настройки <a href="https://dimio.org/fajl-nastrojki-vim-vimrc-dlya-linux-i-windows.html">Vim</a> и <a href="https://dimio.org/bash-born-again-shell-obolochka-komandnoj-stroki.html">bash</a> на локальной и удаленной машинах, не перенося <a href="https://dimio.org/mplayer-vseyadnyj-videoproigryvatel.html">конфиг mplayer</a> на сервер, где и самого-то плеера нет. Еще плюс &#8212; <code lang="bash" inline="true">$HOME</code> является для VCSH рабочей директорией, что позволяет при помощи <code lang="bash" inline="true">git status</code> получить информацию об изменении существующих или появлении новых файлов в <code lang="bash" inline="true">$HOME</code> (кроме перечисленных в <em>.gitignore</em>), например &#8212; сведения о конфигах, созданных в процессе установки какой-то программы.</p>
<h3>Установка, настройка</h3>
<p>Установка в Debian элементарна, места VCSH требует совсем немного:</p>
<blockquote><p>
dimio@ibm $ sudo aptitude install vcsh<br />
Следующие НОВЫЕ пакеты будут установлены:<br />
  libio-pty-easy-perl{a} libio-pty-perl{a} mr{a} myrepos{a} vcsh<br />
0 пакетов обновлено, 5 установлено новых, 0 пакетов отмечено для удаления, и 0 пакетов не обновлено.<br />
Необходимо получить 121 kB архивов. После распаковки 434 kB будет занято.
</p></blockquote>
<p>Как видно из списка устанавливаемых пакетов, VCSH в работе использует <a href="https://dimio.org/tag/perl">perl</a> с библиотеками для создания <a rel="dofollow" href="http://citforum.ru/operating_systems/linux/HOWTO/Text-Terminal-HOWTO-5.shtml#ss5.2" target="_blank">псевдотерминалов</a> и утилиту для массового управления репозиториями &#8212; <em>myrepos</em>. Сам git у меня уже стоит, потому он и его зависимости &#8212; отсутствуют в списке устанавливаемых пакетов.<br />
Также перед началом работы имеет смысл сделать резервную копию всех конфигов, расположенных в домашней директории:<br />
<code lang="bash" inline="true">find ${HOME} -maxdepth 1 -name ".?*" ! \( -name .thumbnails \) -exec tar zcfv dotfiles_dotdirs_backup.tgz {} +</code><br />
В этот архив попадут, конечно, не только конфиги, но и разнообразный мусор (типа кэша, файлов предпросмотра, временных файлов и т.п.), который из-под контроля git нужно будет исключить.</p>
<h3>Начало работы с VCSH</h3>
<p>Теперь можно приступить к работе непосредственно с VCSH &#8212; для начала &#8212; инициализировать новый репозиторий, расположенный в <code lang="bash" inline="true">${HOME}</code> и содержащий в себе все файлы и каталоги с настройками, найденные в домашней директории:<br />
<code lang="bash" line_numbers="false"><br />
$ cd    # переход в $HOME<br />
# инициализация нового репозитория<br />
# (название, конечно, стоит поменять на своё)<br />
# опция -v указана для более подробного вывода<br />
$ vcsh -v init dimio_ibm_dotfiles_all<br />
</code></p>
<blockquote><p>
verbose mode on<br />
vcsh 1.20141026<br />
vcsh: verbose: attempting to create &#8216;/home/dimio/.config/vcsh/repo.d&#8217;<br />
vcsh: verbose: attempting to create &#8216;/home/dimio/.gitignore.d&#8217;<br />
vcsh: verbose: init begin<br />
Initialized empty shared Git repository in /home/dimio/.config/vcsh/repo.d/dimio_ibm_dotfiles_all.git/<br />
vcsh: verbose: init end, exiting
</p></blockquote>
<p>Стоит сразу же настроить правила для невключения посторонних файлов в новый репозиторий &#8212; создать <em>.gitinore</em> для него: <code lang="bash" inline="true">vcsh write-gitignore dimio_ibm_dotfiles_all</code> и отредактировать (<code lang="bash" inline="true">vim ~/.gitignore.d/dimio_ibm_dotfiles_all</code>), внеся следующие изменения (исключенные с помощью <em>.gitinore</em> файлы и директории git обрабатывать не будет, проверять действие правил можно при помощи <code lang="bash" inline="true">git status</code>):<br />
<code lang="bash" line_numbers="false"><br />
## Ignore all files/dirs<br />
*<br />
# but not dotfiles/dotdirs<br />
!.*<br />
!.*/**</p>
<p>## Programs<br />
.wine/<br />
.gnupg/<br />
.python-eggs/<br />
.tor/<br />
# Ignore some vcsh dirs/files<br />
.config/vcsh/**/objects/<br />
.config/vcsh/**/info/<br />
.config/vcsh/**/index<br />
.config/vcsh/**/refs/<br />
.config/vcsh/**/COMMIT_EDITMSG<br />
# Ignore maildir<br />
.Mail/<br />
# Ignore chromium dirs<br />
# but not settings, passwords, bookmarks etc<br />
.config/chromium/*<br />
!.config/chromium/Default/<br />
.config/chromium/Default/*<br />
!.config/chromium/Default/Bookmarks<br />
!.config/chromium/Default/Login Data<br />
.pki/<br />
# same for elinks<br />
.elinks/*<br />
!.elinks/bookmarks<br />
!.elinks/elinks.conf<br />
# Ignore all vim files<br />
.vim/*<br />
.vim/view/*<br />
# but not self made<br />
!.vim/filetype.vim<br />
!.vim/ftdetect/<br />
!.vim/mojo.vim<br />
!.vim/perl-support/codesnippets/<br />
!.vim/sessions/<br />
!.vim/syntax/conkyrc.vim</p>
<p>## Games<br />
# Ignore all games dirs<br />
# (see dimio_ibm_games repo)<br />
.snes96_snapshots/<br />
.wesnoth/<br />
.freeciv*<br />
.exult*<br />
.abuse/<br />
.gens/<br />
.s9x/<br />
.scummvm/</p>
<p>## Temporary, logs, auto backups etc<br />
*.tmp<br />
*.temp<br />
t?mp/<br />
tmp.*<br />
*~<br />
~*<br />
*.bak<br />
*.log<br />
*.lock<br />
*history<br />
*cookie?<br />
*.so<br />
# Ignore "chache" files/dirs<br />
**/*[Cc]ache<br />
# Ignore lib, log etc dirs<br />
**/lib<br />
**/logs<br />
**/packages<br />
**/share</p>
<p>## Media<br />
*.png<br />
*.jpeg<br />
*.jpg<br />
*.ogg<br />
*.mp[34]<br />
*.mpeg<br />
*.mpg<br />
*.jpg<br />
*.flv<br />
*.ttf<br />
**/[Ff]avicon*<br />
**/icons<br />
.gstreamer-*/<br />
# Ignore all thumbnails dirs<br />
?thumbnails/<br />
# Ignore flash player dirs<br />
.adobe/<br />
.macromedia/</p>
<p>## Unnecessary files<br />
.cabal/*<br />
!.cabal/config<br />
.config/enchant/<br />
.config/menus/<br />
.config/pulse/<br />
</code><br />
Синтаксис <em>.gitignore</em> простой: <code lang="bash" inline="true"># - комментарий, ! - инверсия правила (не игнорировать подпавшие под правило файлы/каталоги), * - 0 или больше любых символов, ** - любой уровень вложенности каталога</code> (<a rel="dofollow" href="http://www.git-scm.com/book/ru/v1/Основы-Git-Запись-изменений-в-репозиторий#Игнорирование-файлов" target="_blank">подробней тут</a>).<br />
После проверки репозитория на предмет попадания в него лишнего, правила игнорирования можно будет уточнить и дополнить.<br />
Теперь нужно перейти в рабочий режим оболочки vcsh, который обеспечивает применение команд git непосредственно к &#171;загруженному&#187; в данный момент репозиторию, добавить в репозиторий нужные файлы/директории и сохранить их текущее состояние:<br />
<code lang="bash" line_numbers="false"><br />
$ vcsh enter dimio_ibm_dotfiles_all<br />
# добавить к отслеживанию всю рабочую область<br />
# текущего репозитория<br />
git add :/<br />
# сделать начальный коммит<br />
git commit -m 'Initial commit'<br />
</code><br />
Для сброса внесенных изменений можно использовать <code lang="bash" inline="true">git reset</code>, также может быть полезным в работе <a rel="dofollow" href="http://ru.stackoverflow.com/questions/431839/%D0%92-%D1%87%D0%B5%D0%BC-%D1%80%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0-%D0%BC%D0%B5%D0%B6%D0%B4%D1%83-git-add-add-a-add-u-%D0%B8-add" target="_blank">сравнение режимов работы <code lang="bash" inline="true">git add</code></a> в разных сочетаниях и для разных версий git.<br />
Выход из режима оболочки vcsh &#8212; по нажатию <code lang="bash" inline="true">Ctrl+D</code> или по команде <code lang="bash" inline="true">exit</code>.</p>
<h3><a name="push_repo"></a>Размещение репозитория с конфигами на удаленной машине</h3>
<p>Копию репозитория имеет смысл разместить на удаленной машине, получив и резервирование, и возможность легко перенести настройки куда-то ещё. Основной репозиторий со всеми конфигами я решил разместить на <a href="https://bitbucket.org/" target="_blank">BitBucket</a>, так как он бесплатно предоставляет возможность использования приватного репозитория (напомню, что сам репозиторий для начала следует создать через веб-интерфейс BitBucket, а затем подставить его адрес в команду ниже; еще нужно не забыть добавить ключ для доступа к BitBucket при помощи <code lang="bash" inline="true">ssh-add</code>).<br />
<code lang="bash" line_numbers="false"><br />
git remote add origin 'git@bitbucket.org:dimio/my_new_repo_name.git'<br />
git push origin master<br />
</code><br />
Однако, перед передачей файлов на удаленный сервер, было бы неплохо зашифровать их, так как репозиторий может содержать приватную информацию, например &#8212; настройки браузера (среди которых могут быть сохраненные пароли) или логи чатов pidgin и т.п. Да и сами ключи шифрования, если не исключить их через <em>.gitignore</em> специально, тоже попадут в репозиторий вместе с директорией <em>~/.gnupg/</em>.</p>
<h3>Шифрование файлов в git при помощи фильтров</h3>
<p>Я для шифрования репозитория решил использовать gpg, создав специально под эту задачу новый ключ. Ключ нужно генерировать безпарольный (на локальной машине файлы всё равно хранятся в открытом виде), иначе автоматическая расшифровка при загрузке файлов из сетевой копии (команда <code lang="bash" inline="true">git checkout</code>) будет проблематичной.<br />
<code lang="bash" line_numbers="false"><br />
# генерация gpg ключа<br />
# все значения приняты по умолчанию,<br />
# срок действия ключа не ограничен,<br />
# пароль пустой, email: dimio@dimio.org<br />
gpg --gen-key<br />
# посмотреть информацию о ключе<br />
gpg --fingerprint dimio@dimio.org<br />
pub   1024R/1C9E9C65 2015-10-12<br />
Отпечаток ключа = DBA7 327B 2049 05D2 928C  A1B0 8309 4115 1C9E 9C65<br />
uid   Dmitry (GIT encrypt) "dimio @dimio.org"<br />
sub   1024R/475149F7 2015-10-12<br />
</code></p>
<p>Теперь в <em>.gitattributes</em> нужного репозитория следует добавить фильтр для обработки (в данном случае &#8212; шифрования) нужных файлов (в случае с vcsh &#8212; сначала потребуется создать соответствующие каталог <em>gitattributes.d</em> и файл с атрибутами вручную, внимание &#8212; старые версии vcsh не поддерживают работу с отдельными файлами <em>.gitattributes</em>):<br />
<code lang="bash" line_numbers="false"><br />
mkdir ~/.gitattributes.d<br />
touch ~/.gitattributes.d/dimio_ibm_dotfiles_all<br />
echo '* filter=gpg diff=gpg' > ~/.gitattributes.d/dimio_ibm_dotfiles_all<br />
</code><br />
Здесь <code inline="true">*</code> &#8212; шаблон, под который должны подпадать названия файлов, требующих шифровки/расшифровки, т.е. обрабатываться будут все файлы.<br />
Затем нужно прописать использование свежесозданного <em>.gitattributes</em> в нужном репозитории, для этого есть несколько путей:</p>
<ul>
<li>Выполнить команду <code lang="bash" inline="true">git config core.attributesfile ~/.gitattributes.d/dimio_ibm_dotfiles_all</code>, находясь в режиме оболочки vcsh с загруженным репозиторием <em>dimio_ibm_dotfiles_all</em>;</li>
<li>Вручную внести информацию об используемом файле <em>.gitattributes</em> в настройки репозитория, отредактировав файл <code lang="bash" inline="true">~/.config/vcsh/repo.d/dimio_ibm_dotfiles_all.git/config</code> и добавив в секцию <code inline="true">[core]</code> путь к  <em>.gitattributes</em>:<br />
<code lang="bash" line_numbers="false"><br />
[core]<br />
        attributesfile = .gitattributes.d/dimio_ibm_dotfiles_all<br />
</code></li>
<li>В новых версиях <em>vcsh</em> может сработать команда <code lang="bash" inline="true">vcsh upgrade "repo_name"</code>, но в моей версии <em>vcsh</em> автоматическая обработка файла атрибутов отключена в коде программы (<code lang="bash" inline="true">: ${VCSH_GITATTRIBUTES:=none}</code>) и этот способ не работает.</li>
</ul>
<p>Следующий шаг &#8212; создание фильтров, отвечающих за шифрование/дешифровку файлов. Они вносятся в файл конфигурации репозитория: <code lang="bash" inline="true">~/.config/vcsh/repo.d/dimio_ibm_dotfiles_all.git/config</code><br />
<code line_numbers="false"><br />
[filter "gpg"]<br />
    ;decrypt<br />
    smudge = gpg -d -q --batch --no-tty<br />
    ;encrypt<br />
    clean = gpg -ea --batch --no-tty -r 475149F7<br />
    ;filter must succeed in order to make<br />
    ;the stored contents usable<br />
    required<br />
[diff "gpg"]<br />
    ;replacement for standard diff<br />
    textconv = git-gpg-decrypt<br />
</code><br />
Где <code inline="true">475149F7</code> &#8212; идентификатор созданного ранее приватного ключа gpg (взамен можно указать e-mail, прописанный в информации о ключе). А <code inline="true">git-gpg-decrypt</code> &#8212; небольшой скрипт следующего содержания:<br />
<code line_numbers="false" lang="bash"><br />
#!/bin/sh<br />
gpg -d -q --batch --no-tty "$1" || cat "$1"<br />
</code><br />
Путь к скрипту нужно внести в <code inline="true" lang="bash">${PATH}</code>: у меня он лежит в директории <code inline="true" lang="bash">${HOME}/bin/</code>, которая автоматически добавляется в <code inline="true" lang="bash">${PATH}</code> путем загрузки <a href="https://dimio.org/cgi-bin/bps/hlghtsrc/sourcehl.cgi?d=conf&#038;s=bash_path-expand&#038;l=sh">bash_path-expand</a> из <a href="https://dimio.org/cgi-bin/bps/hlghtsrc/sourcehl.cgi?d=conf&#038;s=bashrc&#038;l=sh">bashrc</a>. Теперь просмотр изменений (типа <code inline="true">git log -p -1</code>) будет работать корректно.<br />
При желании, для шифрования репозиториев возможно применить специальную утилиту <a rel="dofollow" href="https://github.com/AGWA/git-crypt" target="_blank">git-crypt</a>, мне же подобное решение на данном этапе показалось избыточным.<br />
А вот теперь можно вернуться к <a href="#push_repo">клонированию репозитория на сервер BitBucket</a> (не забывая, что шифрование происходит <a href="http://git-scm.com/book/ru/v1/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-Git-Git-%D0%B0%D1%82%D1%80%D0%B8%D0%B1%D1%83%D1%82%D1%8B#Развёртывание-ключа" target="_blank">на стадии подготовки к коммиту</a> &#8212; при вызове команды <code lang="bash" inline="true">git add</code>).<br />
После записи изменений (<code lang="bash" inline="true">git push</code>) в репоизторий на BitBucket &#8212; остается лишь убедиться, что фильтр сработал и шифрование прошло успешно. Для примера &#8212; вот так <a href="https://dimio.org/bash-born-again-shell-obolochka-komandnoj-stroki.html#bashrc" target="_blank">мой bashrc</a> выглядит в репозитории BitBucket после совершения всего вышеописанного:<br />
<a href="https://dimio.org/wp-content/uploads/2015/10/git_files_encrypt.png" rel="attachment wp-att-1389"><img loading="lazy" decoding="async" src="https://dimio.org/wp-content/uploads/2015/10/git_files_encrypt-510x225.png" alt="git+pgp шифрование" width="510" height="225" class="aligncenter size-large wp-image-1389" srcset="https://dimio.org/wp-content/uploads/2015/10/git_files_encrypt-510x225.png 510w, https://dimio.org/wp-content/uploads/2015/10/git_files_encrypt-400x177.png 400w, https://dimio.org/wp-content/uploads/2015/10/git_files_encrypt.png 1006w" sizes="auto, (max-width: 510px) 100vw, 510px" /></a><br />
В заключение, для лучшего знакомства с git, могу смело порекомендовать отличную книгу <a rel="dofollow" href="http://git-scm.com/book/ru/v2" target="_blank">ProGit</a>, на материалы которой, среди прочего, я ссылался в этой заметке.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://dimio.org/vcsh-spasenie-nastroek-v-home.html#comments" thr:count="3" />
			<link rel="replies" type="application/atom+xml" href="https://dimio.org/vcsh-spasenie-nastroek-v-home.html/feed/atom" thr:count="3" />
			<thr:total>3</thr:total>
			</entry>
		<entry>
		<author>
			<name>dimio</name>
							<uri>http://dimio.org</uri>
						</author>

		<title type="html"><![CDATA[Небольшое ускорение Chromium]]></title>
		<link rel="alternate" type="text/html" href="https://dimio.org/nebolshoe-uskorenie-chromium.html" />

		<id>http://dimio.org/?p=1347</id>
		<updated>2015-08-11T12:07:44Z</updated>
		<published>2015-07-13T12:39:51Z</published>
		<category scheme="https://dimio.org" term="*NIX" /><category scheme="https://dimio.org" term="Памятки" /><category scheme="https://dimio.org" term="linux" /><category scheme="https://dimio.org" term="notes" /><category scheme="https://dimio.org" term="трюки" />
		<summary type="html"><![CDATA[Для Chromium (ну и Chrome до кучи, и иные производные), оказывается, тоже работает метод небольшого ускорения путем очистки баз sqlite от данных, помеченных для удаления (но не удаленных), что и для Firefox (Firefox еще и настройками можно слегка оптимизировать). Всякие настройки, куки, история переходов и т.п. дребедень, что накапливается в процессе использования браузера. Метод, в &#8230; <a href="https://dimio.org/nebolshoe-uskorenie-chromium.html" class="more-link">Читать далее <span class="screen-reader-text">Небольшое ускорение Chromium</span> <span class="meta-nav">&#8594;</span></a>]]></summary>

					<content type="html" xml:base="https://dimio.org/nebolshoe-uskorenie-chromium.html"><![CDATA[<p>Для Chromium (ну и Chrome до кучи, и иные производные), оказывается, тоже работает метод небольшого ускорения путем очистки баз sqlite от данных, помеченных для удаления (но не удаленных), что и для Firefox (Firefox еще и настройками можно <a title="Делаем Mozilla Firefox быстрее" href="https://dimio.org/delaem-mozilla-firefox-bystree.html">слегка оптимизировать</a>). Всякие настройки, куки, история переходов и т.п. дребедень, что накапливается в процессе использования браузера.<br />
Метод, в общем, тот же, что и для Firefox (и его производных) &#8212; пересобрать БД, используемые браузером, с действительным удалением ненужных данных, путем примения к ним команды <code inline="true">sqlite3 файл_БД 'VACUUM'</code>.<br />
Применительно Chromium я сделал это следующим образом:<br />
<code line_numbers="false"><br />
dimio@ibm $ ls -lh ~/.config/chromium/Default/<br />
...<br />
итого 17M<br />
dimio@ibm $ find "/home/dimio/.config/chromium/Default/" -maxdepth 1 -type f -print -exec sqlite3 {} 'VACUUM' \;<br />
...<br />
dimio@ibm $ ls -lh ~/.config/chromium/Default/<br />
...<br />
итого 13M<br />
</code><br />
Настройки Chrome обычно лежат в <code inline="true">~/.config/google-chrome/Default/</code>.<br />
На моем древнем Pentium M 1,2 ГГц с 1 Гб ОЗУ некоторое ускорения запуска браузера и уменьшение времени отклика стало заметно, а на более-менее современном железе подобная процедура, пожалуй, не будет имееть смысла.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://dimio.org/nebolshoe-uskorenie-chromium.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://dimio.org/nebolshoe-uskorenie-chromium.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>dimio</name>
							<uri>http://dimio.org</uri>
						</author>

		<title type="html"><![CDATA[Бесплатный Linux-shell с Tmux на борту]]></title>
		<link rel="alternate" type="text/html" href="https://dimio.org/besplatnyj-linux-shell-s-tmux-na-bortu.html" />

		<id>http://dimio.org/?p=1120</id>
		<updated>2017-03-16T11:04:25Z</updated>
		<published>2013-11-18T11:26:24Z</published>
		<category scheme="https://dimio.org" term="*NIX" /><category scheme="https://dimio.org" term="Интернет" /><category scheme="https://dimio.org" term="Полезности" /><category scheme="https://dimio.org" term="bshellz" /><category scheme="https://dimio.org" term="freeshell" /><category scheme="https://dimio.org" term="linux" /><category scheme="https://dimio.org" term="notes" /><category scheme="https://dimio.org" term="online" /><category scheme="https://dimio.org" term="tmux" />
		<summary type="html"><![CDATA[Возникла у меня как-то нужда в получении linux-shell на стороннем сервере с постоянным доступом в сеть (тот же парсер ТИЦ запустить например). При этом шелл должен был удовлетворять двум условиям: быть бесплатным и иметь возможность оставить запущенное приложение работать &#171;в фоне&#187;, без поддержания постоянного соединения удаленной машиной. Помимо этого, хотелось несколько большего, чем возможность использовать &#8230; <a href="https://dimio.org/besplatnyj-linux-shell-s-tmux-na-bortu.html" class="more-link">Читать далее <span class="screen-reader-text">Бесплатный Linux-shell с Tmux на борту</span> <span class="meta-nav">&#8594;</span></a>]]></summary>

					<content type="html" xml:base="https://dimio.org/besplatnyj-linux-shell-s-tmux-na-bortu.html"><![CDATA[<p>Возникла у меня как-то нужда в получении linux-shell на стороннем сервере с постоянным доступом в сеть (тот же <a href="https://dimio.org/parsing-yandeks-tic-na-primere-spiska-polzovatelej-liru.html" title="Парсер Яндекс ТИЦ в liru">парсер ТИЦ</a> запустить например). При этом шелл должен был удовлетворять двум условиям: быть бесплатным и иметь возможность оставить запущенное приложение работать &#171;в фоне&#187;, без поддержания постоянного соединения удаленной машиной. Помимо этого, хотелось несколько большего, чем возможность использовать простые <code inline="true">dtach</code> или <code inline="true">nohup</code>, а значит &#8212; нужно наличие на удаленной машине терминального мультиплексора (<a rel="dofollow" href="http://ru.wikipedia.org/wiki/GNU_Screen">Screen</a> или <a rel="dofollow" href="http://ru.wikipedia.org/wiki/Tmux">Tmux</a>). Мой выбор пал на <a rel="dofollow" href="http://www.bshellz.net/">bshellz</a>, удовлетворяющий всем условиям, включая наличие Tmux. Вот что они предлагают после прохождения бесплатной регистрации:</p>
<blockquote><p>
&#8212; Возможность разместить свой сайт на домене <em>http://имя_пользователя.bshellz.net</em><br />
&#8212; 50 Мб дискового пространства<br />
&#8212; Электронный адрес вида: <em>имя_пользователя@bshellz.net</em><br />
&#8212; Возможность использовать одну базу MySQL, наличие phpmyadmin: <em>https://services.bshellz.net/phpmyadmin/</em>
</p></blockquote>
<p><span id="more-1120"></span></p>
<h3>Регистрация в bshellz</h3>
<p>Если предложенные условия выглядят достаточно привлекательными &#8212; остается только <a href="http://www.bshellz.net/register/" title="Описание процесса регистрации на сайте bshellz (англ.)">зарегистрироваться</a>. Для этого нужно при помощи любого IRC-клиента зайти на канал <em>#bshellz</em> в сети <em>Freenode</em> и отправить сообщение боту: <code inline="true">/PRIVMSG beschbot !register < желаемое имя пользователя> <e -mail></e></code>. В ответ на указанный электронный адрес придет письмо с информацией для доступа к серверу &#8212; логин, пароль, адрес сервера. Если нет желания пользоваться отдельным irc-клиентом &#8212; можно прибегнуть к услугам <a href="https://webchat.freenode.net/#">веб-чата сети Freenode</a>.<br />
<a href="https://dimio.org/wp-content/uploads/2013/11/Connection-details-freenode-Web-IRC.png"><img loading="lazy" decoding="async" src="https://dimio.org/wp-content/uploads/2013/11/Connection-details-freenode-Web-IRC-400x250.png" alt="зайти в irc через браузер - веб-ча" width="400" height="250" class="aligncenter size-medium wp-image-1136" srcset="https://dimio.org/wp-content/uploads/2013/11/Connection-details-freenode-Web-IRC-400x250.png 400w, https://dimio.org/wp-content/uploads/2013/11/Connection-details-freenode-Web-IRC.png 434w" sizes="auto, (max-width: 400px) 100vw, 400px" /></a></p>
<p>Остается подключиться к серверу при помощи ssh-клиента (например &#8212; <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html" title="Загрузить PuTTY - бесплатный ssh клиент">putty</a>) &#8212; и бесплатный шелл у нас в кармане. Настройки putty особых сложностей вызвать не должны, достаточно заполнить основные данные для подключения и указать автоматический запуск tmux после установки соединения.<br />
<a href="https://dimio.org/wp-content/uploads/2013/11/PuTTY_настройка_подключения.png"><img loading="lazy" decoding="async" src="https://dimio.org/wp-content/uploads/2013/11/PuTTY_настройка_подключения-400x379.png" alt="подключение по ssh - клиент putty" width="400" height="379" class="aligncenter size-medium wp-image-1135" srcset="https://dimio.org/wp-content/uploads/2013/11/PuTTY_настройка_подключения-400x379.png 400w, https://dimio.org/wp-content/uploads/2013/11/PuTTY_настройка_подключения.png 454w" sizes="auto, (max-width: 400px) 100vw, 400px" /></a><br />
<a href="https://dimio.org/wp-content/uploads/2013/11/PuTTY_автозапуск_команды.png"><img loading="lazy" decoding="async" src="https://dimio.org/wp-content/uploads/2013/11/PuTTY_автозапуск_команды-400x382.png" alt="автозапуск команды после соединения в putty" width="400" height="382" class="aligncenter size-medium wp-image-1134" srcset="https://dimio.org/wp-content/uploads/2013/11/PuTTY_автозапуск_команды-400x382.png 400w, https://dimio.org/wp-content/uploads/2013/11/PuTTY_автозапуск_команды.png 455w" sizes="auto, (max-width: 400px) 100vw, 400px" /></a><br />
Кстати, помимо tmux доступны perl и php:<br />
<code lang="bash" line_numbers="false"><br />
dimio@shell:~$ perl -v<br />
This is perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux-gnu-thread-multi<br />
(with 80 registered patches, see perl -V for more detail)</p>
<p>dimio@shell:~$ php -v<br />
PHP 5.4.4-14+deb7u2 (cli) (built: Jun  5 2013 07:56:44)<br />
Copyright (c) 1997-2012 The PHP Group<br />
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies<br />
</code><br />
На этом описание бесплатного шелла от bshshellz можно было бы закончить, но&#8230;</p>
<h3>Автоматическое продление регистрации в bshellz</h3>
<p>Всегда есть какое-то неприятное &#171;но&#187;. В нашем случае &#8212; это ограниченный срок жизни бесплатного аккаунта (всего 168 часов &#8212; одна неделя), для продления которого нужно регулярно заходить на irc-канал <em>#bshellz</em> и отдавать боту команду <code inline="true">!keep имя_пользователя</code> &#8212; в ответ бот милостиво отмерит аккаунту еще 168 часов жизни. Делать подобное вручную &#8212; утомительно и глупо. Использовать скрипты, запускаемые на сторонней машине &#8212; глупо вдвойне (если и так есть, где запустить скрипт &#8212; зачем использовать ограниченный бесплатный шелл?). Нужно сделать так, чтобы продление аккаунта работало автоматически с использованием самого bshellz. Какие для этого существуют пути?</p>
<ul>
<li>Путь первый &#8212; использовать perl или php, написать свой или взять готовй скрпит, с его помощью заходить на канал #bshellz и давать команду боту на продление аккаунта. Этот путь я отбросил по причине лени и нежелания разбираться с возможными проблемами <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br />
	<strong>UPD:</strong> в итоге сделал запускаемый раз в сутки <a href="/bshellz-shell-autorenew-irc-perl-skript-dlya-obnovleniya-akkaunta-v-bshellz.html">perl-скрипт для автопродления аккаунта Bshellz</a>.
	</li>
<li>Путь второй &#8212; использовать простое готовое решение &#8212; консольный irc-клиент <a rel="dofollow" href="http://www.irssi.org">irssi</a>, который также доступен на хостинге bshellz.</li>
</ul>
<p><a name="irssi-cron"></a></p>
<h3>irssi и cron &#8212; пишем сообщения по расписанию</h3>
<p>Запустив <code inline="true">irssi</code> можно выполнить его <a href="http://www.irssi.org/documentation/startup#c3">предварительную настройку</a>, добавив автоматическое подключение к сети Freenode с последующим заходом на канал #bshellz. Или подключиться вручную, указав в командной строке irssi следующую последовательность команд:<br />
<code line_numbers="false"><br />
/connect irc.freenode.net<br />
/join #bshellz<br />
</code><br />
Всё работает? Отлично. Можно открыть еще одно окно терминала (заодно проверим tmux), нажав <code inline="true">Ctrl+b n</code>. Теперь загрузим скрипт <em><a href="http://scripts.irssi.org/scripts/cron.pl" title="cron скрипт для irssi">cron.pl</a></em>, который и будет отправлять сообщения боту:<br />
<code line_numbers="false" lang="bash"><br />
mkdir -p ~/.irssi/scripts/autorun/<br />
wget -c -P ~/.irssi/scripts/ http://scripts.irssi.org/scripts/cron.pl<br />
ln -s ~/.irssi/scripts/cron.pl ~/.irssi/scripts/autorun/cron<br />
</code><br />
При загрузке irssi скрипт будет стартовать автоматически, но можно загрузить его и вручную &#8212; для этого нужно вернуться в окно с запущенным irssi, нажав <code inline="true">Ctrl+b номер_окна</code> (у меня это окно №0). И выполнить следующие команды (формат указания времени тот же, что и в cron &#8212; <em>часы минуты день_месяца месяц день_недели команда</em>):<br />
<code line_numbers="false"><br />
/script load cron.pl<br />
/jobadd 13 45 * * * MSG Beschbot !keep имя_пользователя<br />
</code><br />
В ответ получим: <em>13:41 -!- Irssi: Job added</em>. Для проверки можно запросить список сохраненных заданий и если всё верно &#8212; сохранить их (хранятся в файле <em>~/.irssi/cron.save</em>):<br />
<code line_numbers="false"><br />
/jobs<br />
13:41 -!- Irssi: Current Jobs:<br />
13:41 -!- Irssi: 0) -server freenode 13 45 * * * MSG Beschbot !keep dimio<br />
13:41 -!- Irssi: End of List<br />
/jobssave<br />
12:58 -!- Irssi: Jobs saved<br />
</code><br />
Загружаются сохраненные команды при помощи <code inline="true">/jobsload</code>. После отправки сообщения по расписанию irssi автоматически откроет окно приватной беседы с beschbot, перейти в которое можно, нажав <em>Alt+3</em>, что даст возможность воочию убедиться в исправной работе автопродления шелла в bshellz (сообщения <em>!keep dimio</em> отправляются автоматом):<br />
<a href="https://dimio.org/wp-content/uploads/2013/11/bshellz_auto_shell_renew.png"><img loading="lazy" decoding="async" src="https://dimio.org/wp-content/uploads/2013/11/bshellz_auto_shell_renew-333x400.png" alt="бесплатный шелл bshellz - автопродление аккаунта" width="333" height="400" class="aligncenter size-medium wp-image-1137" srcset="https://dimio.org/wp-content/uploads/2013/11/bshellz_auto_shell_renew-333x400.png 333w, https://dimio.org/wp-content/uploads/2013/11/bshellz_auto_shell_renew-425x510.png 425w, https://dimio.org/wp-content/uploads/2013/11/bshellz_auto_shell_renew.png 666w" sizes="auto, (max-width: 333px) 100vw, 333px" /></a></p>
<p>Вот теперь действительно всё &#8212; можно спокойно пользоваться шеллом без необходимость вспоминать об обязательном продлении жизни аккаунта и без риска удаления всех настроек и наработок.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://dimio.org/besplatnyj-linux-shell-s-tmux-na-bortu.html#comments" thr:count="18" />
			<link rel="replies" type="application/atom+xml" href="https://dimio.org/besplatnyj-linux-shell-s-tmux-na-bortu.html/feed/atom" thr:count="18" />
			<thr:total>18</thr:total>
			</entry>
		<entry>
		<author>
			<name>dimio</name>
							<uri>http://dimio.org</uri>
						</author>

		<title type="html"><![CDATA[Подключаем несколько Яндекс.Диск в Linux &#8212; полет в облака халявы]]></title>
		<link rel="alternate" type="text/html" href="https://dimio.org/podklyuchaem-neskolko-yandeks-disk-v-linux-polet-v-oblaka-xalyavy.html" />

		<id>http://dimio.org/?p=860</id>
		<updated>2012-09-25T13:09:03Z</updated>
		<published>2012-09-07T08:23:10Z</published>
		<category scheme="https://dimio.org" term="*NIX" /><category scheme="https://dimio.org" term="linux" /><category scheme="https://dimio.org" term="notes" /><category scheme="https://dimio.org" term="yandex" />
		<summary type="html"><![CDATA[Тема подключения Яндекс.Диска в Linux в общем-то не нова и не сказать, чтобы она была чем-то сложна. Диск как нормально подключался в период закрытого тестирования, так нормально подключается и сейчас. Вообще приятно, что Яндекс не стал изобретать велосипед и воспользовался поддерживаемым и распространённым протоколом WebDAV для предоставления доступа к Диску. Я подключил сервис по инвайту &#8230; <a href="https://dimio.org/podklyuchaem-neskolko-yandeks-disk-v-linux-polet-v-oblaka-xalyavy.html" class="more-link">Читать далее <span class="screen-reader-text">Подключаем несколько Яндекс.Диск в Linux &#8212; полет в облака халявы</span> <span class="meta-nav">&#8594;</span></a>]]></summary>

					<content type="html" xml:base="https://dimio.org/podklyuchaem-neskolko-yandeks-disk-v-linux-polet-v-oblaka-xalyavy.html"><![CDATA[<p><a href="https://dimio.org/wp-content/uploads/2012/09/Yandex.Disk_logo.png"><img loading="lazy" decoding="async" src="https://dimio.org/wp-content/uploads/2012/09/Yandex.Disk_logo-150x150.png" alt="монтирование нескольких яндекс.диск под linux" title="Yandex.Disk в Linux - собери свой бесплатный террабайт в облаке" width="150" height="150" class="alignleft size-thumbnail wp-image-863" srcset="https://dimio.org/wp-content/uploads/2012/09/Yandex.Disk_logo-150x150.png 150w, https://dimio.org/wp-content/uploads/2012/09/Yandex.Disk_logo.png 256w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a> Тема подключения Яндекс.Диска в Linux в общем-то не нова и не сказать, чтобы она была чем-то сложна. Диск как нормально подключался в период закрытого тестирования, так нормально подключается и сейчас. Вообще приятно, что Яндекс не стал изобретать велосипед и воспользовался поддерживаемым и распространённым <a rel="dofollow" href="http://ru.wikipedia.org/wiki/WebDAV">протоколом WebDAV</a> для предоставления доступа к Диску.</p>
<p>Я подключил сервис по инвайту и успешно им пользовался, а после открытия свободного доступа вдруг подумал &#8212; нельзя ли подключить несколько Дисков? Решил проверить эту возможность, а заодно и подключить Я.Диск как внешнесетевой обменник для всех мобильных устройств (файловый менеджер ES FileExplorer для Android поддерживает в том числе и работу с Диском) &#8212; чтобы в дороге скидывать фотки с планшета, записывать журналы и книги на телефон, да мало ли для чего ещё может пригодиться сетевая флешка.</p>
<p>Итак, ниже небольшая инструкция по подключению нескольких Я.Дисков в Linux. Кстати, если кто-то еще не знаком с Диском или не успел его завести &#8212; <a href="https://disk.yandex.ru/invite/?hash=VY365AGH" title="Завести Яндекс.Диск!">регистрация по приглашению</a> выгодна приглашённому даже больше, чем пригласившему &#8212; приглашённый получает 1 Гб места (к уже имеющимся 10 Гб) против бонуса в 0,5 Гб для пригласившего. Самое время попробовать!<br />
<span id="more-860"></span></p>
<h3>Готовимся к полёту</h3>
<p>Для начала стоит установить утилиту <strong>davfs2</strong>, если она еще не установлена: <code inline="true" lang="bash">sudo aptitude install davfs2</code></p>
<p>Затем создаём новую директорию, которая будет точкой монтирования для диска (директория для монтирования первого диска у меня уже была, так что создаю только одну):<br />
<code line_numbers="false" lang="bash"><br />
sudo mkdir /media/dimio-blog<br />
sudo chown dimio:dimio /media/dimio-blog/<br />
</code></p>
<p>Сразу добавляю пользователя в группу для работы с davfs (группа создаётся при установке davfs2):<br />
<code line_numbers="false" lang="bash"><br />
sudo usermod -a -G davfs2 dimio<br />
</code></p>
<p>Теперь можно проверить, что всё работает &#8212; примонтируем Диск в созданную директорию:<br />
<code line_numbers="false" lang="bash"><br />
sudo mount -t davfs -o uid=1000 https://webdav.yandex.ru /media/dimio-blog/<br />
</code><br />
В процессе будут запрошены логин и пароль от почты на Яндексе &#8212; вводим данные от того ящика, который будем монтировать в указанную директорию и проверяем работоспособность Диска.</p>
<p><a href="https://dimio.org/wp-content/uploads/2012/09/ya-disk-in-linux.png"><img loading="lazy" decoding="async" src="https://dimio.org/wp-content/uploads/2012/09/ya-disk-in-linux-300x220.png" alt="yandex.disk mount on linux" title="Подключение Яндекс.Диск в PCManFM под Linux" width="300" height="220" class="aligncenter size-medium wp-image-861" srcset="https://dimio.org/wp-content/uploads/2012/09/ya-disk-in-linux-300x220.png 300w, https://dimio.org/wp-content/uploads/2012/09/ya-disk-in-linux.png 667w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<h3>От летающей этажерки к сверхзвуку</h3>
<p>Убедившись, что всё работает как надо, приступаем к небольшому облегчению работы с Диском. Для начала &#8212; допишем опции монтирования в конец файла <strong>fstab</strong>, чтобы не набирать каждый раз длинную команду для монтирования: <code inline="true" lang="bash">sudoedit /etc/fstab</code><br />
<code line_numbers="false"><br />
https://webdav.yandex.ru    /media/yandex.disk  davfs   gid=davfs2,uid=1000,file_mode=666,dir_mode=777,user,_netdev   0   0<br />
https://webdav.yandex.ru    /media/dimio-blog  davfs   gid=davfs2,uid=1000,file_mode=600,dir_mode=700,user,noauto   0   0<br />
</code><br />
Первый диск у меня у меня общеобменный, а второй &#8212; для бекапов, что понятно из прав доступа, выставляемых при монтировании. Опция <strong>noauto</strong> нужна, чтобы при загрузке диск не монтировался автоматически &#8212; сеть в этот момент всё равно ещё не работает. А <strong>_netdev</strong>, в свою очередь, позволяет указать системе на необходимость примонтировать диск лишь после того, как будут подняты сетевые интерфейсы.</p>
<p>Теперь избавимся от необходимости вводить вручную логин и пароль при монтировании Дисков &#8212; для этого необходимо добавить в конец файла <strong>/etc/davfs2/secrets</strong> следующие строки (каждая строка отвечает за свой Диск): <code inline="true" lang="bash">sudoedit /etc/davfs2/secrets</code><br />
<code line_numbers="false"><br />
/media/yandex.disk Логин_от_почты Пароль_от_почты<br />
/media/dimio-blog dimio-blog<br />
</code><br />
Логины и пароли хранятся в открытом виде и доступ к ним ограничен только правами доступа файловой системы &#8212; то есть почти никак. Поэтому для &#171;общеобменного&#187; диска я прописал и логин, и пароль (тем более, что без этого диск при загрузке ОС автоматически примонтирован не будет), а для &#171;приватного&#187; &#8212; только логин, пароль вводится вручную при монтировании.</p>
<p>Первый &#8212; обменный &#8212; Диск таким образом монтируется просто &#8212; достаточно выполнить команду <code inline="true" lang="bash">sudo mount /media/yandex.disk</code> или перезагрузить компьютер для проверки автомонтирования.<br />
При монтировании второго запрашивается пароль от соответствующей учетной записи в Яндекс.Почте: <code inline="true" lang="bash">sudo mount /media/dimio-blog/</code><br />
<code line_numbers="false"><br />
[sudo] password for dimio:<br />
Please enter the password to authenticate user dimio-blog with server<br />
https://webdav.yandex.ru or hit enter for none.<br />
  Password<br />
</code></p>
<h3>От винта!</h3>
<p>Теперь &#8212; пара небольших проверочек, чтобы убедиться, что всё работает: <code inline="true" lang="bash">dimio@ibm $ mount</code><br />
<code line_numbers="false"><br />
https://webdav.yandex.ru on /media/yandex.disk type davfs (rw,nosuid,noexec,nodev,_netdev,gid=122,uid=1000)<br />
https://webdav.yandex.ru on /media/dimio-blog type davfs (rw,nosuid,noexec,nodev,_netdev,gid=122,uid=1000<br />
</code><br />
Диск подключился, в подарок Яндекс даёт инструкцию, какую-то песенку в mp3 (я не проникся) и обоину для рабочего стола, символизирующую спасение попавших в сложные обстоятельства пользовательских данных Я.Диском:<br />
<a rel="dofollow" href="http://desktopwallpapers.org.ua/"><img loading="lazy" decoding="async" src="https://dimio.org/wp-content/uploads/2012/09/Обои-для-рабочего-стола-300x187.jpg" alt="Обои" title="обои, скачать бесплатно, укрась свой рабочий стол, desktopwallpapers.org.ua" width="300" height="187" class="aligncenter size-medium wp-image-890" srcset="https://dimio.org/wp-content/uploads/2012/09/Обои-для-рабочего-стола-300x187.jpg 300w, https://dimio.org/wp-content/uploads/2012/09/Обои-для-рабочего-стола-1024x640.jpg 1024w, https://dimio.org/wp-content/uploads/2012/09/Обои-для-рабочего-стола.jpg 1920w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<p>И еще одна проверка &#8212; посмотрим, не врёт ли Яндекс про 10 Гб места (на втором диске я на момент проверки еще не активировал последний бонус к свободному месту): <code inline="true" lang="bash">dimio@ibm $ df -h /media/yandex.disk/ /media/dimio-blog/</code><br />
<code line_numbers="false"><br />
Файловая система         Тип   Размер Использовано  Дост Использовано% Cмонтировано в<br />
https://webdav.yandex.ru davfs    10G         284M  9,8G            3% /media/yandex.disk<br />
https://webdav.yandex.ru davfs   6,0G         205M  5,9G            4% /media/dimio-blog<br />
</code></p>
<p>Осталось убедиться, что обменный Диск &#8212; действительно обменный и все устройства, пользующиеся им, могут выполнять действия над файлами и директориями. Создаём тестовый файл: <code inline="true" lang="bash">touch /media/yandex.disk/test</code>. Файл создан успешно, всё в порядке: <code inline="true" lang="bash">ls -lh /media/yandex.disk/test</code><br />
<code line_numbers="false"><br />
-rw------- 1 dimio dimio 0 Сен  6 19:00 /media/yandex.disk/test<br />
</code></p>
<p>Права доступа выглядят на первый взгляд неправильно (ведь был разрешен доступ на чтение и запись для всех), но при монтировании Диска с других устройств всё работает как надо:<br />
<a href="https://dimio.org/wp-content/uploads/2012/09/yandex-disk-android.png"><img loading="lazy" decoding="async" src="https://dimio.org/wp-content/uploads/2012/09/yandex-disk-android-300x187.png" alt="yandex.disk on android" title="Яндекс.Диск под Android - подключение через ES FileExplorer" width="300" height="187" class="aligncenter size-medium wp-image-862" srcset="https://dimio.org/wp-content/uploads/2012/09/yandex-disk-android-300x187.png 300w, https://dimio.org/wp-content/uploads/2012/09/yandex-disk-android-1024x640.png 1024w, https://dimio.org/wp-content/uploads/2012/09/yandex-disk-android.png 1280w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></p>
<h3>Дальше &#8212; только в космос!</h3>
<p>Скриншот с планшета кстати был залит как раз через свежеподключенный Я.Диск <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> В ES FileExplorer достаточно ввести логин и пароль от почты, чтобы получить доступ к диску. Отлично &#8212; всё работает, можно наслаждаться 20 гигабайтами бесплатного облачного хранилища! Интересно, можно ли сделать из Дисков виртуальный том? И собрать себе хранилище на пару терабайт, подключив его к <a href="https://dimio.org/d-link-dir-620-i-dd-wrt-podklyuchenie-flash-ustanovka-programm-nastrojka-nas.html" title="Сетевое хранилище из роутера D-Link">роутеру с NAS</a> (например при помощи <a href="http://linux.die.net/man/1/cadaver">cadaver</a>)! Авторегалки почты на Яндексе станут актуальны, если это сработает <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h3>Летаем под управлением Windows</h3>
<p>Под Windows тоже можно подключить Я.Диск через WebDAV, на сайте Яндекса есть <a href="http://help.yandex.ru/disk/?id=1124655#windows" title="Подключение Яндекс Диска под Windows">инструкция по использованию мастера подключений</a>, но для Windows XP существует одна хитрость. WinXP не поддерживает прямое подключение по WebDAV через hhtps, так что придтся его обмануть &#8212; например, сократив ссылку <code inline="true">https://webdav.yandex.ru</code> при помощи tinyurl (должно получиться что-то типа <code inline="true">http://tinyurl/my-ya-disk</code>).</p>
<p>После этого можно подключать Диск как при помощи мастера подключений, так и выполнив в консоли (<em>Пуск -> Выполнить -> cmd</em>) вот такую команду (будет создан новый диск Y):<br />
<code line_numbers="false"><br />
net use Y: http://tinyurl.com/my-ya-disk /persistent:YES /User:ya_login ya_password<br />
</code></p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://dimio.org/podklyuchaem-neskolko-yandeks-disk-v-linux-polet-v-oblaka-xalyavy.html#comments" thr:count="16" />
			<link rel="replies" type="application/atom+xml" href="https://dimio.org/podklyuchaem-neskolko-yandeks-disk-v-linux-polet-v-oblaka-xalyavy.html/feed/atom" thr:count="16" />
			<thr:total>16</thr:total>
			</entry>
		<entry>
		<author>
			<name>dimio</name>
							<uri>http://dimio.org</uri>
						</author>

		<title type="html"><![CDATA[Памятки по работе в Linux. Выпуск второй]]></title>
		<link rel="alternate" type="text/html" href="https://dimio.org/pamyatki-po-rabote-v-linux-vypusk-vtoroj.html" />

		<id>http://dimio.org/?p=818</id>
		<updated>2023-03-01T12:46:44Z</updated>
		<published>2012-08-15T10:11:14Z</published>
		<category scheme="https://dimio.org" term="*NIX" /><category scheme="https://dimio.org" term="Памятки" /><category scheme="https://dimio.org" term="linux" /><category scheme="https://dimio.org" term="notes" />
		<summary type="html"><![CDATA[В очередной раз набралось некоторое количество мелких рецептов по улучшению удобства работы в Linux. Первым выпуском памяток я периодически пользуюсь, так что подобный формат заметок видится мне достаточно полезным. Сегодня речь пойдёт о записи видео с экрана (подкаст), перекодировании этого видео, проверке работы микрофона в Linux, удобном способе ведения небольших записок в виде &#171;липких бумажек&#187;, &#8230; <a href="https://dimio.org/pamyatki-po-rabote-v-linux-vypusk-vtoroj.html" class="more-link">Читать далее <span class="screen-reader-text">Памятки по работе в Linux. Выпуск второй</span> <span class="meta-nav">&#8594;</span></a>]]></summary>

					<content type="html" xml:base="https://dimio.org/pamyatki-po-rabote-v-linux-vypusk-vtoroj.html"><![CDATA[<p>В очередной раз набралось некоторое количество <a href="https://dimio.org/tag/linux-notes">мелких рецептов по улучшению удобства работы в Linux</a>. <a href="https://dimio.org/pamyatki-po-rabote-v-linux.html" title="Заметки по удобной работе в Linux">Первым выпуском памяток</a> я периодически пользуюсь, так что подобный формат заметок видится мне достаточно полезным. Сегодня речь пойдёт о записи видео с экрана (подкаст), перекодировании этого видео, проверке работы микрофона в Linux, удобном способе ведения небольших записок в виде &#171;липких бумажек&#187;, добавлении водяного знака к картинкам при помощи пакета ImageMagick и простом (но не слишком точном) способе измерения количества потребляемой программой оперативной памяти.<br />
<span id="more-818"></span></p>
<h4>Как в Linux сделать запись видео с монитора?</h4>
<p>После некоторых поисков по интернету, я остановился на самом удобном для меня способе видеозахвата &#8212; при помощи программы <strong>recordmydesktop</strong> (<em>apt-get install recordmydesktop</em>). Записать видео можно при помощи консольной команды:<br />
<code line_numbers="false" lang="bash">recordmydesktop -x 1 -y 1 -width 1024 -heigth 768 --no-sound -o /home/user/video.ogv</code><br />
Здесь ключи <em>x</em> и <em>y</em> задают смещение области захвата относительно левого нижнего угла экрана, остальные параметры в комментариях думаю не нуждаются.<br />
Впрочем, мне показалось удобней использовать графическую оболочку &#8212; <em>gtk-recordmydesktop</em> (есть также <em>qt-recordmydesktop</em>), при помощи которой точно также можно указать параметры видеозахвата и затем сохранить полученный файл.<br />
<a href="https://dimio.org/wp-content/uploads/2012/08/qt-recordmydesktop.png"><img loading="lazy" decoding="async" src="https://dimio.org/wp-content/uploads/2012/08/qt-recordmydesktop-e1345023382859.png" alt="Видеозахват с экрана в Linux - recordmydesktop" title="Графический интерфейс к recordmydesktop" class="aligncenter size-full wp-image-822" width="510" height="193"/></a></p>
<h4>Быстрый способ перекодировать видео</h4>
<p>После захвата изображения с экрана мне потребовалось перекодировать его в avi, так как открытый формат <em>ogv</em> к сожалению поддерживается далеко не всеми плеерами. Я предпочел использовать для перекодирования <em>mencoder</em> &#8212; исключительно потому, что он при установке не тянул за собой никаких других пакетов. Само перекодирование проще всего делать из консоли:<br />
<code line_numbers="false" lang="bash">mencoder -idx video.ogv -ovc lavc -o video.avi</code><br />
А информацию по получившемуся файлу можно посмотреть в консольном выводе <a href="https://dimio.org/mplayer-vseyadnyj-videoproigryvatel.html" title="mplayer - всеядный видеоплеер">mplayer</a> при его воспроизведении.</p>
<h4>Проверка работоспособности микрофона под Linux</h4>
<p>Для записи и воспроизведения звука под Linux я пользуюсь звуковой системой alsa, так что проверять работоспособность микрофона буду именно с её помощью. Аудиокарта в моём ноутбуке одна, так что проблема выбора устройства для записи и воспроизведения (опция <em>-D</em> если что) передо мной не стоит. Для начала стоит записать тестовый звуковой файл (длинной 15 секунд) при помощи следующей команды:<br />
<code line_numbers="false">arecord -d 15 /home/user/mic_test.wav</code><br />
А затем воспроизвести его, можно при помощи той же alsa:<br />
<code line_numbers="false">aplay /home/user/mic_test.wav</code><br />
Если записанный звук слышен &#8212; микрофон работает исправно <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<h4>Липкие заметки на рабочем столе</h4>
<p>Удобство липких заметок я открыл для себя после <a href="https://dimio.org/openboxsbxkb-pereklyuchenie-raskladok-klaviatury.html">перехода на Openbox</a>, когда рабочий стол перестал захламляться различными ярлыками, &#171;временными&#187; файлами и прочим подобным барахлом. Теперь на нём живут только Conky и те самые липкие записки. При выборе сравнивал <em>gnote</em> и <em>xpad</em>, в результате остановился на последнем &#8212; менше зависимостей, лёгкий и быстрый, именно записки на листочках, а не громоздкое &#171;всё в одном в виде липких заметок&#187;.<br />
Рассказывать про <em>xpad</em> считаю излишним, там всё понятно и легче попробовать самостоятельно &#8212; простые &#171;листочки&#187; (стикеров можно создавать несколько), расположенные поверх рабочего стола или сворачивающиеся в трей по щелчку. Шапка окна отключена через настройки Openbox, так что листочки похожи именно на листочки.<br />
<a rel="dofollow noopener" target="_blank" href="http://www.ks-artos.ru/"><img loading="lazy" decoding="async" src="https://dimio.org/wp-content/uploads/2012/08/2012-08-15@14-04-43.png" alt="http://www.ks-artos.ru" title="xpad - легковесные липкие заметки" class="aligncenter size-full wp-image-823" width="364" height="142" srcset="https://dimio.org/wp-content/uploads/2012/08/2012-08-15@14-04-43.png 364w, https://dimio.org/wp-content/uploads/2012/08/2012-08-15@14-04-43-300x117.png 300w" sizes="auto, (max-width: 364px) 100vw, 364px" /></a></p>
<h4>Как в Linux измерить потребляемую программой память</h4>
<p>Не вдаваясь глубоко в теорию распределения памяти ядром Linux, по-простому узнать примерный объем памяти, который использует во время своей работы программа <em>prog_name</em>, можно при помощи следующей комбинации команд:<br />
<code line_numbers="false" lang="bash">watch ps -Fp $(pgrep -d, -x prog_name)</code></p>
<h4>Простой способ нанести водяной знак на картинки, используя ImageMagick</h4>
<p>Сам водяной знак необходимо предварительно подготовить и сохранить, в моём примере это файл wmark.png (текст на прозрачном фоне, сделан в Gimp). Изображения (файлы с расширением jpg) с нанесённым водяным знаком в примере будут сохранены в папку wmark, водяной знак наносится в правый нижний (southeast) угол изображения:<br />
<code line_numbers="false" lang="bash">for i in *.jpg ; do composite -compose bumpmap -gravity southeast wmark.png "$i" "./wmark/${i%.jpg}.jpg" ; done</code></p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://dimio.org/pamyatki-po-rabote-v-linux-vypusk-vtoroj.html#comments" thr:count="2" />
			<link rel="replies" type="application/atom+xml" href="https://dimio.org/pamyatki-po-rabote-v-linux-vypusk-vtoroj.html/feed/atom" thr:count="2" />
			<thr:total>2</thr:total>
			</entry>
		<entry>
		<author>
			<name>dimio</name>
							<uri>http://dimio.org</uri>
						</author>

		<title type="html"><![CDATA[Моё знакомство с Conky и мой conkyrc]]></title>
		<link rel="alternate" type="text/html" href="https://dimio.org/moyo-znakomstvo-s-conky-i-moj-conkyrc.html" />

		<id>http://dimio.org/?p=716</id>
		<updated>2023-04-29T09:08:01Z</updated>
		<published>2012-04-25T08:47:04Z</published>
		<category scheme="https://dimio.org" term="*NIX" /><category scheme="https://dimio.org" term="Памятки" /><category scheme="https://dimio.org" term=".rc" /><category scheme="https://dimio.org" term="conky" /><category scheme="https://dimio.org" term="linux" />
		<summary type="html"><![CDATA[Аж на восьмой год знакомства с Linux наконец-то познакомился и с Коньками (Conky) &#8212; раньше всё лень было, да и не особо нужно как-то (как мне казалось). Всякие индикаторы были на панельках Gnome, по клику на них вызывались развёрнутые версии, а Коньки я кроме как индикатором никак иначе и не воспринимал. После перехода на Openbox &#8230; <a href="https://dimio.org/moyo-znakomstvo-s-conky-i-moj-conkyrc.html" class="more-link">Читать далее <span class="screen-reader-text">Моё знакомство с Conky и мой conkyrc</span> <span class="meta-nav">&#8594;</span></a>]]></summary>

					<content type="html" xml:base="https://dimio.org/moyo-znakomstvo-s-conky-i-moj-conkyrc.html"><![CDATA[
<p>Аж на восьмой год знакомства с Linux наконец-то познакомился и с Коньками (Conky) &#8212; раньше всё лень было, да и не особо нужно как-то (как мне казалось). Всякие индикаторы были на панельках Gnome, по клику на них вызывались развёрнутые версии, а Коньки я кроме как индикатором никак иначе и не воспринимал. После <a href="https://dimio.org/openboxsbxkb-pereklyuchenie-raskladok-klaviatury.html">перехода на Openbox</a> наконец решился на них посмотреть, три месяца потихоньку читал инструкции на сайте и настраивал Коньки под себя.</p>



<p>По итогам этой вялопротекавшей настроечной эпопеи могу сказать, что Conky я совершенно точно недооценивал. И хотя расширение при помощи LUA мне пока не пригодилось (да и возможность вывода нескольких окон с применением разных настроечных файлов тоже пока не требовалась), уже понятно, что Conky &#8212; это некий Emacs в мире системных мониторов <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br /></p>



<span id="more-716"></span>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://dimio.org/wp-content/uploads/2012/04/2012-04-24@09-16-44.png"><img loading="lazy" decoding="async" width="163" height="300" src="https://dimio.org/wp-content/uploads/2012/04/2012-04-24@09-16-44-163x300.png" alt="Что можно сделать из Conky" class="wp-image-717" title="Conky - системный монитор и не только" srcset="https://dimio.org/wp-content/uploads/2012/04/2012-04-24@09-16-44-163x300.png 163w, https://dimio.org/wp-content/uploads/2012/04/2012-04-24@09-16-44.png 310w" sizes="auto, (max-width: 163px) 100vw, 163px" /></a></figure></div>


<p>Меня в принципе интересовала возможность смотреть нагрузку на процессор и его температутру (поскольку ноут старый и я опасаюсь перегрева длительного), вывод свободного/занятого места на жестком диске, состояние сетевых подключений и съемных устройств (читай &#8212; флешек). Всё это реализуется простой правкой <strong>conkyrc</strong> на основе мануала. Вывод календаря с подсветкой текущей даты был утащен с форумов, еще в планах стоит вывод курсов валют с изменением относительно вчерашнего дня.</p>



<p>В общем-то расписывать установку Conky я не вижу особого смысла (в разных дистрибутивах может быть по-разному, а в целом сложностей нет &#8212; <a href="https://dimio.org/paketnye-menedzhery-magiya-upravleniya-kompyuternymi-programmami.html">поставил через пакетный менеджер</a> и пользуйся), так что просто приведу свой <strong>conkyrc</strong> с комментариями в качестве примера настройки.</p>



<p>Вот что сделано у меня в настройках (<a href="https://dimio.org/cgi-bin/bps/hlghtsrc/sourcehl.cgi?d=conf&amp;s=conkyrc&amp;l=conk" target="_blank" rel="noopener">открыть conkyrc на отдельной странице</a>):</p>



<ul class="wp-block-list">
<li>Отображается загрузка процессора, текущая рабочая частота, температура, обороты вентилятора, средняя загрузка системы. Выводится температура с датчиков на видеокарте, материнке и АКБ;</li>



<li>Отображается использование ОЗУ, подкачки, нужных разделов HDD (корень и домашний раздел) без вывода типов файловых систем по ним;</li>



<li>В зависимости от активного сетевого интерфеса (LAN/Wi-Fi/USB-modem) выводятся данные по подключению &#8212; активно/неактивно, уровень сигнала, прошедший через интерфейс трафик;</li>



<li>Выводится календарик с подсветкой текущей даты (планировщиками типа Evolution не пользуюсь, так что его достаточно), думаю рядом с ним повесить курс валют (мне это актуально);</li>



<li>В завершение всего идёт текстовый блок с подсказками по горячим клавишам, по мере отпадания необходимости в подсказке сокращаю его <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>
</ul>



<iframe loading="lazy" name="vimrc" sandbox="" src="/cgi-bin/bps/hlghtsrc/sourcehl.cgi?d=conf&amp;s=conkyrc&amp;l=conk" width="100%" height="400" frameborder="yes"><br />
    Ваш браузер не поддерживает плавающие фреймы!<br />
</iframe>



<p>Другие мои конфиги для Linux-утилит собраны на странице <a title="Конфигурационные файлы - .rc, .conf" href="https://dimio.org/config-dotfiles">Конфиги / dotfiles</a></p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://dimio.org/moyo-znakomstvo-s-conky-i-moj-conkyrc.html#comments" thr:count="10" />
			<link rel="replies" type="application/atom+xml" href="https://dimio.org/moyo-znakomstvo-s-conky-i-moj-conkyrc.html/feed/atom" thr:count="10" />
			<thr:total>10</thr:total>
			</entry>
		<entry>
		<author>
			<name>dimio</name>
							<uri>http://dimio.org</uri>
						</author>

		<title type="html"><![CDATA[Изменить имя сетевого интерфейса в Debian/Ubuntu Linux]]></title>
		<link rel="alternate" type="text/html" href="https://dimio.org/izmenit-imya-setevogo-interfejsa-v-debianubuntu-linux.html" />

		<id>http://www.dimio.org/?p=571</id>
		<updated>2011-12-07T09:03:56Z</updated>
		<published>2011-12-07T08:50:36Z</published>
		<category scheme="https://dimio.org" term="*NIX" /><category scheme="https://dimio.org" term="linux" /><category scheme="https://dimio.org" term="notes" />
		<summary type="html"><![CDATA[Задался целью домашнюю wi-fi сеть перевести на современный протокол шифрования &#8212; wpa2. Вроде всё предельно просто должно быть даже в линуксе &#8212; ставишь wpa-supplicant, прописываешь имя точки, тип шифрования и ключ в /etc/network/interfaces &#8212; и всё работает. Но нет &#8212; бился часа четыре, пробовал по-разному &#8212; не подключается ноут мой к сети, хотя нетбук и &#8230; <a href="https://dimio.org/izmenit-imya-setevogo-interfejsa-v-debianubuntu-linux.html" class="more-link">Читать далее <span class="screen-reader-text">Изменить имя сетевого интерфейса в Debian/Ubuntu Linux</span> <span class="meta-nav">&#8594;</span></a>]]></summary>

					<content type="html" xml:base="https://dimio.org/izmenit-imya-setevogo-interfejsa-v-debianubuntu-linux.html"><![CDATA[<p>Задался целью домашнюю wi-fi сеть перевести на современный протокол шифрования &#8212; wpa2. Вроде всё предельно просто должно быть даже в линуксе &#8212; ставишь <em>wpa-supplicant</em>, прописываешь имя точки, тип шифрования и ключ в /etc/network/interfaces &#8212; и всё работает. Но нет &#8212; бился часа четыре, пробовал по-разному &#8212; не подключается ноут мой к сети, хотя нетбук и <a href="https://dimio.org/elektronnyj-kombajn-razmerom-s-ladon.html">смартфоны</a> легко её подхватывают.</p>
<p>Оказалось, что wi-fi карточка в <a href="https://dimio.org/kak-ya-xotel-menyat-noutbuk.html">ThinkPad T40</a> не поддерживает wpa2 (и wpa тоже) на аппаратном уровне. Я думал, что это исключительно программные решения и даже не догадывался покопать в сторону аппаратной поддержки. В итоге пришлось карточку поменять, благо на e-bay их продаётся много.<br />
<span id="more-571"></span></p>
<p>Но это всё предыстория. Новая карточка в итоге встала нормально, выглядит в выводе <code inline="true">dmesg</code> и <code inline="true">lspci</code> как <em>Intel PRO/Wireless 2200BG Mini-PCI Adapter</em>, <a href="http://www.thinkwiki.org/wiki/Ipw2200">драйвера под Linux для неё имеются</a>, но она автоматически прописалась под именем <em>eth2</em>, а у меня в скриптах и в <em>conky</em> беспроводной интерфейс прописан как <em>eth1</em>. Соответственно встал вопрос &#8212; <strong>как в Linux переименовать сетевой интерфейс</strong>?</p>
<p>Для <em>Debian</em> (и соответственно <em>Ubuntu</em>) подходит такой рецепт: в файле <strong>70-persistent-net.rules</strong>, находящемся по адресу <code inline="true">/etc/udev/rules.d/</code>, в спецификации нужной сетевой карты изменяем в конце строки параметр <code inline="true">NAME=</code>, вписывая туда нужное имя интерфейса для сетевой карты с нужным MAC-адресом. Например я вписал вместо <code inline="true">NAME=eth2</code> &#8212; <code inline="true">NAME=eth1</code>, а строку с конфигурацией старой wi-fi карты просто закомментировал.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://dimio.org/izmenit-imya-setevogo-interfejsa-v-debianubuntu-linux.html#comments" thr:count="4" />
			<link rel="replies" type="application/atom+xml" href="https://dimio.org/izmenit-imya-setevogo-interfejsa-v-debianubuntu-linux.html/feed/atom" thr:count="4" />
			<thr:total>4</thr:total>
			</entry>
		<entry>
		<author>
			<name>dimio</name>
							<uri>http://dimio.org</uri>
						</author>

		<title type="html"><![CDATA[Памятки по работе в Linux]]></title>
		<link rel="alternate" type="text/html" href="https://dimio.org/pamyatki-po-rabote-v-linux.html" />

		<id>http://www.dimio.org/?p=538</id>
		<updated>2023-03-01T12:47:16Z</updated>
		<published>2011-11-18T10:04:09Z</published>
		<category scheme="https://dimio.org" term="*NIX" /><category scheme="https://dimio.org" term="Памятки" /><category scheme="https://dimio.org" term="linux" /><category scheme="https://dimio.org" term="notes" /><category scheme="https://dimio.org" term="ssh" />
		<summary type="html"><![CDATA[Накопилось несколько простых рецептов работы в Linux, которые в силу низкой частоты использования наизусть не помню. Пока лежали в черновиках &#8212; некоторые по несколько раз успел перечитать, чтобы вспомнить, как и что делать &#8212; польза налицо. Со временем думаю публиковать мелкие записки по мере накопления: второй выпуск. Порядок вывода аргументов в xargs Как-то раз столкнулся &#8230; <a href="https://dimio.org/pamyatki-po-rabote-v-linux.html" class="more-link">Читать далее <span class="screen-reader-text">Памятки по работе в Linux</span> <span class="meta-nav">&#8594;</span></a>]]></summary>

					<content type="html" xml:base="https://dimio.org/pamyatki-po-rabote-v-linux.html"><![CDATA[<p>Накопилось несколько <a href="https://dimio.org/tag/linux-notes">простых рецептов работы в Linux</a>, которые в силу низкой частоты использования наизусть не помню. Пока лежали в черновиках &#8212; некоторые по несколько раз успел перечитать, чтобы вспомнить, как и что делать &#8212; польза налицо.<br />
Со временем думаю публиковать мелкие записки по мере накопления: <a href="https://dimio.org/pamyatki-po-rabote-v-linux-vypusk-vtoroj.html" title="Запись видео с экрана в Linux, перекодирование видео, проверка микрофона и липкие заметки">второй</a> выпуск.</p>
<h4>Порядок вывода аргументов в xargs</h4>
<p>Как-то раз столкнулся с проблемой порядка подстановки аргументов в <em>xargs</em>. И man вроде почитал, и погуглил, и встретил нужный ключ <em>-I</em>, но ни из мана, ни из гугля не понять было точно, что он делает именно то, что надо. Итак, ключ <em>-I</em> задаёт нужный порядок вывода аргумента в <em>xargs</em>, используя подстановку.<br />
<code inline="true" lang="bash">xargs -I arg_name command arg1 arg_name arg3</code> &#8212; аргументы при вызове команды <em>command</em> будут выведены именно в таком порядке, тогда как в обычном случае <em>arg_name</em> будет подставлен в конец строки вызова команды.</p>
<h4>Чтение N строк из начала файла</h4>
<p>Совместно с предыдущим решением удобно использовать чтение из файла неких строк, которые затем и преобразовывать в набор аргументов. Банальный <em>cat</em> известен думаю всем. Обратный порядок &#8212; <em>tac</em>. Прочитать N строк с конца: <code inline="true" lang="bash">tail -n N</code>. Аналогично, но с начала файла: <code inline="true" lang="bash">head -n N</code> (возм. head отсутствует в BSD-системах). И прочтитать строки с X по Y: <code inline="true" lang="bash">awk 'NR &gt;=X &amp;&amp; NR &lt; =Y'</code><br />
Или при помощи <em>sed</em>: <code inline="true" lang="bash">sed -n 'X,Yp'</code><br />
<span id="more-538"></span></p>
<p><a name="ssh-tunnel"></a></p>
<h4>Прокси через SSH (ssh-туннель)</h4>
<p>Банальная вещь, которую использую довольно редко (и потому приходится гуглить каждый раз) &#8212; прокси чеез SSH. Особенно помогает при необходимости скачать что-то с разных файлопомоек типа депозита, которые считают закачки по IP всей сети и регулярно предлагают подождать 7 часов. <code inline="true" lang="bash">ssh user@host -D portN</code>. Затем в программе, которую надо пропустить через прокси (напр. браузер) указать SOCKS-прокси с адресом <em>localhost</em> и портом <em>portN</em>.</p>
<h4>Сохранение ключей SSH в памяти</h4>
<p>Еще SSH: <em>ssh-agent</em> &#8212; хранит ключи (не требуется каждый раз вводить код от ключа), добавить ключ в агент: <code inline="true" lang="bash">ssh-add /путь/до_ключа</code>. Чтобы все процессы, запущенные из-под иксов, использовали ключи из <em>ssh-agent</em>, нужно запустить сессию WM через него <em>ssh-agent</em>, например (для Debian): в <em>~/.xinitrc</em> дописать <code inline="true" lang="bash">exec ssh-agent openbox-session</code>.</p>
<h4>Монтирование/размонитрование удалённой ФС через <em>sshfs</em></h4>
<p>Для монтирования без необходимости ввода пароля нужно настроить fuse, добавить пользователя в группу fuse и разрешить этой группе монтирование устройства /dev/fuse. Далее в дело вступает <em>sshfs</em>:<br />
<code inline="true" lang="bash">sshfs <login>@<server>:/путь /куда/монтировать</server></login></code><br />
Примонтированная ФС будет доступна как локальный каталог. Размонитровать так:<br />
<code inline="true" lang="bash">fusermount -u /куда/примонтировано</code></p>
<h4>Выполнение локального скрипта на удаленной машине через ssh</h4>
<p>Чтобы не загружать на удалённую машину копию какого-то скрипта (например когда один и тот же скрипт нужно запускать на многих машинах или когда разработка идет локально, а тестирование &#8212; на сервере хостера и т.п.), можно запустить его на выполнение через ssh следующим образом:<br />
<code inline="true" lang="bash"> ssh user@host 'perl' &lt; /путь/к локальному/скрпту.pl</code><br />
или для <a href="https://dimio.org/bash-born-again-shell-obolochka-komandnoj-stroki.html">шелла bash</a>:<br />
<code inline="true" lang="bash"> ssh user@host 'bash -s' &lt; /путь/к локальному/скрпту.sh</code></p>
<h4>Создание образа CD-диска</h4>
<p>Задача для меня тоже не слишком частая, поэтому с ходу решения не вспоминаются. Первое решение &#8212; банальное &#8212; использовать <em>dd</em>, указав на выход нужный файл, а на вход свой cd-rom, с которого образ снимается: <code inline="true" lang="bash">dd if=/dev/sr0 of=/tmp/my.iso</code>, CD должен быть отмонтирован; скопирует всё поблочно (т.е. если на диске реально записан 1 Мб данных, образ будет равен объёму всего диска).<br />
Второе &#8212; использовать genisoimage, в Debian идёт из коробки, не факт, что так же везде. Создаёт &#171;правильный&#187; образ, диск должен быть примонтирован, на вход подавать точку монтирования диска: <code inline="true" lang="bash">genisoimage -V 'disk label' -r -o /tmp/my.iso /mnt/cdrom</code></p>
<h4>Прогресс работы dd</h4>
<p>В дополнение к предыдущему или к <a href="https://dimio.org/nizkourovnevoe-formatirovanie-flash-pod-linux.html">форматированию флешки под Linux</a>. При использовании <em>dd</em> на больших объемах (напр. когда флешку 16 Гб форматируешь) бывает полезно. Нужно передать сигнал <em>USR1</em>: <code inline="true" lang="bash">kill -USR1 dd_PID</code> &#8212; выведет прогресс записи и ее скорость. Если процесс dd один или не важно узнать прогресс конкретного, можно поступить проще: <code inline="true" lang="bash">killall -USR1 dd</code>. Для постоянного мониторинга <em>kill</em> можно запустить через <em>watch</em>: <code inline="true" lang="bash">watch -n 5 kill -USR1 dd_PID</code> &#8212; будет обновлять статус работы <em>dd</em> каждые 5 секунд.</p>
<h4>Как склеить файлы построчно</h4>
<p>Иногда возникает необходимость объединить несколько файлов построчно, например, чтобы свести их в таблицу (когда наполнение каждого столбца будущей таблицы оказалось в отдельном файле). В этом случае выручает команда <em>paste</em>, которая делает ровно то, что нужно &#8212; построчно склеивает файлы, разделяя строки указанным образом:<br />
<code inline="true" lang="bash">paste --delimiters=';' file1 file2 ... fileN &gt; fileX</code><br />
В результате получим fileX, выглядящий следующим образом:<br />
<code line_numbers="false"><br />
строка1_из_файла1;строка1_из_файла2;...;строка1_из_файлаN<br />
строка2_из_файла1;строка2_из_файла2;...;строка2_из_файлаN<br />
...<br />
строкаM_из_файла1;строкаM_из_файла2;...;строкаM_из_файлаN<br />
</code></p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://dimio.org/pamyatki-po-rabote-v-linux.html#comments" thr:count="3" />
			<link rel="replies" type="application/atom+xml" href="https://dimio.org/pamyatki-po-rabote-v-linux.html/feed/atom" thr:count="3" />
			<thr:total>3</thr:total>
			</entry>
		<entry>
		<author>
			<name>dimio</name>
							<uri>http://dimio.org</uri>
						</author>

		<title type="html"><![CDATA[Низкоуровневое форматирование flash/SD/microSD под Linux]]></title>
		<link rel="alternate" type="text/html" href="https://dimio.org/nizkourovnevoe-formatirovanie-flash-pod-linux.html" />

		<id>http://www.dimio.org/?p=546</id>
		<updated>2024-02-23T18:08:21Z</updated>
		<published>2011-11-01T16:19:38Z</published>
		<category scheme="https://dimio.org" term="*NIX" /><category scheme="https://dimio.org" term="Памятки" /><category scheme="https://dimio.org" term="Полезности" /><category scheme="https://dimio.org" term="linux" /><category scheme="https://dimio.org" term="notes" />
		<summary type="html"><![CDATA[Несколько раз приходилось форматировать флешки (к которым относятся и различные SD и microSD карточки), а поскольку происходит это довольно редко &#8212; вынужден был лезть в гугл. Конспективная памятка по форматированию флешек под Linux: Проверить подключение flash fdisk -lВыведет список подключенных дисков и их разделов. Обычно флешка &#8212; /dev/sdb, но нужно обязательно проверить, так ли это! &#8230; <a href="https://dimio.org/nizkourovnevoe-formatirovanie-flash-pod-linux.html" class="more-link">Читать далее <span class="screen-reader-text">Низкоуровневое форматирование flash/SD/microSD под Linux</span> <span class="meta-nav">&#8594;</span></a>]]></summary>

					<content type="html" xml:base="https://dimio.org/nizkourovnevoe-formatirovanie-flash-pod-linux.html"><![CDATA[
<p>Несколько раз приходилось форматировать флешки (к которым относятся и различные <em>SD</em> и <em>microSD</em> карточки), а поскольку происходит это довольно редко &#8212; вынужден был лезть в гугл. Конспективная памятка по форматированию флешек под Linux:</p>



<h4 class="wp-block-heading">Проверить подключение flash</h4>



<p><code lang="bash">fdisk -l</code><br />Выведет список подключенных дисков и их разделов. Обычно флешка &#8212; <em>/dev/sdb</em>, <mark>но нужно <strong>обязательно проверить</strong>, так ли это!</mark></p>



<h4 class="wp-block-heading">Проверить, примонтирована ли флешка</h4>



<p><code lang="bash">df -h</code><br />Если флешка примонтирована &#8212; покажет это и точку монтирования. Перед форматированием &#8212; отмонтировать: <code lang="bash">umount /dev/sdb</code>.</p>



<h4 class="wp-block-heading">Проверить защиту от записи и геометрию</h4>



<p>При желании &#8212; можно проверить защиту от записи и геометрию (защита от записи в линуксе не важна):<br /><code lang="bash">hdparm /dev/sdb</code></p>



<h4 class="wp-block-heading">Если нужно низкоуровневое форматирование &#8212; забить нулями</h4>



<p><code lang="bash">dd if=/dev/zero of=/dev/sdb</code><br />В выводе покажет объем флешки (должен соответствовать заявленному), скорость и время записи. Также покажет, сколько было записано байт на флешку, что полезно при проверке флешки на физические ошибки (см. ниже).</p>



<h4 class="wp-block-heading">Проверить на физические ошибки</h4>



<p id="block-22ec518d-a99b-4ba4-8c45-e9b07b22cc77"><code>head -c N /dev/sdb | md5sum</code><br /><code>head -c N /dev/zero | md5sum</code><br />где <em>N</em> равно числу байт, записанных на флешку при помощи <strong>dd</strong>. Если контрольные суммы не совпадают &#8212; флешка &#171;битая&#187; или были ошибки записи (в реальности сталкивался с форматированием microSD через плохой кард-ридер &#8212; даже когда не выскакивали ошибки ввода-вывода при операциях &#8212; контрольные суммы не совпадали, с заменой кард-ридера проблема ушла).<br /><em>Пример:</em></p>



<pre class="wp-block-preformatted"><code lang="bash">dimio@ibm $ dd if=/dev/zero of=/dev/sdb
dd: запись в «/dev/sdb»: На устройстве кончилось место
3932161+0 записей считано
3932160+0 записей написано
скопировано 2013265920 байт (2,0 GB), 1010,99 c, 2,0 MB/c

dimio@ibm $ head -c 2013265920 /dev/zero | md5sum
5d0fd6273bed1c500c6fc22d86a59630  -

dimio@ibm $ head -c 2013265920 /dev/sdb | md5sum
5d0fd6273bed1c500c6fc22d86a59630  -</code></pre>



<p id="block-22ec518d-a99b-4ba4-8c45-e9b07b22cc77"><em>Ну и для полного счастья при желании:</em></p>



<pre class="wp-block-preformatted">dimio@ibm $ perl -we '
&gt; print "OK" if q{5d0fd6273bed1c500c6fc22d86a59630}
&gt; eq q{5d0fd6273bed1c500c6fc22d86a59630};'

OK</pre>



<h4 class="wp-block-heading">Разбиваем на разделы при помощи fdisk</h4>



<p><code lang="bash">fdisk /dev/sdb</code><br />Опции: <strong>m</strong> &#8212; справка, <strong>d</strong> &#8212; удалить раздел, <strong>p</strong> &#8212; просмотреть список разделов, <strong>n</strong> &#8212; создать раздел, <strong>t</strong> &#8212; поменять тип раздела, <strong>w</strong> &#8212; сохранить изменения.</p>



<h4 class="wp-block-heading">Последний шаг &#8212; создать файловые системы на разделах флешки</h4>



<p><code lang="bash">mkfs.ext{2,3,4} /dev/sdbX</code><br />где <em>X</em> &#8212; порядковый номер раздела, на котором нужно создать файловую систему.</p>



<h5 class="wp-block-heading">Также полезны</h5>



<p><strong>mkfs.msdos</strong>, <strong>mkfs.vfat</strong> (создаёт &#171;стандартную&#187; файловую систему флешек &#8212; <code>vfat</code>).</p>



<p><strong>mkfs.ntfs</strong> &#8212; тут понятно, создаёт NTFS, не на всяком Андроид-устройстве может читаться потом.</p>



<p><strong>mkfs.exfat</strong> &#8212; &#171;расширенная fat&#187;, на старых устройствах не прочитается, зато файлы большого размера поддерживает, например (как и NTFS). В Убунте надо пакет <code>exfatprogs</code> поставить, чтобы создавать эту ФС.</p>



<h4 class="wp-block-heading">Форматирование успешно окончено!</h4>



<p>Если что-то осталось непонятным или есть дополнения и замечания &#8212; добро пожаловать в комментарии! <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://dimio.org/nizkourovnevoe-formatirovanie-flash-pod-linux.html/create_usb_flash_on_linux" rel="dofollow"><img loading="lazy" decoding="async" width="150" height="126" src="https://dimio.org/wp-content/uploads/2011/11/create_usb_flash_on_linux.jpg" alt="каталог интернет магазинов Москвы" class="wp-image-547" title="Сравнение цен на электронику, бытовую технику, сайт sravni.com"/></a></figure></div>]]></content>
		
					<link rel="replies" type="text/html" href="https://dimio.org/nizkourovnevoe-formatirovanie-flash-pod-linux.html#comments" thr:count="18" />
			<link rel="replies" type="application/atom+xml" href="https://dimio.org/nizkourovnevoe-formatirovanie-flash-pod-linux.html/feed/atom" thr:count="18" />
			<thr:total>18</thr:total>
			</entry>
	</feed>
