![如何确定我是否通过 SSH 登录?](https://linux22.com/image/526260/%E5%A6%82%E4%BD%95%E7%A1%AE%E5%AE%9A%E6%88%91%E6%98%AF%E5%90%A6%E9%80%9A%E8%BF%87%20SSH%20%E7%99%BB%E5%BD%95%EF%BC%9F.png)
我目前正在设置一个相当复杂的 bash 配置,该配置将在多台机器上使用。我试图找出是否可以确定我是通过 SSH 还是在本地机器上登录。这样,我可以根据这一事实设置一些别名。比如别名halt
为restart
停止远程服务器可能不是最好的选择。
到目前为止,我知道的是,SSH_CLIENT
当我通过 ssh 登录时,环境变量已设置。不幸的是,当我使用 启动超级用户 shell 时,此变量会被丢弃sudo -s
。我还知道我可以将一个参数传递给 sudo,指示 sudo 将我的所有环境变量复制到新的 shell 环境,但如果我不想这样做,还有其他方法吗?
答案1
您可以使用“w”或“who”命令输出。当您通过 ssh 连接时,它们将显示您的源 IP。
答案2
这是我在unix.stackexchange:
- 如果定义了其中一个变量
SSH_CLIENT
或,则它是一个 ssh 会话。SSH_TTY
- 可以使用 检查登录 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
答案3
您可以添加SSH_*
到env_keep
,sudoers
以便在切换到其他用户时可以检测到这一点。
答案4
是的,正如其他人指出的那样,该信息存在于输出中括号中的您的 IP 中who am i
。
您可以使用 Bash 正则表达式来检测它:
if [[ $(who am i) =~ \([0-9\.]+\)$ ]]; then echo SSH; else echo no; fi