如何确定我是否通过 SSH 登录?

t6d*_*t6d 18 linux ssh shell

我目前正在设置一个相当复杂的 bash 配置,它将在多台机器上使用。我试图找出是否可以确定我是通过 SSH 登录还是在本地计算机上登录。例如,通过这种方式,我可以根据该事实设置一些别名。就像别名一样haltrestart因为停止远程服务器可能不是最好的做法。

到目前为止我所知道的是,环境变量SSH_CLIENT是在我通过 ssh 登录时设置的。不幸的是,当我使用sudo -s. 我也知道我可以向 sudo 传递一个参数,指示 sudo 将我所有的环境变量复制到新的 shell 环境中,但是如果我不想这样做,还有其他方法吗?

fac*_*cha 15

您可以使用“w”或“who”命令输出。当您通过 ssh 连接时,他们会显示您的源 IP。

  • 使用“我是谁”。 (6认同)
  • @PaulTomblin 实际上,您可以将 `who` 与任意两个额外参数一起使用。“我是谁”与“我是谁”或“谁很棒”或“谁是土豆土豆”相同。我发现一个有点有趣的事实。 (4认同)
  • 这个问题似乎与从“我是谁”中提取它更相关,这样你就可以从那里确定你是否正在使用 SSH。这有效:`hostname=$(我是谁 | cut -f2 -d\( | cut -f1 -d:)` (2认同)

小智 11

这是我在unix.stackexchange 上找到的一个很好的答案:


  • 如果定义了其中一个变量SSH_CLIENTor SSH_TTY,则它是一个 ssh 会话。
  • 登录 shell 的父进程可以用ps -o comm= -p $PPID. 如果是sshd,则是 ssh 会话。
if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then
  SESSION_TYPE=remote/ssh
else
  case $(ps -o comm= -p $PPID) in
    sshd|*/sshd) SESSION_TYPE=remote/ssh;;
  esac
fi
Run Code Online (Sandbox Code Playgroud)


Ign*_*ams 6

您可以添加SSH_*到其中env_keepsudoers以便在切换到其他用户时可以检测到这一点。


And*_*ter 5

我认为你想重新思考你思考问题的方式。问题不是“我是通过 SSH 登录的,因为我想关闭某些命令”。它是“我是否在控制台登录,因为那时我将启用某些命令。”