[debian-users 00655] grepの振る舞いがホストによって異なる

Yasuhiro KIMURA yasu @ utahime.org
2020年 6月 1日 (月) 08:39:36 JST


木村と申します。

grepの振る舞いがホストによって異なる、という奇妙な問題が発生しており、
その原因が判らなくて困っているので相談させてください。

私はログインシェルとしてzshを使っているのですが、最近.zloginに以下のコー
ドを追加しました

----------------------------------------------------------------------
01: setup_ssh-agent () {
02:    local savedir=${HOME}/.ssh/ssh-agent
03:    local savefile=${savedir}/$(hostname -s)
04:
05:    if [ ! -d ${savedir} ]
06:    then
07:        mkdir -p ${savedir}
08:        chmod 700 ${savedir}
09:    fi
10:    if [ ! -f ${savefile} ]
11:    then
12:        ssh-agent -s > ${savefile}
13:        chmod 600 ${savefile}
14:        eval $(cat ${savefile}) > /dev/null
15:        ssh-add
16:    else
17:        eval $(cat ${savefile}) > /dev/null
18:    fi
19:    if ! ps gxwww | grep "^${SSH_AGENT_PID}.*ssh-agent" > /dev/null 
20:    then
21:        ssh-agent -s > ${savefile}
22:        chmod 600 ${savefile}
23:        eval $(cat ${savefile}) > /dev/null
24:        ssh-add
25:    fi
26: }
27:
28 setup_ssh-agent
----------------------------------------------------------------------

このコードの意図は、

* ログインした時にssh-agentが動いていなければ、ssh-agentを起動して鍵を
  追加する
* 既に動いている場合には、環境変数SSH_AGENT_PIDとSSH_AUTH_SOCKの値を既
  に動いているものに合わせて設定する

です。

それで、CentOSやFreeBSDのホストではこのコードが意図通りに動いているの
ですが、Debianだと、あるホストでは意図通りに動くが、別のホストでは意図
通りに動かない、という問題が発生しています。

そこで何が起こっているのかを調査した結果、↑のコードの19行目の

ps gxwww | grep "^${SSH_AGENT_PID}.*ssh-agent"

の振る舞いがホストによって異なることが判りました。

正常に動作するホストでは、

----------------------------------------------------------------------
yasu @ kusanagi[2007]% type grep
grep is /bin/grep
yasu @ kusanagi[2008]% echo $SSH_AGENT_PID
29943
yasu @ kusanagi[2009]% ps gxwww
  PID TTY      STAT   TIME COMMAND
29920 ?        Ss     0:00 /lib/systemd/systemd --user
29921 ?        S      0:00 (sd-pam)
29943 ?        Ss     0:00 ssh-agent -s
29974 ?        SLs    0:00 /usr/bin/gpg-agent --supervised
30104 ?        S      0:00 sshd: yasu @ pts/0
30105 pts/0    Ss     0:00 -zsh
31491 pts/0    R+     0:00 ps gxwww
yasu @ kusanagi[2010]% ps gxwww | grep "^${SSH_AGENT_PID}.*ssh-agent"
29943 ?        Ss     0:00 ssh-agent -s
yasu @ kusanagi[2011]%
----------------------------------------------------------------------

のように、SSH_AGENT_PIDで指定されたssh-agentのプロセスが存在する場合に
は、psの出力のそのプロセスの行が、grepの検索に一致するのですが、正常に
動作しないホストでは、

----------------------------------------------------------------------
yasu @ samidare[2009]% type grep
grep is /bin/grep
yasu @ samidare[2010]% echo $SSH_AGENT_PID
7398
yasu @ samidare[2011]% ps gxwww
  PID TTY      STAT   TIME COMMAND
 7373 ?        Ss     0:00 /lib/systemd/systemd --user
 7374 ?        S      0:00 (sd-pam)
 7398 ?        Ss     0:00 ssh-agent -s
28962 ?        S      0:00 sshd: yasu @ pts/0
28963 pts/0    Ss     0:00 -zsh
30026 pts/0    R+     0:00 ps gxwww
yasu @ samidare[2012]% ps gxwww | grep "^${SSH_AGENT_PID}.*ssh-agent"
yasu @ samidare[2013]% 
----------------------------------------------------------------------

のように、psの出力のssh-agentのプロセスの行が、grepの検索に一致しませ
ん。

なお、双方のホストについて言えることは以下のとおりです。

* OSは双方ともDebian 10 amd64
* インストールされているパッケージは異なる
* 双方ともunattended-upgradesをインストールしているので、Debian 10の最
  新バージョンになっていると言えるはず
* Zshの設定ファイル(.zlogin,.zlogout.zshenv,.zshrc)については、双方で
  全く同じものを使っているので、PATHやロケールなどの個人設定は全く同じ
  になっているはず。

正直なところ、何が原因で動作の違いが起きるのか、さっぱり判らず行き詰まっ
ている状態なので、どんなことでもこれはという点がありましたら、指摘して
いただけるとありがたいです。

よろしくお願いします。

---
木村 康浩


debian-users メーリングリストの案内