复制书签:一行字符串随处粘贴,或者整条记录导成 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 里每条连接都得先是书签;或者数据同步,讲怎么把整套书签在机器之间搬。
