rust实现的快捷补全到剪贴板的实用工具
最近在兼职项目中老是遇到这样的场景:
- 在云服务器之间通过scp命令传输文件,密码太长记不住(客户服务器不方便ssh-copy-id)
- 在服务器上使用mysql命令登录修改数据,数据库密码太长记不住(客户设置的密码,直接改掉哈?)
- 自己电脑使用gemini cli需要代理,代理命令太长记不住 (简单的放入脚本中不能生效)
之前的做法都是记录到本地记事本,然后打开记事本找到对应的密码再复制到剪贴板,
但是这样太麻烦了,而且容易出错(因为有些密码有特殊字符,所以容易拷贝不全)。
整理下我的需求:
这样的效率太低了,所以我决定写一个工具,能满足我前面的需求。
- 命令行执行程序,因为要高效,我开机第一个打开的程序是iterm哈。
- 命令方便记忆,就叫yucopy,缩写那就是yc。
- 输入一个参数,就能得到对应的密码等值
- 参数支持快捷补全
- 执行完后密码等信息能自动保存到剪贴板
我的解决方案:
- 我的高效流程是用fish shell,参数补全使用fish shel的方案。
- 最近在复习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了。