$0 和 $SHELL 之间的区别?

$0 和 $SHELL 之间的区别?

我目前正在OverTheWire网站玩CTF。我被困在第 32 级 [ https://overthewire.org/wargames/bandit/bandit33.html ] 来获取下一个级别的密码。访问级别 32 的命令 -密码为。ssh [email protected] -p 222056a9bf19c63d650ce78e6ec0354ee45e

所以当我登录时,我得到了一个名为 UPERCASE SHELL 的 shell。它接受命令并将它们转换为大写,抛出“命令未找到错误”。当我运行 $SHELL 时,我只能看到一个名为“WELCOME TO UPPERCASE SHELL”的横幅。所以我在被困了 3 个小时后用谷歌搜索了演练。所以其中一个人输入了 0 美元,这将他带到了 Bourne Shell [我猜]。那么 $0 和 $SHELL 之间有什么区别?

据我了解 $SHELL 是默认 shell [UPPERCASE_SHELL],我在运行后验证了它cat /etc/paswd | grep bandit32。那么 $0 是什么?如果 $0 是当前 shell,那么我应该得到与输出相同的横幅[UpperCase]。我怎么登陆了 Bourne Shell。

底线。这两个 shell 变量是什么?它们在这种情况下如何工作?

答案1

$SHELL是一个有趣的变量。对于大多数 shell,它包含您的名称登录外壳(您可以在 /etc/passwd 中看到这一点)。如果您启动不同的 shell 解释器,它不会自动更改。

例如,我的登录 shell 是fish。让我们看看不同的 shell 如何处理$SHELL

$ set -e SHELL; bash -c 'echo $SHELL'
/usr/local/bin/fish
$ set -e SHELL; ksh -c 'echo $SHELL'
/bin/sh
$ set -e SHELL; zsh -c 'echo $SHELL'

$ set -e SHELL; dash -c 'echo $SHELL'

$ set -e SHELL; fish -c 'echo $SHELL'

set -e var是fish 重置变量的方式。

  • bash 将 SHELL 设置为我的登录 shell。
  • ksh 使用默认 shell。
  • zsh、dash 和fish 对SHELL 没有特殊含义。

所以,$SHELL只是提供信息最好。我不会依赖它具有任何魔法价值。


SHELL 的值实际上由login,shell 被调用。来自我的 Mac 上的 (BSD)login手册:

登录实用程序将信息输入环境(参见 environ(7)),指定用户的主目录 (HOME)、命令解释器 (SHELL)、搜索路径 (PATH)、终端类型 (TERM) 和用户名(LOGNAME 和 USER)。

答案2

$SHELL应该告诉你 shell 名称 - 请参阅格伦的回答应该如何模糊地考虑该变量。

$0是当前脚本的名称。

编写一个 shell 脚本,test.sh如下所示:

#!/bin/bash
echo My shell is $SHELL
echo My script is called $0

看看运行它时会发生什么。更改 shebang#!/bin/zsh不会改变结果。再次参见格伦的回答。

至于你的游戏:可能会发生任何事情。它可能只是游戏的一些模拟外壳或任何模拟游戏元素。没有人能说清楚。

相关内容