回显来自不同用户的变量时出现奇怪的输出

回显来自不同用户的变量时出现奇怪的输出
$ sudo su - user1 -c 'echo $DOMAIN_HOME'
/app/user1/DOMAINHOME

这看起来不错,对吧?然而,让我们更深入地挖掘一下:

$ sudo su - user1 -c 'echo $DOMAIN_HOME' | tee test.out
$less test.out

ESC]P0000000ESC]P8A9A9A9ESC]P1DC143CESC]P9FF0000ESC]P2008000ESC]PA00FF00ESC]P3aa9943ESC]PBFFD700ESC]P41E90FFESC]PC87CEFAESC]P5706c9aESC]PD826ab1ESC]P6FFA500ESC]PEF0F8FFESC]P7FFFFFFESC]PFFFFFFFESC[HESC[2JESC[HESC[2J/app/user1/DOMAINHOME

这导致我的脚本失败。

它们是来自 .bashrc 的颜色代码,.bashrc 为 xterm 提供颜色。经过一些研究后,最后一部分[HESC[2JESC[HESC[2J]是在输出路径之前清除终端的内容。

我一直在绞尽脑汁试图找出这些现象出现的原因。有任何想法吗?

注意:当以 user1 身份登录时,它会很好地回显该变量。

答案1

由于您使用的是“su -”,正在执行的 shell 假装是一个登录 shell(执行系统的/etc/profile、用户的配置文件,例如.profile.bash_profile等)。这些脚本之一是生成转义序列(字符串Esc]P)并将结果打印到标准输出。它不应该这样做。

它应该做的是检查 shell 是否是交互式的,并且然后——只有那时! -- 它应该生成转义序列。

检查交互式 shell 的最佳方法是检查“$-”的值并查看它是否包含该字母i- 如果包含,则 shell 是交互式的,如果不包含,则 shell 不是。我通常使用这样的东西:

case "$-" in
*i*)  # Here if the shell is interactive
      ;;
*)    # Here otherwise
      ;;
esac

您需要确定是什么生成了该转义序列。常见的罪魁祸首是echotput和 以及其他应该修改终端设置的命令。我做了一些谷歌搜索,但找不到那个特定的转义序列,所以我无法提供任何关于在哪里/寻找什么的线索。

当然,你为什么要使用su -?只需使用sudo -u user1并消除额外的步骤(user1尽管您的要求可能包括执行 .profile ;我不知道,您也没有说)。

相关内容