Rails向SFTP上传文件时报Errno::ENOTTY设备ioctl错误如何解决
问题修复方案
错误根因
Errno::ENOTTY (Inappropriate ioctl for device) 由Net::SSH默认尝试分配伪终端(PTY)导致:Rails Web请求、后台任务这类非交互式运行环境无可用TTY设备,终端控制相关系统调用无法执行。
此外现有代码存在拼写错误:case even 需改为 case event,否则会触发未定义变量报错。
修复步骤
- 显式在
Net::SSH.start配置中添加use_pty: false,关闭伪终端分配 - 修正拼写错误,建议显式指定SFTP服务器端的上传目标路径,避免默认路径逻辑不符合预期
修复后完整代码
Net::SSH.start(SFTP_HOST, sftp_user, { :port => SFTP_PORT, :password => sftp_password, :use_pty => false # 新增配置关闭伪终端分配 }) do |ssh| ssh.sftp.connect do |sftp| # 第二个参数为SFTP服务器端的目标存储路径,可按需修改 remote_file_path = "./#{File.basename(measurements_xml_file_path(meas))}" sftp.upload!(measurements_xml_file_path(meas).to_s, remote_file_path) do |event, uploader, *args| case event # 修正此处拼写错误 when :open puts "Starting upload" when :finish puts "Finished upload" return true end end end end
可选排查项
如果调整后仍存在异常,可依次检查:
- SFTP连接配置(地址、端口、账号密码)正确,服务器侧允许密码认证
- 本地XML文件路径存在且程序有可读权限
- SFTP服务器侧目标目录对当前账号开放写入权限
内容的提问来源于stack exchange,提问作者moh19814
相关产品推荐
相关产品推荐

