对于简单的客户端解决方案:
alias connect='ssh -t root@server "bash -o vi"'
如果根的外壳初始化脚本显式使用set -o emacs
或设置EDITOR
为emacs
,或者根的.initrc
文件调用emacs
键绑定,则此操作将失败。
该答案的其余部分与服务器端解决方案有关。
当您ssh
进入机器然后使用时,此方法有效sudo -i
:
为您/root/.bashrc
:
if [[ -n "$SUDO_USER" ]] && [[ -f /root/.bashrc-"$SUDO_USER" ]]; then
source /root/.bashrc-"$SUDO_USER"
fi
这使您可以拥有一个bashrc
名为的个人文件/root/.bashrc-patrick
,您可以在其中进行任何喜欢的操作,例如set -o vi
。
结合一些天真的方法来选择rc文件,具体取决于$SSH_CLIENT
:
if [[ -n "$SUDO_USER" ]]; then
person="$SUDO_USER"
elif [[ -n "$SSH_CLIENT" ]]; then
case "$SSH_CLIENT" in
192.168.216.100*) person="joe" ;;
192.168.216.120*) person="patrick" ;;
192.168.216.150*) person="lindsey" ;;
esac
fi
if [[ -n "$person" ]] && [[ -f /root/.bashrc-"$person" ]]; then
source /root/.bashrc-"$person"
fi
显然,这仅在您始终从同一IP地址进行连接时才有效...
另一种使用您正在使用的特定SSH密钥的注释字段的方法,如果将SSH代理转发到服务器,该方法将起作用:
ssh_comment="$( ssh-add -L | grep -f /root/.ssh/authorized_keys | awk '{ print $NF '} | head -n 1 )"
这将为您用来连接到服务器的密钥挑选注释字段。在head -n 1
有万一你碰巧有几个在你的钥匙的authorized_keys
文件。
然后,您可以$ssh_comment
直接使用$SUDO_USER
上面的方法(如果其中的注释$ssh_comment
是路径名,则注释中的注释可能需要进行一些清理)或通过case
与该$SSH_CLIENT
方法相同的语句来选择一个rc文件作为源。
set -o vi
在让我控制外壳程序之前,默默执行了一些黑暗的OpenSSH魔术。