r - 使用 R 和 RCurl 连接到 SFTP 的问题
问题描述
我正在尝试连接到 SFTP 站点以提取数据。它曾经可以工作,但由于某种原因,它在几周前停止工作。SFTP 的所有者说他们没有任何改变,我可以使用 WinSCP 轻松提取数据而不会出错。
protocol <- "sftp"
server <- "sftp.xxxx.net"
userpwd <- "user:password"
file <- "/public/bpus_dailytx.csv"
url <- paste0(protocol, "://", server, file)
data <- getURL(url = url, userpwd=userpwd, verbose = TRUE)
当我运行它时,我现在得到以下信息:
* Trying xxx.xx.xx.xxx...
* Connected to sftp.xxxx.net (xxx.xx.xx.xxx) port 22 (#0)
* SSH MD5 fingerprint: 34rh3ie93hhr39hhdik3
* SSH authentication methods available: publickey,keyboard-interactive
* Using SSH public key file '(nil)'
* Using SSH private key file ''
* SSH public key authentication failed: Unable to extract public key from private key file: Unable to open private key file
* No identity would match
* Authentication failure
* Closing connection 0
Error in function (type, msg, asError = TRUE) : Authentication failure
它连接正常,但随后身份验证失败。有什么想法可以在这里发生吗?同样,这段代码曾经可以工作,但发生了一些变化。除了这个,我还有什么其他方法可以尝试提取数据?
解决方案
很难说为什么你的代码停止工作,因为我们没有足够的关于配置(在你的机器上和服务器上)的信息。
因为您的密钥文件的格式不适合 RCurl,所以我的主要假设是,尽管服务器人员说他们最终没有改变,但我认为他们删除了密码身份验证选项。那是因为您的代码仅尝试密码验证。如果密码身份验证仍然可用,则输出中的一行将如下所示:
SSH authentication methods available: publickey,password,keyboard-interactive
正如您所指出的,现在是:
SSH authentication methods available: publickey,keyboard-interactive
因此,这里的解决方案是使用 PuTTYgen 将您的密钥文件从 PuTTY 转换为 OpenSSH 格式,然后使用以下 RCurl 代码指向您的新密钥文件:
protocol <- "sftp"
server <- "sftp.xxxx.net"
file <- "/public/bpus_dailytx.csv"
url <- paste0(protocol, "://", server, file)
keypasswd <- "your_keypasswd"
ssh.private.keyfile = "your_path_to_keyfile"
username <- "your_username"
data <- getURL(url = url, keypasswd = keypasswd, ssh.private.keyfile = ssh.private.keyfile, username = username, verbose = TRUE)
我要特别感谢@Tensibai 的帮助。如果没有他们对密钥文件格式的洞察力,我可能需要更长的时间才能得出这个解决方案。
推荐阅读
- angular - 使用 ViewChild 更新 ChildComponent 属性
- c++ - 您是否需要存储来自 std::async 的 std::future 返回值?
- javascript - 错误:AttributeError:'coroutine' 对象在进行 youtube 网页抓取时没有属性 'newPage'
- javascript - 画布内的工具提示定位
- flutter - 如何在 Flutter 中构建自定义图像提供程序?
- assembly - ASM 反汇编 RCR 函数调用
- node.js - 每 2 小时使用 bash 脚本重新启动 node.js 脚本
- wireguard - wireguard 只能连接到家庭子网(raspberrypi)
- c# - 如何使用多个 XPath 查询在 c# 中选择单个 XML 节点
- vue.js - Vuex 商店:当我尝试将新对象添加到数组时,会导致错误为“检测到重复键:'test1'。这可能会导致更新错误。”