これは、なにをしたくて書いたもの?
現在のシェルが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
環境変数の存在有無を確認しましょう。