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

相关文章:

  • Zara和网易云音乐仿写总结
  • 【c++】提升用户体验:问答系统的交互优化实践——关于我用AI编写了一个聊天机器人……(12)
  • 使用 Gunicorn 部署 Django 项目
  • AI编程工具对比:Cursor、GitHub Copilot与Claude Code
  • Oracle Database 23ai 技术细节与医疗 AI 应用
  • Lock4j 使用说明
  • 【Linux服务器】-mysql数据库数据目录迁移
  • 安全事件响应分析--基础命令
  • 【机器学习深度学习】为什么要将模型转换为 GGUF 格式?
  • [MarkdownGithub] 使用块引用高亮显示“注意“和“警告“和其他注意方式的选项
  • 删除debian xdm自启动ibus的配置项
  • Private Equity(PE)Investment Banking(IB)
  • 拉普拉斯方程极坐标解法
  • 万字解析LVS集群
  • CAN通信驱动开发注意事项
  • Django母婴商城项目实践(六)- Models模型之ORM操作
  • undefined reference to ‘end‘
  • webstorm的内置命令行工具没办法使用了怎么办
  • CSS-in-JSVue的解决方案
  • 深入理解DNS原理与服务的详细配置
  • 传统行业和AIGC的结合及应用
  • 计算机视觉:AI 的 “眼睛” 如何看懂世界?
  • 让 Windows 用上 macOS 的系统下载与保姆级使用教程
  • Spring Cloud Gateway与Envoy Sidecar在微服务请求路由中的架构设计分享
  • 云服务器磁盘IO性能优化的测试与配置方法
  • 大模型 Function Call 的实现步骤及示例详解
  • 6 STM32单片机的智能家居安防系统设计(STM32代码+手机APP设计+PCB设计+Proteus仿真)
  • 【Qt开发】Qt的背景介绍(三)-> 认识Qt Creator
  • 【C# in .NET】20. 探秘静态类:抽象与密封的结合体
  • 数学建模:运筹优化类问题