我正在使用运行 Debian Wheezy 7.4 的 Google Compute Engine。
最近我注意到一些奇怪的事情。例如,我可以执行sudo bash
。但是,从 root 角度,我无法执行sudo -u anotherUser bash
或su -l anotheruser -c bash
。
而且,更重要的是,我无法启动 GNU screen 的新实例。如果我尝试启动新实例,它会立即关闭,并且我会收到消息[screen is terminating]
。在正在运行的实例中,我无法启动更多窗口。
然后我发现了它们的共同点:bash
!
我可以做screen zsh
或screen sh
。
我可以先做sudo bash
然后sudo -u anotheruser zsh
或su -l anotheruser -s zsh
但不能su -l anotheruser -c zsh
。
请注意我是使用 bash 登录,然后我能可以sudo bash
。但是我不能将 bash 用于 root 用户sudo
或su
从 root 用户转换为其他用户,也不能将 bash 用于screen
shell。
我重启了。是的,这让我很担心,我实际上重启了服务器。
我不知道是什么原因造成的,我有点担心。
我的 bash 配置文件(据我所知它们与默认配置文件相比没有变化):
/etc/bash.bashrc
:http://pastebin.com/CsjeJBYd~/.bashrc
:http://pastebin.com/YfkAZUv9
bash 补全在主(登录)shell 上起作用。
以下是 Glenn Jackman 要求提供的信息:
$ md5sum /bin/bash /usr/bin/bash
144968564a6b1159ed82059920cea76f /bin/bash
md5sum: /usr/bin/bash: No such file or directory
$ getent passwd anotheruser
anotheruser:x:1004:1004::/home/anotheruser:/bin/bash
我还想到了另一个测试。这个有效:
$ echo $(bash -c 'echo Hello, World!')
这是怎么回事?
答案1
存在问题:
/usr/share/bash-completion/bash_completion
更具体地说,它是开头的那一行:
if [ "$0" != "-bash" ]; then exit; fi
该行检查当前 shell 是否为 bash。如果不是,则不使用 bash 补全。如果我删除该行,则尝试使用该[[
命令的某些脚本会出错。
这是我最终想到的办法:
isbash=no
case "$SHELL" in
*bash*) isbash=yes ;;
esac
case "$0" in
*bash*) isbash=yes ;;
esac
if [ "$isbash" = "no" ]; then exit; fi