如何将ARM设备SSH命令历史存储至本地并支持快捷键调用?
解决SSH连接无持久化设备的命令历史本地存储问题
当然可以!针对这种远程设备无法保存命令历史的情况,有几个非常实用的自动化方案,能让你像使用本地shell一样用^R、上下方向键调用之前的命令,完全不用手动存记事本:
方案1:通过SSH会话实时同步命令历史到本地文件
这个方法不需要额外安装工具,只需要修改本地的bash配置,让远程执行的命令自动追加到本地的历史文件中,同时还能在本地shell中调用这些历史。
步骤如下:
- 在本地的
~/.bashrc(如果用zsh就是~/.zshrc)里添加一个自定义的ssh函数:
ssh-arm() { # 替换成你的远程设备用户名和地址 local REMOTE="user@your-arm-device" # 本地存储远程历史的文件路径 local HIST_FILE="$HOME/.ssh/arm_remote_history" # 先把之前的远程历史加载到本地shell中 history -r "$HIST_FILE" # 连接远程设备,设置PROMPT_COMMAND让每次命令执行后把历史输出到stdout ssh -t "$REMOTE" 'export PROMPT_COMMAND="history -a > /dev/stdout; $PROMPT_COMMAND"; bash' | tee -a "$HIST_FILE" # 退出后把本地最新的历史保存(可选) history -a }
- 重新加载bash配置:
source ~/.bashrc - 之后用
ssh-arm命令连接远程设备,所有执行过的命令都会自动存在~/.ssh/arm_remote_history里,本地shell可以通过^R搜索、上下键翻找这些历史,下次连接时也会自动加载之前的记录。
优点:零额外依赖,配置简单,完全自动化;缺点:只能针对特定设备,需要单独定义别名/函数。
方案2:用SSHFS挂载本地目录到远程,让远程历史直接存在本地
这个方法更“透明”,远程shell会像使用本地历史文件一样把命令存在你的电脑上,不需要修改shell的行为逻辑。
步骤如下:
- 本地安装SSHFS(Linux用户:
sudo apt install sshfs;macOS用户可以用brew安装:brew install sshfs) - 本地创建一个存储远程历史的目录:
mkdir -p ~/.remote/arm_history - 把本地目录挂载到远程设备的临时目录(因为远程无持久化,临时目录重启会清空,但挂载后实际指向本地):
sshfs user@your-arm-device:/tmp/remote_hist ~/.remote/arm_history
- 连接远程设备时,指定历史文件为挂载目录里的文件:
ssh -t user@your-arm-device 'export HISTFILE=/tmp/remote_hist/.bash_history; export HISTSIZE=10000; export HISTFILESIZE=10000; bash'
你可以把这条命令做成别名加到~/.bashrc里,方便调用。
优点:远程使用体验和普通shell完全一致,历史会自动保存到本地;缺点:需要安装SSHFS,每次重启远程设备后需要重新挂载(可以写个脚本自动完成)。
方案3:利用本地终端的会话录制功能提取命令历史
如果上面的方法都不想用,还可以用script命令在本地录制整个SSH会话,之后提取出命令部分追加到本地历史:
- 启动会话录制:
script -c 'ssh user@your-arm-device' ~/.ssh/arm_session.log - 正常操作远程设备,退出后录制文件会保存在
~/.ssh/arm_session.log - 提取命令并追加到本地历史:
grep -E '^[^ ]' ~/.ssh/arm_session.log | grep -v 'script started' | grep -v 'script ended' >> ~/.bash_history
然后用history -r重新加载历史即可。
优点:不需要修改远程和本地的shell配置;缺点:需要手动提取命令,不如前两个方案自动化。
这些方案都能完美解决你的问题,不用再手动复制命令到记事本啦!
内容的提问来源于stack exchange,提问作者Artalus
相关产品推荐
相关产品推荐

