使用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
相关产品推荐
相关产品推荐

