Pat*_*ick 9 bash emacs vi readline
我的团队负责数以千计的 Linux/Unix 机器,因此 root 帐户自然会在管理员之间“共享”。我更喜欢vi模式,其他人更喜欢emacs模式。
如何在 SSH 登录到任何机器时将 bash 的 readline 设置为 vi 模式,而不强制其他人也使用 vi 模式?
从本质上讲,希望set -o vi在登录后不必每次都输入它,并且不强迫其他人使用它(就像 emacs 模式对我来说很烦人一样,vi 模式对他们来说很烦人)。
我知道如果每个人都使用自己的 sudo 帐户来执行特权命令,这不会成为问题,但是由于我无法控制的情况,这很遗憾不是一个选项。
这是一种愚蠢的方法,它实际上只适用于公钥身份验证:
首先,确保您的本地计算机已nc安装。
其次,仍然在您的本地计算机上,制作一个脚本(我将其称为connect-to-server)并将其放在您${PATH}知道的地方*:
#!/bin/sh
# connect-to-server
ssh -q server-hostname "touch .yourname" </dev/null >/dev/null 2>&1
nc server-hostname 22
Run Code Online (Sandbox Code Playgroud)
接下来,修改.bashrc远程系统上的以包含某处:
# partial .bashrc
if [ -f "${HOME}/.yourname" ]; then
rm "${HOME}/.yourname"
set -o vi
fi
Run Code Online (Sandbox Code Playgroud)
最后,回到本地计算机,编辑~/.ssh/config添加:
# partial ssh config
Host serverNickname
Hostname server-hostname
ProxyCommand connect-to-server
Run Code Online (Sandbox Code Playgroud)
这种方法的缺点(以及为什么我称其为愚蠢):
.yourname文件有可能尚未被删除,在这种情况下他们也会得到该文件set -o vi。ssh serverNickname command,那么command将运行,但是(因为.bashrc从未获取来源).yourname文件仍然存在,因此在您的 ssh 配置中使用第二个不使用伪代理的别名是礼貌的。事实上,这种方法的唯一优点是您的ssh命令不需要提供任何额外的参数。
*如果您不想更改远程系统上的任何内容,可以使用另一种伪代理来创建临时代理.bashrc:
#!/bin/sh
# connect-to-server
ssh -q server-hostname 'ln .bashrc .bashrc.real; cat .bashrc.real <(printf "set -o vi; ln -f .bashrc.real .bashrc\n") >.bashrc.yourname; ln -f .bashrc.yourname .bashrc' </dev/null >/dev/null 2>&1
nc server-hostname 22
Run Code Online (Sandbox Code Playgroud)
这与其他方法具有相同的缺点,因此您仍然需要在ssh配置中使用第二个不调用伪代理的别名。