从 Linux 命令 shell 中,我可以使用用户
ABC
与我们的 CentOS 计算机建立 SSH 连接。 SSH 连接成功后,我可以运行 sudo
命令,不需要密码。
sudo /usr/bin/rootsh -i -u root
在 JSch 程序中,我使用用户
ABC
建立 SSH 连接,然后执行上述命令,但它询问我:
[sudo] password for [**ABC**]
我正在使用以下代码打开一个频道:
session.openChannel("exec");
我不明白为什么它要求密码,即使不需要密码。它还要求
ABC
的密码,但在我的 sudo
命令中,我已指定用户 root
。
如何解决这个问题?
您很可能已经设置了
requiretty
中的
sudoers
选项。
JSch by 不会为
exec
通道分配伪终端。
删除
requiretty
选项。这是唯一正确的选择。
如果无法删除它,可以通过调用以下命令强制 JSch 分配伪终端:
channelExec.setPty(true);
另请参阅使用 JSch sudo 示例和 Channel.setPty 在远程主机上运行 sudo 命令。
但这不是一个好的选择,因为它会给你带来很多讨厌的副作用。伪终端旨在用于交互式使用,而不是用于自动执行命令。
有关一些示例,请参阅
sudo
也是如此。你不应该自动化sudo
。正确的解决方案是设置一个专用私钥,仅具有您的任务所需的权限。