木村と申します。
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やロケールなどの個人設定は全く同じ
になっているはず。
正直なところ、何が原因で動作の違いが起きるのか、さっぱり判らず行き詰まっ
ている状態なので、どんなことでもこれはという点がありましたら、指摘して
いただけるとありがたいです。
よろしくお願いします。
---
木村 康浩