<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Ssh-Agent on DevOps Way - Практические гайды</title>
    <link>https://devopsway.ru/tags/ssh-agent/</link>
    <description>Recent content in Ssh-Agent on DevOps Way - Практические гайды</description>
    <image>
      <title>DevOps Way - Практические гайды</title>
      <url>https://devopsway.ru/images/devopsway-og.png</url>
      <link>https://devopsway.ru/images/devopsway-og.png</link>
    </image>
    <generator>Hugo -- 0.160.1</generator>
    <language>ru</language>
    <lastBuildDate>Thu, 16 Apr 2026 14:48:28 +0000</lastBuildDate>
    <atom:link href="https://devopsway.ru/tags/ssh-agent/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>День 0: SSH — один ключ вместо пароля везде</title>
      <link>https://devopsway.ru/posts/day-00-ssh/</link>
      <pubDate>Thu, 16 Apr 2026 12:00:00 +0300</pubDate>
      <guid>https://devopsway.ru/posts/day-00-ssh/</guid>
      <description>Один SSH-ключ на GitHub, GitLab, прод-серверы. Ed25519, ssh-agent, ~/.ssh/config под несколько аккаунтов. Сандбокс-проверено: после урока git clone работает без паролей.</description>
      <content:encoded><![CDATA[<h2 id="цель-урока">Цель урока</h2>
<p>После урока вы <strong>умеете</strong> создать Ed25519 SSH-ключ, подключить его к ssh-agent с автозагрузкой, добавить публичную часть в GitHub и клонировать приватный репозиторий без паролей. Понимаете, почему один ключ работает на десятке сервисов и как через <code>~/.ssh/config</code> держать рабочий и личный GitHub в одной системе.</p>
<table>
  <thead>
      <tr>
          <th>Параметр</th>
          <th>Значение</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Bloom</td>
          <td>Применение</td>
      </tr>
      <tr>
          <td>SFIA</td>
          <td>Уровень 2</td>
      </tr>
      <tr>
          <td>Время</td>
          <td>30–40 минут</td>
      </tr>
      <tr>
          <td>Артефакт</td>
          <td>Рабочий <code>~/.ssh/id_ed25519</code> + <code>~/.ssh/config</code> + автозагрузка агента</td>
      </tr>
      <tr>
          <td>Проверка</td>
          <td><code>ssh -T git@github.com</code> → приветствие от GitHub</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="теория-за-3-минуты">Теория за 3 минуты</h2>
<p>Пароль от GitHub вы пишете глазами — и его украдёт любой shoulder-surfing, phishing, случайный скриншот. SSH-ключ этот механизм убирает.</p>
<p><strong>Как это работает:</strong></p>
<ol>
<li>Вы генерируете пару ключей: приватный (<code>id_ed25519</code>) остаётся у вас, публичный (<code>id_ed25519.pub</code>) отдаёте серверу.</li>
<li>Когда подключаетесь, сервер присылает challenge. Ваш клиент подписывает его приватным ключом. Сервер проверяет подпись публичным.</li>
<li>Приватный ключ <strong>никогда не уходит</strong> с вашей машины. Пароль не передаётся вообще.</li>
</ol>
<p><strong>Почему Ed25519, а не RSA:</strong></p>
<table>
  <thead>
      <tr>
          <th>Алгоритм</th>
          <th>Длина ключа</th>
          <th>Безопасность</th>
          <th>Скорость</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>RSA 2048</td>
          <td>2048 бит</td>
          <td>ок</td>
          <td>медленно</td>
      </tr>
      <tr>
          <td>RSA 4096</td>
          <td>4096 бит</td>
          <td>хорошо</td>
          <td>медленнее</td>
      </tr>
      <tr>
          <td><strong>Ed25519</strong></td>
          <td><strong>256 бит</strong></td>
          <td><strong>очень хорошо</strong></td>
          <td><strong>очень быстро</strong></td>
      </tr>
  </tbody>
</table>
<p>Ed25519 — современный стандарт. Короче, быстрее, криптостойкость как у RSA 3000+. GitHub, GitLab, Bitbucket его поддерживают с 2021 года.</p>
<p><strong>Главное «щёлкнуло» дня:</strong> один ключ — десятки сервисов. GitHub, GitLab, ваш VPS, CI-раннер, прод-сервер — везде вы кладёте <strong>один и тот же <code>id_ed25519.pub</code></strong>. Не плодите ключи по одному на сервис — это миф.</p>
<hr>
<h2 id="практика-1-генерация-ed25519-ключа">Практика 1: генерация Ed25519 ключа</h2>
<h3 id="шаг-1-проверяем-нет-ли-уже-ключа">Шаг 1. Проверяем, нет ли уже ключа</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ls -la ~/.ssh/ 2&gt;/dev/null <span class="o">||</span> <span class="nb">echo</span> <span class="s2">&#34;директории ~/.ssh нет&#34;</span>
</span></span></code></pre></div><p>Если видите <code>id_ed25519</code> и <code>id_ed25519.pub</code> — у вас уже есть ключ. Можете пропустить генерацию или создать новый с другим именем.</p>
<h3 id="шаг-2-генерируем-ключ">Шаг 2. Генерируем ключ</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ssh-keygen -t ed25519 -a <span class="m">100</span> -C <span class="s2">&#34;your_email@example.com&#34;</span> -f ~/.ssh/id_ed25519 -N <span class="s2">&#34;&#34;</span>
</span></span></code></pre></div><p>Флаги:</p>
<ul>
<li><code>-t ed25519</code> — тип ключа.</li>
<li><code>-a 100</code> — 100 раундов KDF для шифрования приватной части (замедляет bruteforce).</li>
<li><code>-C &quot;...&quot;</code> — комментарий, видно в публичной части, удобно для идентификации.</li>
<li><code>-f ~/.ssh/id_ed25519</code> — путь к файлу.</li>
<li><code>-N &quot;&quot;</code> — без passphrase (для сандбокса; в реальности замените на свой пароль или уберите флаг, ssh-keygen спросит).</li>
</ul>
<p><strong>Про passphrase:</strong> это пароль, которым шифруется сам приватный ключ на диске. Если ноутбук украдут — ключ не используют без этого пароля. Рекомендуется ставить. <code>ssh-agent</code> (следующая практика) будет помнить его в памяти.</p>
<h3 id="шаг-3-проверяем-права-доступа">Шаг 3. Проверяем права доступа</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ls -l ~/.ssh/id_ed25519 ~/.ssh/id_ed25519.pub
</span></span></code></pre></div><p>Ожидаем:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">-rw------- 1 user user  411 ...  /root/.ssh/id_ed25519
</span></span><span class="line"><span class="cl">-rw-r--r-- 1 user user   99 ...  /root/.ssh/id_ed25519.pub
</span></span></code></pre></div><p>Приватный ключ — <code>600</code> (только владелец). Если увидите <code>644</code> на приватном — <code>chmod 600 ~/.ssh/id_ed25519</code>. SSH откажется использовать ключ с открытыми правами.</p>
<h3 id="шаг-4-смотрим-публичную-часть">Шаг 4. Смотрим публичную часть</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat ~/.ssh/id_ed25519.pub
</span></span></code></pre></div><p>Вывод:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKr... your_email@example.com
</span></span></code></pre></div><p>Это та строка, которую вы будете копировать в GitHub, серверы, CI.</p>
<hr>
<h2 id="практика-2-ssh-agent-с-автозагрузкой">Практика 2: ssh-agent с автозагрузкой</h2>
<h3 id="шаг-0-зачем-агент">Шаг 0. Зачем агент</h3>
<p>Без агента: каждый <code>git push</code> → ввод passphrase. Утомляет за пять минут.</p>
<p>Агент запускается один раз за сессию, держит расшифрованный ключ в памяти, SSH-клиент спрашивает агент, агент подписывает. Вы вводите passphrase один раз.</p>
<h3 id="шаг-1-запускаем-агент-вручную">Шаг 1. Запускаем агент вручную</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">eval</span> <span class="s2">&#34;</span><span class="k">$(</span>ssh-agent -s<span class="k">)</span><span class="s2">&#34;</span>
</span></span></code></pre></div><p>Ответ:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Agent pid 12345
</span></span></code></pre></div><h3 id="шаг-2-добавляем-ключ">Шаг 2. Добавляем ключ</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ssh-add ~/.ssh/id_ed25519
</span></span></code></pre></div><p>Если есть passphrase — агент спросит его один раз. Дальше:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ssh-add -l
</span></span></code></pre></div><p>Ответ:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">256 SHA256:... your_email@example.com (ED25519)
</span></span></code></pre></div><h3 id="шаг-3-автозагрузка-при-каждом-входе">Шаг 3. Автозагрузка при каждом входе</h3>
<p>Ручной запуск надоедает. Добавьте в <code>~/.bashrc</code> (или <code>~/.zshrc</code>):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat &gt;&gt; ~/.bashrc <span class="s">&lt;&lt; &#39;EOF&#39;
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s"># --- ssh-agent autoload ---
</span></span></span><span class="line"><span class="cl"><span class="s">if [ -z &#34;$SSH_AUTH_SOCK&#34; ]; then
</span></span></span><span class="line"><span class="cl"><span class="s">  eval &#34;$(ssh-agent -s)&#34; &gt; /dev/null
</span></span></span><span class="line"><span class="cl"><span class="s">  ssh-add ~/.ssh/id_ed25519 2&gt;/dev/null
</span></span></span><span class="line"><span class="cl"><span class="s">fi
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span></code></pre></div><p>Проверяем, что блок добавлен:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">tail -5 ~/.bashrc
</span></span></code></pre></div><p>Теперь каждая новая сессия — агент уже запущен, ключ добавлен.</p>
<p><strong>Для macOS</strong> (коротко): вместо этого блока — <code>ssh-add --apple-use-keychain ~/.ssh/id_ed25519</code>, passphrase сохранится в Keychain.</p>
<hr>
<h2 id="практика-3-добавить-ключ-в-github-и-проверить">Практика 3: добавить ключ в GitHub и проверить</h2>
<h3 id="шаг-1-копируем-публичный-ключ">Шаг 1. Копируем публичный ключ</h3>
<p><strong>Linux:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat ~/.ssh/id_ed25519.pub
</span></span></code></pre></div><p>Выделите мышью, скопируйте. Или:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">xclip -sel clip &lt; ~/.ssh/id_ed25519.pub   <span class="c1"># если установлен xclip</span>
</span></span></code></pre></div><p><strong>macOS:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">pbcopy &lt; ~/.ssh/id_ed25519.pub
</span></span></code></pre></div><p><strong>Windows (WSL):</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">clip.exe &lt; ~/.ssh/id_ed25519.pub
</span></span></code></pre></div><h3 id="шаг-2-добавляем-в-github">Шаг 2. Добавляем в GitHub</h3>
<ol>
<li>Заходите на <a href="https://github.com/settings/keys">https://github.com/settings/keys</a></li>
<li><code>New SSH key</code></li>
<li><strong>Title</strong>: <code>laptop-ubuntu-2026</code> (осмысленное имя — потом поймёте, какой ключ где)</li>
<li><strong>Key type</strong>: Authentication Key</li>
<li><strong>Key</strong>: вставляете содержимое <code>id_ed25519.pub</code></li>
<li><code>Add SSH key</code></li>
</ol>
<h3 id="шаг-3-тестируем-подключение">Шаг 3. Тестируем подключение</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ssh -T git@github.com
</span></span></code></pre></div><p>Первый раз GitHub спросит про неизвестный хост:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">The authenticity of host &#39;github.com (140.82.121.4)&#39; can&#39;t be established.
</span></span><span class="line"><span class="cl">ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
</span></span><span class="line"><span class="cl">Are you sure you want to continue connecting (yes/no/[fingerprint])?
</span></span></code></pre></div><p><strong>Сверьте fingerprint</strong> с официальным: <a href="https://docs.github.com/en/authentication/keychain-fingerprints">https://docs.github.com/en/authentication/keychain-fingerprints</a>. Если совпадает — <code>yes</code>.</p>
<p>Ожидаемый ответ:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Hi username! You&#39;ve successfully authenticated, but GitHub does not provide shell access.
</span></span></code></pre></div><p>Эта фраза — ваш сертификат. Всё работает.</p>
<h3 id="шаг-4-клонируем-что-то-и-проверяем-push">Шаг 4. Клонируем что-то и проверяем push</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /tmp
</span></span><span class="line"><span class="cl">git clone git@github.com:ваш-логин/любой-ваш-репо.git test-repo
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> test-repo
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;ssh test </span><span class="k">$(</span>date +%s<span class="k">)</span><span class="s2">&#34;</span> &gt;&gt; README.md
</span></span><span class="line"><span class="cl">git add README.md
</span></span><span class="line"><span class="cl">git commit -m <span class="s2">&#34;test: ssh auth working&#34;</span>
</span></span><span class="line"><span class="cl">git push
</span></span></code></pre></div><p>Ни один пароль не спросили. Урок пройден.</p>
<hr>
<h2 id="бонус-sshconfig-для-нескольких-аккаунтов">Бонус: ~/.ssh/config для нескольких аккаунтов</h2>
<p>Типичная ситуация: личный GitHub + рабочий GitHub. Один email на GitHub уникален, значит два аккаунта = два разных ключа.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ssh-keygen -t ed25519 -C <span class="s2">&#34;work@company.com&#34;</span> -f ~/.ssh/id_ed25519_work -N <span class="s2">&#34;&#34;</span>
</span></span></code></pre></div><p>И настраиваем <code>~/.ssh/config</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat &gt; ~/.ssh/config <span class="s">&lt;&lt; &#39;EOF&#39;
</span></span></span><span class="line"><span class="cl"><span class="s"># --- личный GitHub ---
</span></span></span><span class="line"><span class="cl"><span class="s">Host github.com
</span></span></span><span class="line"><span class="cl"><span class="s">    HostName github.com
</span></span></span><span class="line"><span class="cl"><span class="s">    User git
</span></span></span><span class="line"><span class="cl"><span class="s">    IdentityFile ~/.ssh/id_ed25519
</span></span></span><span class="line"><span class="cl"><span class="s">    IdentitiesOnly yes
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s"># --- рабочий GitHub ---
</span></span></span><span class="line"><span class="cl"><span class="s">Host github.com-work
</span></span></span><span class="line"><span class="cl"><span class="s">    HostName github.com
</span></span></span><span class="line"><span class="cl"><span class="s">    User git
</span></span></span><span class="line"><span class="cl"><span class="s">    IdentityFile ~/.ssh/id_ed25519_work
</span></span></span><span class="line"><span class="cl"><span class="s">    IdentitiesOnly yes
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">chmod <span class="m">600</span> ~/.ssh/config
</span></span></code></pre></div><p>Использование:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># личный</span>
</span></span><span class="line"><span class="cl">git clone git@github.com:личный/репо.git
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># рабочий (подставляем github.com-work)</span>
</span></span><span class="line"><span class="cl">git clone git@github.com-work:компания/репо.git
</span></span></code></pre></div><p><code>IdentitiesOnly yes</code> критично: без него SSH попробует <strong>все</strong> добавленные в агент ключи подряд. GitHub после 5 неудачных попыток блокирует на минуту — вы получите <code>Too many authentication failures</code>.</p>
<hr>
<h2 id="артефакт-ваш-итоговый-рабочий-набор">Артефакт: ваш итоговый рабочий набор</h2>
<p>После урока у вас есть:</p>
<ol>
<li><code>~/.ssh/id_ed25519</code> — приватный ключ (600)</li>
<li><code>~/.ssh/id_ed25519.pub</code> — публичный ключ (644)</li>
<li>Блок в <code>~/.bashrc</code> с автозагрузкой ssh-agent</li>
<li>(Бонус) <code>~/.ssh/config</code> с именованными хостами</li>
</ol>
<p>Проверка одной командой:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ssh -T git@github.com <span class="o">&amp;&amp;</span> ssh-add -l <span class="o">&amp;&amp;</span> ls -l ~/.ssh/config ~/.ssh/id_ed25519
</span></span></code></pre></div><p>Три зелёных вывода — комплект.</p>
<hr>
<h2 id="частые-ошибки">Частые ошибки</h2>
<table>
  <thead>
      <tr>
          <th>Ошибка</th>
          <th>Причина</th>
          <th>Что делать</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>Permission denied (publickey)</code></td>
          <td>Ключ не добавлен в GitHub или не в агент</td>
          <td><code>ssh-add -l</code>; проверить GitHub Settings → SSH keys</td>
      </tr>
      <tr>
          <td><code>Bad owner or permissions on ~/.ssh/config</code></td>
          <td>Файл <code>644</code> или <code>755</code></td>
          <td><code>chmod 600 ~/.ssh/config</code></td>
      </tr>
      <tr>
          <td><code>Too many authentication failures</code></td>
          <td>Агент подсовывает 10 ключей подряд</td>
          <td><code>IdentitiesOnly yes</code> в <code>~/.ssh/config</code></td>
      </tr>
      <tr>
          <td><code>Host key verification failed</code></td>
          <td>IP сервера изменился, старая запись в <code>known_hosts</code></td>
          <td><code>ssh-keygen -R github.com</code>, подключиться заново</td>
      </tr>
      <tr>
          <td><code>Agent pid ... ssh-agent died</code></td>
          <td>Агент не живёт между сессиями без автозагрузки</td>
          <td>Блок из Практики 2 в <code>~/.bashrc</code></td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="-документирование">📝 Документирование</h2>
<p>Создайте <code>~/notes/day-00.md</code> и ответьте:</p>
<ol>
<li><strong>Вашими словами</strong>: почему приватный ключ никогда не уходит с машины, а авторизация всё равно работает?</li>
<li><strong>Разница Ed25519 vs RSA</strong>: одной строкой — чем Ed25519 лучше для 2026 года?</li>
<li><strong><code>IdentitiesOnly yes</code></strong> — зачем эта опция в <code>~/.ssh/config</code>?</li>
<li><strong>Ваш сценарий</strong>: куда ещё вы положите <code>id_ed25519.pub</code> на этой неделе? (VPS, CI, GitLab, коллега…)</li>
</ol>
<hr>
<h2 id="мини-тест">Мини-тест</h2>
<ol>
<li>Вы сгенерировали ключ <code>~/.ssh/id_ed25519_hobby</code> с passphrase. <code>git push</code> просит пароль каждый раз. Что не сделано?</li>
<li>Публичный ключ попал в публичный репозиторий в <code>README.md</code>. Это утечка? Ответ «да/нет» + одна фраза почему.</li>
<li>Один ключ нельзя добавить в два разных GitHub-аккаунта. Как обойти это ограничение?</li>
<li>Права на <code>~/.ssh/id_ed25519</code> случайно стали <code>644</code>. Что произойдёт при <code>git push</code>?</li>
</ol>
<p>Ответы — в конце поста.</p>
<hr>
<h2 id="что-дальше">Что дальше</h2>
<ul>
<li><strong>День 1</strong> → commits: три состояния (working / staging / committed), <code>git status</code> как компас, осознанный коммит вместо «git add .»</li>
<li><strong>Challenge</strong> → <code>docker run devitway/git-challenge</code>: первая же задача использует SSH-ключ — проверите себя в бою</li>
<li><strong>Системно с нуля</strong> → «Курс молодого бойца» DevIT Academy — Linux + Git + Docker + K8s + CI/CD за 16 недель</li>
</ul>
<hr>
<h2 id="ответы-на-мини-тест">Ответы на мини-тест</h2>
<ol>
<li>
<p>Ключ не добавлен в <code>ssh-agent</code> <strong>или</strong> не прописан в <code>~/.ssh/config</code> через <code>IdentityFile</code>. Без этого <code>git</code> не знает, чем подписывать запрос, и фолбэчится на пароль. Проверка: <code>ssh-add -l</code>.</p>
</li>
<li>
<p><strong>Нет</strong>, это не утечка. Публичный ключ на то и публичный — его задача быть всем видимым. Утечка — только приватный (<code>id_ed25519</code>, без <code>.pub</code>).</p>
</li>
<li>
<p>Два аккаунта = два разных SSH-ключа + <code>~/.ssh/config</code> с разными <code>Host</code>-алиасами (см. «Бонус»). GitHub проверяет ключ → аккаунт, и если один ключ зарегистрирован на двух, возникнет конфликт.</p>
</li>
<li>
<p><code>git push</code> упадёт с ошибкой типа <code>Permissions 0644 for '~/.ssh/id_ed25519' are too open</code>. SSH отказывается использовать приватный ключ, если его может прочитать кто-то кроме владельца — это защита от случайных <code>chmod -R 755</code>. Чиним: <code>chmod 600 ~/.ssh/id_ed25519</code>.</p>
</li>
</ol>
]]></content:encoded>
    </item>
  </channel>
</rss>
