当通过 SSH 连接到 RHEL 系列主机(例如 Fedora、CentOS 或实际的 RHEL)时,我不断遇到 shell 行为问题。我似乎只有在通过 SSH 连接到这个 Linux 发行版系列时才会遇到这些问题,我承认这真是令人沮丧,我打算在做出选择时完全停止使用它们。
不良行为是明显无法识别终端行的开头,这使得修改以前使用的命令以及其他问题变得非常困难。
我过去检查过一些诊断内容,包括确认 $TERM 在 SSH 客户端和主机上匹配。在下面的演示中两者使用相同的:
nborgers@Persons-Laptop ~ % echo $TERM
xterm-256color
nborgers@Persons-Laptop util % ssh gateway -t 'bash -ic "echo $TERM"'
xterm-256color
Connection to 10.212.100.192 closed.
在此演示中,我的客户端是 MacOS,但从 WSL(因此是 Linux VM)进行 SSH 时也遇到了同样的问题。
应用公认的解决方案:这是我做错的事情,与我的 Ansible 剧本不同:
nborgers@Persons-Laptop host-config-as-code % git diff --ignore-space-at-eol
diff --git a/ssh/terminal_colors.yaml b/ssh/terminal_colors.yaml
index 6751809..33bb779 100644
--- a/ssh/terminal_colors.yaml
+++ b/ssh/terminal_colors.yaml
@@ -12,6 +12,6 @@
lineinfile:
path: /etc/bashrc
state: present
- line: 'export PS1="\e[0;{{ color }}m[\u@\h \W]\$ \e[m "'
+ line: 'export PS1="\[\033[01;{{ color }}m\]\u@\h \[\033[0m\]\W $ "'
when: ansible_os_family == 'RedHat'
我显然是通过一些着色配置给自己造成了这种情况。我仍然觉得我在没有这样做过的机器上看到过这个问题,但我无法再重现这个问题了。
答案1
演示中行为的常见原因是提示字符串包含未正确指定为非打印字符的终端控制字符串(例如,包含在\[
... \]
in 内bash
,或在%{
... %}
in 内zsh
,以及其他中的类似方法)贝壳)。
与 不同的是bash
,zsh
它已经内置了提示颜色转义码,会自动算作非打印,因此您可能不知道其他 shell 中需要这样的外壳。
因此,shell 将错误计算提示字符串占用了多少个可见字符单元,从而导致在光标何时应换行到下一行或在换行的命令行上向后移动时返回上一行时出现混乱。
您应该检查您的$PS1
或$PROMPT
定义,并确保未直接记录在相应 shell 的手册页上的任何非打印字符序列都以适当的依赖于 shell 的方式包含在内。