if [ "$psopts" = "FAIL" ]
then
echo : unable to use "ps" to scan for ssh-agent processes.
Report KeyChain version and echo system configuration to drobbins@gentoo.org.
exit 1
fi
mypids=`ps $psopts 2>/dev/null | grep "[s]sh-agent" | awk '{print }'` > /dev/null 2>&1
为了确保我们能同时使用 System V 和 BSD 样式的 ps 命令,脚本试着运行 ps uxw,而丢弃任何输出。如果这个命令的错误码为零,那么我们知道 ps uxw 正常工作,并且我们正确地设置了 psopts 值。但是,如果 ps uxw 返回一个非零的错误码(指出我们需要使用 BSD 样式的选项),那么我们试着运行 ps -u `whoami` -f,并再次丢弃了任何输出。此时,我们有希望发现可以使用的 ps 是 BSD 的变体还是 System V 的变体。如果我们不知道答案,那么打印出错误并退出。但是很有可能这两个 ps 命令中的一个工作正常,在这样的情况下,执行上面代码段的最后一行,即 ps 管线。通过紧跟在 ps 后面使用 $psopts 变量扩展,我们能将正确的选项传送给 ps 命令。
ps 管线还包含一个 grep,它的确是一个宝物,是 Hans Peter Verne 好心发给我的。 请注意 grep -v grep 不再是管线的一部分;实际上它已经被除去并且 grep "ssh-agent" 已经改为 grep "[s]sh-agent"。这样一个 grep 命令最后执行与 grep ssh-agent | grep -v grep 相同的操作;您知道为什么吗?
清单 10. 简洁的 grep 诀窍
mypids=`ps $psopts 2>/dev/null | grep "[s]sh-agent" | awk '{print }'` > /dev/null 2>&1
是不是有点困惑?如果您确定 grep "ssh-agent" 和 grep "[s]sh-agent" 应匹配完全相同的文本行的话,那么您是正确的。所以当 ps 的输出通过管道输送给它们时,为什么它们生成不同的结果呢?这里是它的工作原理:当使用 grep "[s]sh-agent" 时,您更改了 grep 命令在 ps 进程列表中显示的方式。通过这样做,防止 grep 与它本身相匹配,因为 [s]sh-agent 字符串与 [s]sh-agent 正则表达式不匹配。那样不是很完美吗?如果您仍不太明白,请用一下 grep,您很快就会明白了。
结束语
本专栏文章对讨论的 OpenSSH 作出了结论。希望您已经学到了有关 OpenSSH 的很多知识,足以开始使用 OpenSSH 来保护您系统的安全。
参考资料
“通用线程:OpenSSH 密钥管理,第 1 部分”(developerWorks,2001 年 7 月)涵盖了 RSA/DSA 认证。
“通用线程:OpenSSH 密钥管理,第 2 部分”(developerWorks,2001 年 9 月)介绍了 ssh-agent 和 keychain。
在 Gentoo Linux Keychain 页面上可以获得 keychain 的最新版本。
请务必访问 OpenSSH 的开发主页,并查阅 OpenSSH 常见问题解答。
您可以从 Openbsd.org 下载最新的 OpenSSH 源码 tarball 和 RPM。
PuTTY 是用于 Windows 机器上的一个出色的 ssh 客户程序。
“SSH, The Secure Shell: The Definitive Guide”(O'Reilly & Associates,2001)一书可能会对您有帮助。作者的网站上有关于这本书、常见问题解答、新闻和更新等信息。
请访问 Slashdot,获取“面向初学者的新闻和其它相关内容”。
请查阅 Freshmeat,在开放源码包的新发行版出现时它就列出来它们。
请浏览 developerWorks 上更多 Linux 参考资料。
请浏览 developerWorks 上更多开放源码资料。
关于作者