hnwの日記

今のsshってargv[0]を見ないんですね

読者の皆様、御無沙汰しておりました。このところ会社のブログ「ディノオープンラボラトリ」というサイトを立ち上げて、記事をボチボチ書いておりました。個人ブログとの住み分けをどうするかで少し悩んでいますが、マニアックすぎる場合とCソースコードを貼り付ける場合はこちら、というルールでしばらくやってみます。


さて、そんなわけで「$HOME/.ssh/configを活用していますか?」という記事を会社のブログに書いたのですが、これに関連して調べたことを書きます。


私の記憶では、rlogin/rshコマンドは伝統的に「argv[0]の値が本来のコマンド名ではないときに、それをホスト名として解釈する」という機能を持っていたように思います。また、一時期までのsshもそんな機能を持っていたような気がします。ところが手元のOpenSSHで試してみると、今のsshコマンドはargv[0]を見なくなってしまったようです。


この挙動はいつ変わったのでしょうか。少し調べてみました。


OpenSSHの2.3.0p1のssh.cには下記のようなコードがあります。

        /* Save our own name. */
        av0 = av[0];

        /* Initialize option structure to indicate that no values have been set. */
        initialize_options(&options);

        /* Parse command-line arguments. */
        host = NULL;

        /* If program name is not one of the standard names, use it as host name. */
        if (strchr(av0, '/'))
                cp = strrchr(av0, '/') + 1;
        else
                cp = av0;
#ifdef HAVE_CYGWIN
        if (strcasecmp(cp, "rsh") && strcasecmp(cp, "ssh") &&
            strcasecmp(cp, "rlogin") && strcasecmp(cp, "slogin") &&
            strcasecmp(cp, "remsh") &&
            strcasecmp(cp, "rsh.exe") && strcasecmp(cp, "ssh.exe") &&
            strcasecmp(cp, "rlogin.exe") && strcasecmp(cp, "slogin.exe") &&
            strcasecmp(cp, "remsh.exe"))
#else
        if (strcmp(cp, "rsh") && strcmp(cp, "ssh") && strcmp(cp, "rlogin") &&
            strcmp(cp, "slogin") && strcmp(cp, "remsh"))
#endif
                host = cp;


この頃は確かにargv[0](main()の第二引数が**avなので、av[0]となっています)の値がコマンド名以外の場合にホスト名として解釈しています。HAVE_CYGWINかどうかで動作を変えるなど、涙ぐましい努力が見られます。


ところが、2.5.1p1ではこのようなコードが無くなっています。どういう心境の変化なのでしょうか、僕の想像では、上のようなコードを書くのがアホらしくなったのではないかと思います。


関連する情報が無いかどうか、ChangeLogから探してみました。

20010211
(略)
- markus@cvs.openbsd.org 2001/02/10 1:46:28
[ssh.c]
remove mapping of argv[0] -> hostname


だそうで、2.5.1p1のリリース直前に除去されたようですね。ChangeLogでは理由までは読み取れませんが、この機能が外れた理由をご存知の方は教えて頂けると嬉しいです。


以上、小ネタでした。ではまた。