奇技淫巧:在 ssh 里面把服务器的文本复制到本地电脑
使用 macOS 的同学,应该熟悉一个命令pbcopy
,它可以在命令行中把一段内容写入到剪贴板,例如:
echo "kingname" | pbcopy
就能把字符串kingname
复制到剪贴板里面。我们也可以使用这个方法把一个文件中的内容写入到剪贴板:
cat xxx.txt | pbcopy
这样我们就不需要把文件打开再手动复制的。
有时候,我要把服务器上面的日志复制下来。原来都是进入服务器以后,用 vim 打开日志文件,用鼠标选中再复制。且不说服务器是 Linux,没有pbcopy
这个命令,即使有这个命令,服务器上又怎么能访问本地的剪贴板呢?
在网上一搜,竟然还真有办法。使用OSC52实现iTerm2远程pbcopy - 风雪之隅[1]这篇文章借助 iterms 的一个功能和几个特殊的字符,通过 php 实现了这个功能。我们来把它改写成 Python 版本。
首先打开 iterms 的设置,把方框框住的这一项勾上:
然后,在 iterms 里面,通过 ssh 连上服务器。
然后,我们来写一段 Python 代码:
import base64
print(' 33]52;c;' + base64.b64encode('青南'.encode()).decode() + ' 07')
然后在服务器上运行这段代码,运行效果如下图所示:
什么都没有打印出来?但不要担心,现在,你随便找一个可以打字的输入框,按下键盘上面的Command +V
键。你会发现,青南
两个字竟然被粘贴出来了!
有了这个机制,我们就来人工写一个pbcopy.py
,接收管道的输入:
其中,#! /usr/bin/python3
是远程服务器上面 Python 的地址。你可以通过命令which python3
找到这个地址。
保存完成以后,给他添加可执行权限:chmod +x pbcopy.py
。
现在,我们试一试把远程的多行文本复制到本地的剪贴板中:
我这里复制的就是这个代码自身。大家也可以使用其他文件来测试。复制完成以后,我们随便找个地方粘贴,发现复制成功!
现在,我们使用软连接,把这个可执行文件变得更像命令一些:
sudo ln -s /home/ubuntu/pbcopy.py /usr/bin/pbcopy
运行效果如下图所示:
完美满足要求。
需要注意的是,这个程序会把管道输入的所有内容全部接收完成以后才会复制,所以,如果你输入的文本内容太大,可能会撑爆内存。
参考资料
[1]
使用OSC52实现iTerm2远程pbcopy - 风雪之隅: https://www.laruence.com/2020/05/21/5880.html
- 简易计算器
- CoCreateInstance调用返回代码0x80040154的一种解决方法
- Asp.net页面生命周期
- Premiere&After Effects的实时预览插件开发
- 委托与事件
- 一款批量修改AE模板的工具
- 深入线程
- 【插件开发】—— 2 插件入门
- 线程间通讯:WaitHandler使用实例及分析
- 域名Deskbike.com刚注册没多久就以五位数结拍
- 一起Polyfill系列:Function.prototype.bind的四个阶段
- winform实现拼图游戏
- 一起Polyfill系列:让Date识别ISO 8601日期时间格式
- Oracle 监听器无法启动(TNS-12537,TNS-12560,TNS-00507)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法