CPYNET — Онлайн-буфер обмена для обмена копированием-вставкой через curl

CPYNET

При сканировании открывается и читается прямо в браузере телефона.

В Windows PowerShell вводите curl.exe вместо алиаса curl — иначе длинные тексты могут обрезаться в консоли.
terminal
$ 

Установка

Настройте постоянный алиас (один раз)

curl -s https://cpynet.com/install.sh -o install.sh && bash -n install.sh && . install.sh

SHA256 файла install.sh: 86bd4b2171ea3f0e8e845df8585e69a3d452eb94855bbab7dd097c8af9b96887

Прочитать install.sh перед запуском
# cpynet installer - fetches the cpy/pst shell functions from https://cpynet.com/alias,
# adds a source line to your shell's rc file (once, never duplicated), and
# loads them into this session right now.
#
# Dot-sourced (". install.sh"), not run as a subprocess - that's what makes
# cpy/pst usable immediately in this terminal, not just in new ones.
CPYNET_RC=~/.bashrc
[ -n "$ZSH_VERSION" ] && CPYNET_RC=~/.zshrc
if curl -s https://cpynet.com/alias -o ~/.cpy.sh && bash -n ~/.cpy.sh; then
	grep -qxF 'source ~/.cpy.sh' "$CPYNET_RC" || echo 'source ~/.cpy.sh' >> "$CPYNET_RC"
	. ~/.cpy.sh
	echo "cpynet installed - cpy and pst are ready"
else
	echo "install failed, try again"
fi
unset CPYNET_RC

SHA256 скрипта, который скачивает install.sh (~/.cpy.sh): 8161c889a7240a3958267ffdb1697cff311246b5c4aaf57c02d44aa1d397a17e

Прочитать и этот скрипт (также подходит для ручной установки - скопируйте функцию ниже напрямую)
cpy() {
	local password="" ttl="" reads="" e2e="" a
	for a in "$@"; do case "$a" in
		-password=*) password="${a#-password=}" ;;
		-ttl=*) ttl="${a#-ttl=}" ;;
		-reads=*) reads="${a#-reads=}" ;;
		-e) e2e=1 ;;
	esac; done
	local qs=""
	[ -n "$ttl" ] && qs="ttl=$ttl"
	[ -n "$reads" ] && qs="${qs:+$qs&}reads=$reads"
	local target="https://llmtag.com/"
	[ -n "$qs" ] && target="https://llmtag.com/?$qs"
	local input key=""
	if [ -n "$e2e" ]; then
		key=$(openssl rand -base64 24)
		input=$(openssl enc -aes-256-cbc -pbkdf2 -salt -a -A -pass "pass:$key") || return 1
	else
		input=$(cat)
	fi
	local url
	if [ -n "$password" ]; then
		url=$(printf '%s' "$input" | curl -sS --fail-with-body -L -H "X-Password: $password" --data-binary @- "$target") || return 1
	else
		url=$(printf '%s' "$input" | curl -sS --fail-with-body -L --data-binary @- "$target") || return 1
	fi
	local bare="${url%%\?*}"
	echo "${bare##*/}"
	echo "curl \"$url\""
	if [ -n "$key" ]; then
		echo "key (share separately, never with the link/code): $key"
	fi
}
pst() {
	local password="" id="" key="" a
	for a in "$@"; do case "$a" in
		-password=*) password="${a#-password=}" ;;
		-key=*) key="${a#-key=}" ;;
		*) id="$a" ;;
	esac; done
	if [ -z "$id" ]; then echo "usage: pst <code> [-password=xxx] [-key=xxx]" >&2; return 1; fi
	local target="https://llmtag.com/$id"
	[ -n "$password" ] && target="$target?p=$password"
	local text
	text=$(curl -sS --fail-with-body "$target") || return 1
	if [ -n "$key" ]; then
		text=$(printf '%s' "$text" | openssl enc -d -aes-256-cbc -pbkdf2 -a -A -pass "pass:$key") || { echo "decrypt failed - wrong key?" >&2; return 1; }
	fi
	printf '%s\n' "$text"
	if command -v pbcopy >/dev/null 2>&1; then printf '%s' "$text" | pbcopy
	elif command -v wl-copy >/dev/null 2>&1; then printf '%s' "$text" | wl-copy
	elif command -v xclip >/dev/null 2>&1; then printf '%s' "$text" | xclip -selection clipboard
	elif command -v xsel >/dev/null 2>&1; then printf '%s' "$text" | xsel --clipboard
	elif command -v clip.exe >/dev/null 2>&1; then printf '%s' "$text" | clip.exe
	fi
}

После этого просто: команда | cpy — выводит 6-значный код и готовую команду curl в двух строках. Чтобы защитить паролем: команда | cpy -password=xxx. Для чтения: pst 123456 — выводит содержимое в stdout, а также копирует в буфер обмена, если это возможно (pbcopy/wl-copy/xclip/xsel/clip.exe).

Ссылки создаются на коротком домене https://llmtag.com; команда установки выше скачивается с основного сайта, https://cpynet.com - тот же сервис, просто отдельный короткий домен для ссылок.

Windows / PowerShell

Invoke-RestMethod https://cpynet.com/install.ps1 -OutFile install.ps1; . .\install.ps1

SHA256 файла install.ps1: 0ab2333a4ea86b1b8797c2b8251daa368d485dfeaa6dfcaad90c076d0217b43c

Прочитать install.ps1 перед запуском
# cpynet installer - fetches the cpy/pst PowerShell functions from
# https://cpynet.com/alias.ps1, adds a dot-source line to $PROFILE (once, never duplicated),
# and loads them into this session right now.
#
# Dot-sourced (". .\install.ps1"), not run as a subprocess - that's what
# makes cpy/pst usable immediately in this session, not just in new ones.
$ErrorActionPreference = 'Stop'
try {
	Invoke-RestMethod https://cpynet.com/alias.ps1 -OutFile "$HOME/.cpy.ps1"
	if (-not (Test-Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force | Out-Null }
	if (-not (Select-String -Path $PROFILE -Pattern '\.cpy\.ps1' -Quiet -ErrorAction SilentlyContinue)) {
		Add-Content $PROFILE "`n. `"$HOME/.cpy.ps1`""
	}
	. "$HOME/.cpy.ps1"
	Write-Output "cpynet installed - cpy and pst are ready"
} catch {
	Write-Output "install failed, try again"
}

SHA256 скрипта, который скачивает install.ps1 (~/.cpy.ps1): 356ae02c39d58c86d717899969cf961e519eac156105140671c63941b9b5aa17

Прочитать и этот скрипт (также подходит для ручной установки - скопируйте функции ниже напрямую)
function cpy {
	[CmdletBinding()]
	param(
		[Parameter(ValueFromPipeline = $true)]
		[string[]]$InputObject,
		[string]$Password = "",
		[string]$Ttl = "",
		[string]$Reads = ""
	)
	begin { $lines = New-Object System.Collections.Generic.List[string] }
	process { if ($null -ne $InputObject) { foreach ($l in $InputObject) { $lines.Add($l) } } }
	end {
		$text = $lines -join "`n"
		$qs = @()
		if ($Ttl) { $qs += "ttl=$Ttl" }
		if ($Reads) { $qs += "reads=$Reads" }
		$target = "https://llmtag.com/"
		if ($qs.Count -gt 0) { $target = "https://llmtag.com/?" + ($qs -join '&') }
		$headers = @{}
		if ($Password) { $headers["X-Password"] = $Password }
		try {
			$url = (Invoke-RestMethod -Uri $target -Method Post -Body $text -Headers $headers -ContentType "text/plain; charset=utf-8").Trim()
		} catch {
			Write-Error $_
			return
		}
		$bare = $url -replace '\?.*$', ''
		$code = $bare -replace '.*/', ''
		Write-Output $code
		Write-Output "curl `"$url`""
	}
}

function pst {
	[CmdletBinding()]
	param(
		[Parameter(Position = 0)]
		[string]$Code = "",
		[string]$Password = ""
	)
	if (-not $Code) { Write-Error "usage: pst <code> [-Password xxx]"; return }
	$target = "https://llmtag.com/$Code"
	if ($Password) { $target = "$target`?p=$Password" }
	try {
		$text = Invoke-RestMethod -Uri $target -Method Get
	} catch {
		Write-Error $_
		return
	}
	Write-Output $text
	if (Get-Command Set-Clipboard -ErrorAction SilentlyContinue) {
		$text | Set-Clipboard
	}
}

Это один раз добавляет функции cpy/pst в $PROFILE - после этого "текст" | cpy и pst 123456 работают так же, как в bash-версии (параметры в собственном стиле PowerShell: cpy -Ttl 1h -Reads 3 -Password xxx, pst 123456 -Password xxx).

Использование

Использование веб-интерфейса

1. Введите текст1. Введите текст

1. Введите текст
Вставьте текст или код на вкладке «написать», нажмите отправить.

2. Поделитесь кодом, ссылкой или QR2. Поделитесь кодом, ссылкой или QR

2. Поделитесь кодом, ссылкой или QR
При отправке создаются 6-значный код, готовая команда curl и сканируемый QR-код.

3. Введите код3. Введите код

3. Введите код
На вкладке «прочитать» введите код — или отсканируйте QR-код телефоном.

4. Читается один раз, потом исчезает4. Читается один раз, потом исчезает

4. Читается один раз, потом исчезает
Содержимое отображается мгновенно и безвозвратно удаляется с сервера — тот же код повторно не сработает.

Отправить из терминала

команда | curl --data-binary @- https://llmtag.com/

В ответ приходит голая, готовая к использованию ссылка.

Прочитать из терминала

curl "ваша-ссылка"

Читается один раз, затем удаляется безвозвратно. Установлен алиас выше? pst 123456.

Защитить паролем

Заполните поле пароля ниже — ссылка автоматически будет содержать ?p=пароль.

Windows / PowerShell

Invoke-RestMethod -Method Post -Body "текст" -Uri https://llmtag.com/
Invoke-RestMethod "ваша-ссылка"

Вместо curl.exe можно использовать и встроенный Invoke-RestMethod.

Интеграция API / CI

Добавьте Accept: application/json к запросу создания, чтобы получить {"code","url","expires_at"} вместо обычного текста - удобнее разбирать в скрипте. Полное описание, включая коды состояния (400/401/404/413/429/503) и пример с GitHub Actions: /api.

Часто задаваемые вопросы

Сколько раз можно использовать код?

Только один раз. Он безвозвратно удаляется с сервера в момент прочтения.

Что происходит по истечении времени?

Даже если никто его не прочитает, вставка удаляется автоматически - на сервере не остаётся никаких следов.

Как пользоваться сервисом при отключённом буфере обмена?

CPYNET вообще не касается буфера обмена - всё передаётся через curl из терминала, поэтому отключённый буфер обмена не имеет значения.

Видит ли сервер или сохраняет то, что я вставляю?

Текст хранится только в памяти и никогда не записывается на диск - он безвозвратно удаляется в момент прочтения или по истечении времени. При защите паролем он хранится зашифрованным с помощью AES-256-GCM.

Работает ли это в Windows?

Да - в PowerShell вводите curl.exe вместо алиаса curl, иначе длинные тексты могут обрезаться в консоли. Либо используйте встроенный Invoke-RestMethod, либо установите функции cpy/pst через раздел Windows / PowerShell выше.

Каков максимальный размер и длина кода?

До 2 MB, 6-значный код, по умолчанию автоудаление в течение 2 мин - можно выбрать до 1 д (параметр ?ttl= или переключатель TTL на вкладке «написать»). По умолчанию удаляется после 1 прочтения - можно выбрать до 10 прочтений (параметр ?reads= или переключатель количества прочтений).

Почему CPYNET?

Создан для сред, где совместное использование буфера обмена невозможно: удалённые серверы по SSH, машины, где доступ к буферу обмена заблокирован политикой, или отдельные машины/контейнеры/виртуальные рабочие столы без общего буфера обмена между ними. CPYNET никогда не касается буфера обмена операционной системы - всё передаётся как обычный текст через curl - поэтому им можно уверенно пользоваться даже там, где буфер обмена полностью отключён.

Возможности

  • Одноразовое чтение: безвозвратно удаляется в момент прочтения
  • Автоудаление по истечении времени, даже если никто не прочитал
  • Обмен с защитой паролем: AES-256-GCM + PBKDF2, сервер хранит открытый текст лишь мгновение
  • Уведомление в реальном времени: вкладка узнаёт о прочтении мгновенно (SSE)
  • Поддержка небольших файлов (только разрешённые расширения, хранятся не более 1 ч): 📎 чтобы прикрепить, скачивается обратно с исходным именем файла и типом содержимого
  • Ограничение частоты запросов по IP: защита от подбора кода и атак перебором

Разрешённые расширения файлов: .txt, .log, .csv, .json, .md, .pdf, .doc, .docx, .rtf, .xml, .yaml, .yml, .pem, .crt, .key, .conf, .cfg, .env, .ini, .toml

Безопасность

Сервер никогда не выполняет, не интерпретирует и не передаёт вставленное в оболочку - он лишь сохраняет и возвращает данные точно в том виде, в каком получил. Никаких сторонних зависимостей (чистая стандартная библиотека Go), никакого доступа к файловой системе с пользовательскими данными, никаких исходящих запросов.

Шифрование с нулевым разглашением (сервер никогда не может это увидеть)

Значок щита (🔒) на вкладке «написать» или cpy -e из терминала - это другой уровень по сравнению с паролем выше: при пароле сервер ненадолго сам расшифровывает текст для проверки; здесь же шифрование полностью происходит на вашей стороне - сервер никогда не видит ничего, кроме зашифрованного текста.

  1. Ваш браузер (или cpy -e) генерирует случайный ключ - он никогда не покидает вашу машину.
  2. Текст шифруется этим ключом в браузере (WebCrypto AES-256-GCM) или в терминале (openssl).
  3. На сервер отправляется только зашифрованный текст, и это всё, что он когда-либо хранит - открытый текст он никогда не видит.
  4. Ключ передаётся в части ссылки #key= (браузеры никогда не отправляют фрагмент на сервер) либо передаётся отдельно через pst -key= в терминале - сама по себе ссылка/код без него бесполезны.

⚠️ Предупреждение: это не устраняет риск передачи чего-либо в оболочку (curl ... | bash) без предварительной проверки - это универсальный риск для любого инструмента обмена, а не особенность именно этого сервиса. Никогда не запускайте непроверенную команду из источника, которому не доверяете.

Ограничения

Макс. размер: 2 MB · Код: 6 знаков · Автоудаление: по умолчанию 2 мин, можно выбрать до 1 д · Прочтения: по умолчанию 1, до 10

CPYNET v1.0 — один файл, один бинарник на Go — без внешней базы данных и зависимостей.

Создано Emin Buyuk