我正在构建一个负责列出远程目录文件的SFTP类。我正在使用JSch库来实现这一目标。我已经设置了用户,我可以手动SSH到远程服务器。但是,当JSch尝试连接时,它会以
响应com.jcraft.jsch.JSchException:Auth fail
我注意到了一件事;当我手动SSH到服务器上时,我发现它正在使用" PAM身份验证。"我错过了什么?
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
Session session = jSch.getSession(username, destination, port);
session.setPassword(password);
session.setConfig(config);
session.connect();
答案 0 :(得分:2)
如果您在服务器端使用PAM身份验证,则可能需要在客户端实现键盘交互式身份验证。
请参阅What's the difference between “password” and “keyboard-interactive”?问题,了解PAM与键盘交互式身份验证之间的关系。
有关键盘交互式身份验证实现示例,请参阅official UserAuthKI
example。
基本上,您需要实施UIKeyboardInteractive
interface(与UserInfo
interface一起)并使用Session.setUserInfo
将实施与会话相关联。
如果身份验证仅提示输入单个“密码”,请执行UIKeyboardInteractive.promptKeyboardInteractive
method以返回包含密码的单个元素数组。
答案 1 :(得分:0)
下面的代码经过测试并按预期工作。试试以下代码:
/* This is your crud method */
function my_crud()
{
$crud = new grocery_CRUD();
...
...
$crud->callback_column(
'timestamp',
array($this,'_callback_convert_to_human_readable')
);
...
...
}
/* So this is your callback */
function _callback_convert_to_human_readable($value, $row)
{
return date("m/d/Y H:i:s", $value);
}