当前位置: 首页 > 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.lryc.cn/news/593389.html

相关文章:

  • 汽车ECU控制器通信架构
  • 解决问题七大步骤
  • 论文reading学习记录4 - weekly - 视觉端到端开创-LOAM
  • [spring6: Advice Advisor Advised]-快速理解
  • Leetcode 05 java
  • Linux --进程信号
  • 本地部署开源的 AI 驱动的搜索引擎 Perplexica 并实现外部访问
  • FreeRTOS学习笔记之软件定时器
  • 访问 gitlab 跳转 0.0.0.0
  • 【主讲嘉宾揭幕】2025第二届机电一体化、机器人与控制系统国际会议(MRCS2025)
  • [MarkdownGithub] 使用块引用高亮显示“注意“和“警告“和其他注意方式的选项
  • 如何优雅调整Doris key顺序
  • HTTP与HTTPS技术细节及TLS密钥交换与证书校验全流程
  • springboot基础-demo
  • 【iOS】ZARA仿写
  • linux板远程操控——todesk
  • Matplotlib和Plotly知识点(Dash+Plotly分页展示)
  • Typecho博客评论无限滚动加载实现指南
  • windows wsl ubuntu 如何安装 maven
  • 算法题(175):小明的游戏
  • Github Actions Workflows 上传 Dropbox
  • Visual Studio Code(VSCode)中设置中文界面
  • 11.1Redis高可用集群部署
  • Elastic Search 8.x 分片和常见性能优化
  • PHP 就业核心技能速查手册
  • windows docker-01-desktop install windows10 + wls2 启用
  • LangGraph教程6:LangGraph工作流人机交互
  • 博图SCL语言中常用运算符使用详解及实战案例(下)
  • LangGraph教程10:LangGraph ReAct应用
  • Python Pandas读取Excel表格中数据并根据时间字段筛选数据