最近在兼職項目中老是遇到這樣的場景:
- 在云服務器之間通過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了。