Когда Claude Code работает на удалённом сервере, hook с notify-send или osascript срабатывает на сервере, где нет рабочего стола для показа уведомления. Рабочих способов два. Первый — escape-последовательность терминала: встроенное уведомление Claude Code или hook, возвращающий terminalSequence, передаётся обратно по SSH-соединению, и его показывает Ваш локальный терминал (Ghostty, Kitty или iTerm2), но только пока Вы подключены и терминал открыт. Второй — push по сети с сервера на телефон через ntfy, webhook или Claude Code Notifier; он работает, даже когда ноутбук закрыт.
01Почему локальные команды уведомлений не работают по SSH
Hook — это команда, которую Claude Code выполняет на той машине, где Claude Code запущен. При работе по SSH это сервер. notify-send там требует демона уведомлений рабочего стола, которого, как отмечено в руководстве Anthropic по hooks, нет на headless-серверах и в SSH-сессиях. osascript и toast-уведомлений PowerShell там нет вовсе.
Поэтому вопрос не в том, «какую команду уведомления выбрать», а в том, «как сигнал дойдёт с сервера до меня». Есть три способа:
02Способ 1: уведомления через SSH-терминал
Собственное уведомление Claude Code — это escape-последовательность, записываемая в терминал. Согласно руководству Anthropic по терминалу, она доходит до локальной машины по SSH, так что удалённая сессия тоже может Вас оповестить. Ghostty и Kitty передают её в центр уведомлений без настройки. iTerm2 — после включения: Settings > Profiles > Terminal, отметьте Notification Center Alerts, затем в Filter Alerts включите Send escape sequence-generated alerts.
Если Ваш терминал не из этого списка или нужен свой текст, hook может вернуть escape-последовательность, которую запишет Claude Code. У hooks нет своего терминала, поэтому последовательность возвращается в поле terminalSequence. Сохраните на сервере как ~/.claude/hooks/notify-ssh.sh:
#!/bin/bash
body=$(jq -r '.message // "Claude Code needs your attention"')
# OSC 9 for iTerm2, WezTerm and ConEmu; use '\033]777;notify;%s;%s\007' for Ghostty
seq=$(printf '\033]9;%s\007' "$body")
jq -nc --arg seq "$seq" '{terminalSequence: $seq}'
Затем добавьте его в ~/.claude/settings.json на сервере:
{
"hooks": {
"Notification": [
{
"matcher": "",
"hooks": [
{ "type": "command", "command": "~/.claude/hooks/notify-ssh.sh" }
]
}
]
}
}
Выполните chmod +x ~/.claude/hooks/notify-ssh.sh и установите jq на сервер. В справочнике Anthropic перечислены поддерживаемые последовательности: OSC 9 (iTerm2, ConEmu, Windows Terminal, WezTerm), OSC 99 (Kitty), OSC 777 (urxvt, Ghostty, Warp) и простой bell. Claude Code записывает последовательность только в интерактивной сессии, пока его интерфейс на экране.
Ограничения заложены в сам способ. Если SSH-соединение оборвётся, ноутбук уснёт или Вы закроете вкладку, ничего не придёт. Если Вы запускаете Claude Code в tmux, добавьте set -g allow-passthrough on в ~/.tmux.conf на сервере; подробности и работа с отключёнными сессиями — в руководстве по tmux.
03Способ 2: push с сервера
Push не зависит от терминала, поэтому подходит для долгих задач. Hook отправляет HTTPS-запрос с сервера, а сервис доставляет его на телефон или в чат. Готовые hooks есть в руководстве по ntfy и руководстве по Telegram, Slack и Discord. Они лишь сообщают, что что-то произошло: одобрить команду или ответить на вопрос через них нельзя, так что Claude будет ждать, пока Вы снова подключитесь.
04Способ 3: Claude Code Notifier на сервере
Claude Code Notifier — независимый инструмент (от TouchTap, не от Anthropic). Его бесплатная утилита командной строки ccn работает на Mac, Windows и Linux, поэтому устанавливайте её на сервер, где работает Claude Code:
curl -fsSL https://claudecodenotifier.com/install.sh | sh
Она добавляет свои записи hooks в ~/.claude/settings.json на сервере, сохраняет остальное и делает резервную копию. Уведомления рабочего стола ccn появляются на машине, где запущен ccn, а на headless-сервере это бесполезно. Полезен телефон: уведомления на него идут через зашифрованный relay-сервер TouchTap, а не через SSH-соединение, поэтому работают с любой машины, где запущен ccn, если у неё есть доступ в интернет.
Сопряжение по SSH
Для сопряжения браузер на сервере не нужен. Либо выполните ccn pair в SSH-сессии: в терминале появится QR-код, который нужно отсканировать камерой телефона, и ссылка, действующая 24 часа. Либо откройте приложение на телефоне, перейдите в Computers > Add a computer и выполните показанную строку — она устанавливает и выполняет сопряжение за один шаг:
curl -fsSL https://claudecodenotifier.com/install.sh | sh -s 482913
(Шестизначный код приведён для примера; используйте тот, что показывает приложение.) К одному телефону можно подключить несколько компьютеров, так что уведомления могут приходить и с ноутбука, и с сервера. Подробнее — в руководстве по сопряжению.
Что можно делать с телефона
После сопряжения Вы получаете push, когда Claude завершает работу, запрашивает разрешение или задаёт вопрос. Вы можете разрешить один раз, разрешить на всю сессию или отклонить запрос, выбрать ответ на вопрос Claude и отправить следующую инструкцию после того, как Claude закончит. Если Вас нет рядом, терминал ждёт ответа с телефона — не дольше заданного Вами лимита — и перестаёт ждать, как только Вы начинаете печатать на клавиатуре. Запустите ccn doctor на сервере, чтобы проверить hooks, учётные данные и соединение с relay-сервером. Стоимость мобильных приложений указана на странице цен; утилита командной строки бесплатна.
05Как сохранить Claude Code при обрыве SSH
Во всех трёх вариантах сам Claude Code должен продолжать работать. Если запустить claude прямо из SSH-оболочки и соединение оборвётся, сессия завершится вместе с ним. Запускайте его внутри tmux или GNU screen, чтобы он пережил разрыв, а затем подключитесь снова. В отсоединённой сессии hooks продолжают срабатывать — и именно здесь push на телефон по-настоящему полезен. Этот сценарий описан в руководстве по tmux и в статье о долгих задачах без присмотра.
06FAQ
Почему notify-send ничего не делает, когда я работаю с Claude Code по SSH?
Hook выполняется на сервере, а на сервере нет демона уведомлений рабочего стола. Используйте escape-последовательность, которую понимает Ваш локальный терминал, или push-сервис.
Работают ли встроенные уведомления Claude Code по SSH?
Да, в терминалах, которые их поддерживают. Согласно документации Anthropic, уведомление рабочего стола доходит до Вашей локальной машины по SSH; Ghostty и Kitty показывают его без настройки, а iTerm2 — после включения оповещений по escape-последовательностям. Соединение при этом должно быть открыто.
Куда устанавливать ccn — на ноутбук или на сервер?
На сервер, потому что именно там работают Claude Code и его hooks. Установите его и на ноутбук, если запускаете Claude Code и там; один телефон можно сопрячь с обоими.
Будут ли приходить уведомления, если SSH-сессия оборвётся?
Только через push с сервера и только если Claude Code продолжает работать, например внутри tmux. Escape-последовательности перестают работать, как только соединение закрывается.
Нужно ли открывать порты на сервере для уведомлений на телефон?
ccn не требует входящих соединений. Нужен только исходящий доступ в интернет до relay-сервера.