当我尝试从我的oracle机器使用PL/SQL过程连接sftp位置时,我得到ORA-29260: network error: TNS:connection closed错误。
- telnet连接没有问题
- 目标sftp机被添加到ACL
- 使用ssh传输文件没有问题
- 可以手动连接sftp位置
DECLARE
l_conn UTL_TCP.connection;
BEGIN
l_conn := ftp.login('xx.xx.xx.xx', '22', 'myuser', 'mypass');
-- ftp.ascii(p_conn => l_conn);
-- ftp.put(p_conn => l_conn,
-- p_from_dir => 'MY_DOCS',
-- p_from_file => 'test_get.txt',
-- p_to_file => '/app/test_put.txt
dbms_output.put_line('connection done');
ftp.logout(l_conn);
END;
有什么想法吗?
提前感谢。
你的程序永远不会工作。您正在使用端口22,这意味着您正在使用构建在SSH
之上的SFTP
。PLSQL
不能从UTL_TCP
直接提供API
来对抗SSH
。
然而,它可以使用dbms_scheduler
和external_script
来实现
在PL/SQL中使用SFTP,我将执行以下操作:
- 在数据库服务器和远程SSH服务之间使用对对认证,允许无密码连接。
- 编写shell脚本执行SFTP命令。
- 使用调度程序从作业调用shell脚本。
所以,你有一个脚本bash运行sftp,假设你有主机之间的交换密钥,不需要密码。
#!/bin/bash
cd /directoryfiles
sftp user@host << eof
mput *.* -- or mget
eof
这是mysftp.sh
。然后您需要凭证和dbms_scheduler
中的工作
BEGIN
DBMS_CREDENTIAL.create_credential(
credential_name => 'my_cred_sftp',
username => 'myuser',
password => 'mypassword'
);
END;
/
BEGIN
DBMS_SCHEDULER.create_job(
job_name => 'MY_RUN_SFTP',
job_type => 'EXTERNAL_SCRIPT',
job_action => '/mydirectory/mysftp.sh',
credential_name => 'my_cred_sftp',
enabled => TRUE ,
auto_drop => TRUE
);
END;
/