0

我知道有很多关于这个问题的线索,但我没有找到正确的方法:我按照这个例子:想要从 Java 调用 linux shell 命令来运行命令。ssh 命令的问题在于身份验证。当我运行它时,我需要设置密码

$ ssh root@server 'fgrep Exception *.log*' 
Enter passphrase for key '/././.ssh/id_rsa':

我怎样才能在这里传递密码?

4

2 回答 2

1

有一些库可用于调用 ssh。Java Secure Channel (JSCH)是一个非常流行的库,被 maven、ant 和 eclipse 使用。它是具有 BSD 风格许可证的开源软件。

如果需要ssh认证,可以通过java使用。

如果您仍然需要通过密码传递,有两种方法可以做您想做的事。一个涉及存储的密码,一个不涉及。

两者都是非交互式的,这意味着当您不在那里输入密码时它们可以工作。

  1. 不需要密码的方式。您可以在 SSH 中使用公钥/私钥身份验证而不是密码。我将假设您使用的是 OpenSSH,它几乎随每个 Linux 发行版一起提供。

    脚步 :

    • 配置您的 SSH 服务器以接受私钥登录。在 /etc/ssh/sshd_config 中确保有一行显示 PubkeyAuthentication yes (并且前面没有 # )。如果更改此文件,则需要重新启动 sshd 服务。

    • 在您的本地机器(不是服务器)上,使用ssh-keygen -t rsa创建自己的一对密钥 (您可以使用 rsa 以外的其他选项,但我保持简单)。不要指定密码。将密钥保存在提示的位置。

    • 打开您刚刚创建的 id_rsa.pub 文件的内容(这是一行很长的文本),并将内容复制到服务器计算机上 $HOME/.ssh/authorized_keys 文件的末尾。如果文件不存在,则创建该文件。

    更多详情请参阅此处

  2. 基本思想是使用expect,这是一个管理自动化工具,在出现提示时将密码输入到ssh。它可能并不总是有效,当它不起作用时,很难弄清楚为什么不这样做。我推荐第一种方法。

    无论如何,这里有一个命令,你可以在它做你想做的事情之前戳它。

脚本代码为:

    expect -c 'spawn ssh user@remote.host ; expect assword ; send  "passphrase\n" ; interact'

Expect 可能未安装在您的系统上。确保安装

于 2012-06-28T11:00:17.217 回答
0

您需要从执行中获取 InputStream(具有输出)并等待它向您询问密码,然后获取 OutputStream(您将其输入到该命令中)并向其发送您想要的密码。

阅读这篇文章

于 2012-06-28T10:20:21.380 回答