【发布时间】:2009-05-07 18:34:04
【问题描述】:
我在 unix 机器上有一个文本文件,其中包含有人可能用来连接它的 SSH 用户名和密码。
如何使用 Java 验证用户名和密码是否有效?
我是否尝试使用 Runtime.exec() 通过 SSH 连接到同一台机器?
我可以 grep 为用户 /etc/passwd。但是,密码是隐藏的。
如果有任何建议,我将不胜感激。
【问题讨论】:
标签: java unix authentication ssh
我在 unix 机器上有一个文本文件,其中包含有人可能用来连接它的 SSH 用户名和密码。
如何使用 Java 验证用户名和密码是否有效?
我是否尝试使用 Runtime.exec() 通过 SSH 连接到同一台机器?
我可以 grep 为用户 /etc/passwd。但是,密码是隐藏的。
如果有任何建议,我将不胜感激。
【问题讨论】:
标签: java unix authentication ssh
也许问题可以扩大到“验证来自 Java 的 UNIX 凭据”,因为所解释的机制并不是真正依赖于 ssh。
这是我在不使用网络堆栈开销的情况下作为更好的类似 Expect 的替代方案(例如使用 ProcessBuilder)的镜头:
su -u username -c echo
只需检查退出状态即可知道答案。 (加分项:su 存在于所有 UNIX 操作系统上,它甚至可能位于 PATH 上,并且对于 LDAP 等其他外部身份验证系统也有效)。
【讨论】:
如果您有 root 访问权限,那么您当然可以阅读 /etc/shadow。我会说这是“正确”的做法。
除此之外,我认为您调用 ssh 的简单方式应该没问题,但我会使用 ssh 运行命令,例如,创建一些随机临时文件 - 然后,如果创建文件(或执行命令),您假设用户名/密码是正确的。听起来很恶心,但你可以让它在紧急情况下工作。
哦,当然,frig 具有您实际以该用户身份登录的副作用。这可能是可取的,也可能是不可取的……!
【讨论】:
请记住,UNIX 身份验证不仅限于 /etc/passwd 和 /etc/shadow。例如,它们可以针对 Kerberos、LDAP、NIS 或任何其他数量的源进行身份验证。出于这个原因,我强烈建议您研究 Java 的 PAM 包装器。一个快速的谷歌出现了http://jpam.sourceforge.net/,但我没有这方面的经验。
当然 sshd 可能被配置为根本不使用 PAM 或只允许某些用户等。如果你想完全遵循 sshd 的规则,那会改变一些事情,但听起来像 PAM auth更多是你想要的。
【讨论】: