当前位置: 首页 > news >正文

rust实现的快捷补全到剪贴板的实用工具

最近在兼职项目中老是遇到这样的场景:

  1. 在云服务器之间通过scp命令传输文件,密码太长记不住(客户服务器不方便ssh-copy-id)
  2. 在服务器上使用mysql命令登录修改数据,数据库密码太长记不住(客户设置的密码,直接改掉哈?)
  3. 自己电脑使用gemini cli需要代理,代理命令太长记不住 (简单的放入脚本中不能生效)

之前的做法都是记录到本地记事本,然后打开记事本找到对应的密码再复制到剪贴板,
但是这样太麻烦了,而且容易出错(因为有些密码有特殊字符,所以容易拷贝不全)。

整理下我的需求:

这样的效率太低了,所以我决定写一个工具,能满足我前面的需求。

  1. 命令行执行程序,因为要高效,我开机第一个打开的程序是iterm哈。
  2. 命令方便记忆,就叫yucopy,缩写那就是yc。
  3. 输入一个参数,就能得到对应的密码等值
  4. 参数支持快捷补全
  5. 执行完后密码等信息能自动保存到剪贴板

我的解决方案:

  1. 我的高效流程是用fish shell,参数补全使用fish shel的方案。
  2. 最近在复习rust语言,后续有项目需要用到rust开发,打算用rust实现这个命令行工具。

fish shell

~/.config/fish/config.fish中增加

complete -c yc -x -a '(  cat /opt/dir/yulove/data/key2value.txt | awk -F "=" \'{print $1}\' )'

/opt/dir/yulove/data/key2value.txt是我的配置文件
这样key2value.txt中的key就能自动补全了。

配置文件key2value.txt

参考配置:

yl_mysql_pwd==对应数据库密码
yl_rtest_ip==对应测试服务器ip
yl_baidu_pwd==对应服务器密码
proxy_hong==export https_proxy=http://127.0.0.1:8888 http_proxy=http://127.0.0.1:8888 all_proxy=http://127.0.0.1:8888

可以看到我故意用==去区分key和value,这样像https_proxy=等value值就不容易出错了。

rust代码

Cargo.toml

[package]
name = "yc"
version = "0.1.0"
edition = "2021"[dependencies]
arboard = "3.2.0"

main.rust

use std::env;
use std::fs::File;
use std::io::{self, BufRead};
use arboard::Clipboard;fn main() -> io::Result<()> {let args: Vec<String> = env::args().collect();if args.len() < 2 {println!("Usage: ycopy <key>");return Ok(());}let key = &args[1];let file = File::open("/opt/dir/yulove/data/key2value.txt")?;let reader = io::BufReader::new(file);for line in reader.lines() {let line = line?;let parts: Vec<&str> = line.split("==").collect();if parts.len() == 2 && parts[0] == key {Clipboard::new().unwrap().set_text(parts[1].to_string()).unwrap();println!("Value for key '{}' copied to clipboard.", key);return Ok(());}}println!("Key '{}' not found.", key);Ok(())
}

效果

在这里插入图片描述

总结

因为终端我都是打开tmux的,这样我可以快捷键切换到另一个窗口,然后使用yc命令+方便记忆的key,就能快速得到我想要的保存到剪贴板,
再切换窗口,然后粘贴,这样我就可以快速登录服务器,修改数据库密码,或者使用gemini cli了。

http://www.dtcms.com/a/287149.html

相关文章:

  • Matplotlib和Plotly知识点(Dash+Plotly分页展示)
  • 6-大语言模型—预训练:数据处理
  • Linux系统环境下 Node.js 20 安装实践:glibc 2.17 兼容方案与工具链优化
  • Redis安全加固:从漏洞防护到纵深防御体系搭建
  • 《汇编语言:基于X86处理器》第8章 高级过程(3)
  • PCIe Base Specification解析(一)
  • JS逆向 - 东、深、昆航查询参数
  • FPGA自学——二选一多路选择器
  • 模型的评估与选择
  • Kafka——Java生产者是如何管理TCP连接的?
  • Java File 类详解:从基础操作到实战应用,掌握文件与目录处理全貌
  • 《程序员修炼之道》第一二章读书笔记
  • 车载通信架构 --- DoIP协议通信
  • aosp15实现SurfaceFlinger的dump输出带上Layer详细信息踩坑笔记
  • 基于深度学习的图像超分辨率:从低分辨率到高分辨率的图像重建
  • PHP MySQL 读取数据
  • 代码随想录算法训练营第二十五天
  • 【Android】ListView与RecyclerView的基础使用
  • 【RK3576】【Android14】Android平台构建
  • MTF算法V1.0
  • Android无需授权直接访问Android/data目录漏洞
  • 【Linux】基本指令
  • 零基础学习性能测试-linux服务器监控:网络iftop
  • 【2025/07/19】GitHub 今日热门项目
  • Libevent(3)之使用教程(2)创建事件
  • Yakit与vps(vps为Linux使用教程)
  • 辛普森悖论
  • SLAM中的非线性优化-2D图优化之激光SLAM基于优化的前端匹配(十八)
  • 2023年CSP入门级第二轮第四题——旅游巴士
  • windows wsl2-06-docker hello world