CLOVER🍀

That was when it all began.

SSHでログインしていることを判定するには、SSH_CONNECTION環境変数を見ればよいという話

これは、なにをしたくて書いたもの?

現在のシェルがSSHでリモートログインして起動したものかどうか、判定する方法はないのかな?と思って調べてみたのですが。

SSH_CONNECTIONという環境変数が設定されているかを見ればよいみたいです。

SSH_CONNECTION環境変数

sshコマンドのmanページに記載がありました。

SSH_CONNECTION環境変数には、クライアントとサーバーを識別する値が格納されます。具体的にはクライアントのIPアドレス、
ポート、サーバーのIPアドレス、ポートです。

SSH_CONNECTION

Identifies the client and server ends of the connection. The variable contains four space-separated values: client IP address, client port number, server IP address, and server port number.

Ubuntu Manpage: ssh — OpenSSH remote login client

確認してみる

実際に確認してみましょう。

環境はこちら。

$ ssh -V
OpenSSH_8.9p1 Ubuntu-3, OpenSSL 3.0.2 15 Mar 2022


$ sshd -V
unknown option -- V
OpenSSH_8.9p1 Ubuntu-3, OpenSSL 3.0.2 15 Mar 2022
usage: sshd [-46DdeiqTt] [-C connection_spec] [-c host_cert_file]
            [-E log_file] [-f config_file] [-g login_grace_time]
            [-h host_key_file] [-o option] [-p port] [-u len]

SSHでログインしている場合。

$ env | grep SSH
SSH_CONNECTION=192.168.121.1 34220 192.168.121.14 22
SSH_CLIENT=192.168.121.1 34220 22
SSH_TTY=/dev/pts/0

SSHでログインしていない場合。

$ env | grep SSH

ソースコードを見ると、このあたりですね。

 /* SSH_CLIENT deprecated */
    snprintf(buf, sizeof buf, "%.50s %d %d",
        ssh_remote_ipaddr(ssh), ssh_remote_port(ssh),
        ssh_local_port(ssh));
    child_set_env(&env, &envsize, "SSH_CLIENT", buf);

    laddr = get_local_ipaddr(ssh_packet_get_connection_in(ssh));
    snprintf(buf, sizeof buf, "%.50s %d %.50s %d",
        ssh_remote_ipaddr(ssh), ssh_remote_port(ssh),
        laddr, ssh_local_port(ssh));
    free(laddr);
    child_set_env(&env, &envsize, "SSH_CONNECTION", buf);

https://github.com/openssh/openssh-portable/blob/V_8_9_P1/session.c#L1164-L1185

SSH_CLIENTという環境変数も近い値が入っていますが、こちらは非推奨のようです。

というわけで、SSHでのログイン時のみなにかをしたいといった時には、SSH_CONNECTION環境変数の存在有無を確認しましょう。