You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R通过SFTP协议访问Azure Blob存储失败求助

从启用SFTP的Azure Blob存储下载文件(R语言问题)

问题背景

需从已开启SFTP支持的Azure Blob存储下载文件,已获取可在FileZilla正常访问的用户名、密码及端点,但R语言的ssh、sftp、RCurl库均无法完成下载。生产环境仅限使用R语言,Python中可实现该需求。


各库测试情况

1. RCurl库测试

测试代码

# 定义连接参数
protocol <- "sftp"
server <- "endpoint.blob.core.windows.net"
user <- "username"
password <- "password"
file <- "/home/folder/file.csv"
url <- paste0(protocol, "://", server, file)

# 下载文件    
data <- getURL(url = url, userpwd = paste0(user, ":", password), verbose = TRUE)

错误信息

Host endpoint.blob.core.windows.net:22 was resolved.
IPv6: (none)
IPv4: 52.xxx.xxx.xx
Trying 52.xxx.xxx.xxx:22...
Connected to endpoint.blob.core.windows.net (52.xxx.xxx.xxx) port 22
Failure establishing ssh session: -5, Unable to exchange encryption keys
Closing connection
Error in function (type, msg, asError = TRUE)  :
Failure establishing ssh session: -5, Unable to exchange encryption keys

2. ssh库测试

测试代码

# 定义连接参数
server <- "endpoint.blob.core.windows.net"
port <- 22
user <- "username"
password <- "password"
file_path <- "/home/folder/file.csv"
local_path <- "."
    
# 建立SFTP连接
sesh <- ssh_connect(paste0(user, "@", server), passwd = password)
    
# 下载文件
scp_download(session=sesh, files=file_path, to=local_path, verbose = TRUE)

会话信息

<ssh session>
username@endpoint.blob.core.windows.net:22 (connected)
server: 07:af:36:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

错误信息

Error: SCP failure: Failed executing command: scp -f -r '/home/folder/file.csv'

3. stenevang/sftp库测试

日常使用该库处理SFTP任务,但无法适配Azure Blob SFTP。

测试代码

# 定义连接参数
urlRemote <- 'endpoint.blob.core.windows.net'
username <- "username"
password <- "password"
    
# 建立SFTP连接
sftp_con <- sftp_connect(server = urlRemote, 
                         folder = "/home/folder", 
                         username = username, 
                         password = password,
                         port=22)
# 列出Blob文件夹中的文件    
clientFiles <- sftp_list(sftp_connection = sftp_con,
                         type = "f", 
                         verbose = T)

连接对象信息

$protocol
[1] "sftp://"

$server
[1] "endpoint.blob.core.windows.net"

$port
[1] 22

$folder
[1] "home/folder"

$username
[1] "username"

$password
[1] "password"

$userpass
[1] "username:password"

$url
[1] "sftp://endpoint.blob.core.windows.net/home/folder/"

$url_port
[1] "sftp://endpoint.blob.core.windows.net:22/home/folder/"

$login_url
[1] "sftp://username:password@endpoint.blob.core.windows.net/home/folder/"

$login_url_port
[1] "sftp://username:password@endpoint.blob.core.windows.net.blob.core.windows.net:22/home/folder/"

$timeout
[1] 30

错误信息

SFTP url: sftp://endpoint.blob.core.windows.net/home/folder/
Error in function (type, msg, asError = TRUE)  :
Failure establishing ssh session: -5, Unable to exchange encryption keys

可行解决方案

1. 使用官方Azure存储R包 AzureStor

这是最稳定的方案,无需依赖SFTP库,直接通过Azure Blob API操作:

install.packages("AzureStor")
library(AzureStor)

# 连接到Blob存储端点
blob_endpoint <- storage_endpoint("https://endpoint.blob.core.windows.net", 
                                  key = "你的存储账户密钥")
# 获取目标容器
container <- storage_container(blob_endpoint, "容器名称")
# 下载文件到本地
download_blob(container, "folder/file.csv", dest = "./file.csv")

2. 调整ssh库的加密算法参数

Azure Blob SFTP支持aes256-gcm@openssh.com、chacha20-poly1305@openssh.com等加密算法,连接时显式指定:

library(ssh)

# 建立连接时指定兼容的加密算法
sesh <- ssh_connect(paste0(user, "@", server), 
                    passwd = password,
                    ciphers = "aes256-gcm@openssh.com,chacha20-poly1305@openssh.com")

# 下载文件(注意:Azure SFTP根目录为容器,路径需对应为"/容器名/folder/file.csv")
scp_download(session=sesh, files="/容器名/folder/file.csv", to="./file.csv")

3. 修复stenevang/sftp库的URL拼接bug

该库生成的login_url_port存在服务器地址重复的问题,手动修正后再使用:

library(sftp)

sftp_con <- sftp_connect(server = urlRemote, 
                         folder = "/home/folder", 
                         username = username, 
                         password = password,
                         port=22)
# 修正错误的连接URL
sftp_con$login_url_port <- "sftp://username:password@endpoint.blob.core.windows.net:22/home/folder/"

# 尝试列出文件
clientFiles <- sftp_list(sftp_connection = sftp_con, type = "f", verbose = T)

4. 配置RCurl的加密选项

在getURL中添加兼容的加密算法参数:

library(RCurl)

url <- paste0("sftp://", server, "/home/folder/file.csv")
data <- getURL(url = url, 
               userpwd = paste0(user, ":", password), 
               verbose = TRUE,
               curlOptions = list(cipher = "aes256-gcm@openssh.com"))

内容的提问来源于stack exchange,提问作者nur ally

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 21:57:04