木村と申します。
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やロケールなどの個人設定は全く同じ になっているはず。
正直なところ、何が原因で動作の違いが起きるのか、さっぱり判らず行き詰まっ ている状態なので、どんなことでもこれはという点がありましたら、指摘して いただけるとありがたいです。
よろしくお願いします。
--- 木村 康浩
野池です.
7398 ? Ss 0:00 ssh-agent -s
ps の出力で,7398 の前に空白文字があるからではないでしょうか. (桁数が異なる PID がある場合に,ps が空白文字でパディング表示している)
よい方法かどうかわかりませんが,
grep "^${SSH_AGENT_PID}.*ssh-agent"
を
grep "^.*${SSH_AGENT_PID}.*ssh-agent"
とするとマッチするようになるのではないでしょうか.
2020年6月1日(月) 8:42 Yasuhiro KIMURA yasu@utahime.org:
木村と申します。
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 mailing list debian-users@debian.or.jp https://lists.debian.or.jp/mailman/listinfo/debian-users
木村です。
From: Kenzi NOIKE knoike@gmail.com Subject: [debian-users 00656] Re: grepの振る舞いがホストによって異なる Date: Mon, 1 Jun 2020 09:07:41 +0900
7398 ? Ss 0:00 ssh-agent -s
ps の出力で,7398 の前に空白文字があるからではないでしょうか. (桁数が異なる PID がある場合に,ps が空白文字でパディング表示している)
おぉなるほど。言われてみればそのとおりですね。
よい方法かどうかわかりませんが,
grep "^${SSH_AGENT_PID}.*ssh-agent"
を
grep "^.*${SSH_AGENT_PID}.*ssh-agent"
とするとマッチするようになるのではないでしょうか.
確かにこれなら一致しますね。
ただこれが原因だとすると、CentOSやFreeBSDで問題が発生しない理由と、 Debianで問題が発生しないホストがある理由が謎ですが。
それはさておき、ひとまずこれで先に進むことが出来そうです。ご指摘ありが とうございました。
--- 木村 康浩