← Electerm 博客

复制书签:一行字符串随处粘贴,或者整条记录导成 JSON

2026-10-08
书签快速连接分享备份JSON技巧

复制书签:一行字符串随处粘贴,或者整条记录导成 JSON

electerm 一直擅长把字符串变成会话。把 ssh://user@host 粘进快速连接框、点一个 electerm:// 链接、让 AI 从一句话生成书签——最后都汇进同一个解析器,然后开出一个会话。

反过来这一路一直是缺的。书签没有办法导出成文本。你能在侧边栏看见一台主机,但没法把它交给别人。

现在书签表单的标题栏上有了一个复制按钮。

它在哪

设置 → bookmarks,打开一个书签——或者新建一个。表单标题栏右侧,在标题和 AI 按钮之后,有一个小小的复制图标。点一下,会掉下来一个菜单,里面两行。

每一行显示一行预览,鼠标悬停可以看到完整内容。点任意一行,内容进剪贴板,照例弹一个"已复制"。

关于复制的是什么,有两点要说:

  • 复制的是表单此刻的样子,包括你还没保存的修改。不用先保存,拿到的也不是上次保存的版本,而是屏幕上正在显示的那份。
  • 新建的书签也能复制。空表单就复制出一条空记录。

格式一:一行连接串

这是快速连接框认的格式,是 electerm:// 深链接用的格式,也是命令行接受的格式。它就是本来要你手打的那一行。

下面这些例子,都是按钮里直接出来的:

书签 复制出来的字符串
ssh,root@10.0.0.1,默认端口 ssh://root@10.0.0.1
ssh,root@10.0.0.1,端口 2222 ssh://root@10.0.0.1:2222
ssh,存了密码 ssh://root:simple@10.0.0.1
ssh,标题叫 "core switch" ssh://admin@10.0.0.1?opts={"title":"core switch"}
ssh,关掉了 SFTP ssh://root@10.0.0.1?opts={"enableSftp":false}
ssh,字符集 gbk ssh://root@10.0.0.1?opts={"encode":"gbk"}
telnet,admin@sw-01 telnet://admin:x@sw-01
vnc,u@desk-01 vnc://u@desk-01
rdp,desk-01 rdp://desk-01
ftp,u@nas-01 ftp://u@nas-01
spice,vm-01 spice://vm-01
serial,/dev/tty.usbserial,115200 serial:///dev/tty.usbserial:115200
web,https://10.0.0.1:8443 https://10.0.0.1:8443
本地终端 (没有——这个类型没有字符串形式)

这一行刻意不带的东西

  • 默认端口。 ssh 22、telnet 23、vnc 和 spice 5900、rdp 3389、ftp 21。它没丢——读这行字符串的时候会把对应的默认值补回来。
  • 空字段,以及各类型的默认值。 一个 ssh 书签本来就带着 xterm-256color、utf-8、SFTP 开、ssh-agent 开。这些都不写进去,因为读的时候会还原。全是默认值的书签,导出来就只有地址。
  • 所有能在你机器上执行东西的字段。 代理命令、连接后执行的脚本、环境变量、交互式自动应答、触发器——这些一个都不进字符串,而且字符串里如果硬塞了它们,读回来的时候也会被剥掉。

最后一条是这个格式刻意的性质,不是疏漏。点开的链接、粘进来的字符串、快捷方式文件走的是同一条路,所以这个格式拒绝携带任何能触达 shell 的东西。代价是:一行字符串是一份连接配方,不是完整备份。如果你的书签依赖某个触发器或连接后脚本,字符串复制不出它。

挂在 opts 里的东西

其余的东西都以 JSON 的形式挂在 opts 里:标题、隧道、连接跳跃、keep-alive、字符集、终端类型、各种会话设置。这些能干净地来回。

隧道是那一行会明显变长的情况,因为一条隧道本身就是一条记录,而不是一个单值:

ssh://root@10.0.0.1?opts={"sshTunnels":[{"sshTunnel":"forwardLocalToRemote","sshTunnelLocalPort":8080,"sshTunnelRemoteHost":"localhost","sshTunnelRemotePort":80}]}

这是一条「本地转发到远端」的隧道:连你自己机器上的 8080 端口,就能到远端主机上的 localhost:80。把它粘进快速连接,隧道一起带过去。书签里有好几条隧道的话,这一行就没法看了——那种情况该用 JSON 那一行。

完整语法在快速连接 wiki 页。

格式二:整条记录导成 JSON

第二行给你的是这个书签存起来的样子——格式化过的 JSON,表单持有的每个字段都在,包括那一行字符串拒绝携带的那些:

{
  "type": "ssh",
  "title": "core switch",
  "host": "10.0.0.1",
  "port": 2222,
  "username": "admin",
  "authType": "password",
  "password": "simple",
  "proxyCommand": "netbird ssh proxy %h %p",
  "encode": "gbk",
  "enableSftp": false,
  "term": "xterm-256color"
}

这里是节选——真正的记录里是表单持有的全部字段。注意里面的 proxyCommand:它跟着书签一起存着,而它正好就是那一行字符串拒绝携带的那类字段。

要一份拷贝而不是一条连接的时候用它:把书签挪到另一台机器、把某台难缠主机的配置原样记下来、比对两台"应该一样"的主机,或者提 bug 的时候把真实配置一起贴上。

它实际能用来干什么

  • 把一台主机交给别人。 复制那一行,粘到聊天窗口或工单里。对方丢进快速连接——新标签页菜单里的闪电输入框、空状态页的输入框,或者侧边栏的闪电图标——就连上了。不用截图设置对话框,也不用问"端口是多少来着"。
  • 变成一个能点的链接。 这几个协议同样注册了深链接,所以 ssh://root@10.0.0.1 可以是一个同事直接点开就进会话的东西。
  • 在机器之间搬一台主机。 只搬连接就一行;想把附加设置也带上,再加 JSON。
  • 喂给别的工具。 这两种格式正好就是快速连接、深链接处理、命令行和 AI 建书签已经在读的东西。

有一个不对称值得知道:深链接注册的协议是 ssh、telnet、vnc、rdp、spice、serial、ftp——和字符串形式覆盖的是同一份名单。而 web 书签的字符串就是它的网址,所以它能用在快速连接框里,但它不是一个深链接;在聊天软件里它就是个普通链接,点开是浏览器,不是 electerm 的标签页。

两点要当心

密码会一起走,而且是明文

书签里存了密码,字符串就带着它:ssh://root:simple@10.0.0.1。JSON 也带着。所以复制出来的字符串是一份凭据,请按凭据对待——别往群聊、公开 issue 或者粘贴板网站里贴。

如果你想交出连接但不交密码,复制之前先把密码字段清空。复制读的是表单此刻的样子,字段空了,字符串里也就空了。

密码里带 @ 的过不了这一趟

这是唯一真正尖锐的地方。字符串把密码放在 : 和 @ 之间,而解析器按它找到的第一个 @ 切开。所以密码是 p@ss 的时候,读回来密码变成 p,主机变成 ss@10.0.0.1——这一行悄悄指向了一个不存在的地方。

密码里有冒号没问题,有 at 符号不行。

菜单在复制之前会先给你看预览,那个预览就是检查点:如果主机部分看着不对,就别发出去。密码里带 @ 的账号,改用 JSON 那一行——JSON 不会被重新解析,没有歧义。

速查

  • 复制按钮在书签表单标题栏右侧(设置 → bookmarks)。它读的是表单此刻的样子,存没存过都一样。
  • quick connect 那一行 → 一行字符串,正是快速连接框和 electerm:// 链接认的东西。
  • JSON 那一行 → 完整记录,用于备份、比对和提 bug。
  • 字符串会丢掉默认端口、空字段、各类型默认值,以及每一个可执行字段(代理命令、连接后脚本、环境变量、触发器)。后面这组里但凡你依赖的东西,都得走 JSON。
  • 本地终端没有字符串形式,所以它的 quick connect 那一行是灰的。
  • 密码是明文一起走的,两种格式都是。要分享的话先把字段清空。
  • 密码里带 @ 会破坏字符串。看预览,或者改用 JSON。

下一篇:Electerm 先存书签再连接讲为什么 electerm 里每条连接都得先是书签;或者数据同步,讲怎么把整套书签在机器之间搬。