首页 > 其他分享 >libssh2_sftp_rename失败问题

libssh2_sftp_rename失败问题

时间:2022-09-02 23:15:17浏览次数:62  
标签:rename libssh2 LIBSSH2 SFTP ERROR sftp

最近遇到一个问题,使用libssh2_sftp上传文件时,传输的文件命名文xxx.xx.temp,上传完成后需要把temp后缀去掉。
libssh2提供了一个接口libssh2_sftp_rename用于重命名远端文件。
但是在调用libssh2_sftp_rename时出现一个问题,只有第一次调用可以成功,后面在调用就会失败,返回错误码-31
libssh2.h里定义了该错误:

#define LIBSSH2_ERROR_SFTP_PROTOCOL             -31

libssh2_sftp_rename的代码实现为:

#define libssh2_sftp_rename(sftp, sourcefile, destfile) \
    libssh2_sftp_rename_ex((sftp), (sourcefile), strlen(sourcefile), \
                           (destfile), strlen(destfile),                \
                           LIBSSH2_SFTP_RENAME_OVERWRITE | \
                           LIBSSH2_SFTP_RENAME_ATOMIC | \
                           LIBSSH2_SFTP_RENAME_NATIVE)

libssh2_sftp_rename_ex实现为:

LIBSSH2_API int
libssh2_sftp_rename_ex(LIBSSH2_SFTP *sftp, const char *source_filename,
                       unsigned int source_filename_len,
                       const char *dest_filename,
                       unsigned int dest_filename_len, long flags)
{
    int rc;
    if(!sftp)
        return LIBSSH2_ERROR_BAD_USE;
    BLOCK_ADJUST(rc, sftp->channel->session,
                 sftp_rename(sftp, source_filename, source_filename_len,
                             dest_filename, dest_filename_len, flags));
    return rc;
}

libssh2_sftp_rename函数最终调用为sftp_rename,在sftp_rename里写明了返回LIBSSH2_ERROR_SFTP_PROTOCOL错误的几种情况:

  • 版本太低不支持
if(sftp->version < 2) {
        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,
                              "Server does not support RENAME");
    }
  • 重命名包长太小
    rc = sftp_packet_require(sftp, SSH_FXP_STATUS,
                             sftp->rename_request_id, &data,
                             &data_len, 9);
    if(rc == LIBSSH2_ERROR_EAGAIN) {
        return rc;
    }
    else if(rc == LIBSSH2_ERROR_BUFFER_TOO_SMALL) {
        if(data_len > 0) {
            LIBSSH2_FREE(session, data);
        }
        return _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,
                              "SFTP rename packet too short");
    }
  • 文件早已存在
case LIBSSH2_FX_FILE_ALREADY_EXISTS:
        retcode = _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,
                                 "File already exists and "
                                 "SSH_FXP_RENAME_OVERWRITE not specified");
        break;
  • 操作不支持
case LIBSSH2_FX_OP_UNSUPPORTED:
        retcode = _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,
                                 "Operation Not Supported");
        break;
  • SFTP 协议错误
default:
        retcode = _libssh2_error(session, LIBSSH2_ERROR_SFTP_PROTOCOL,
                                 "SFTP Protocol Error");
        break;

从上面可以看到,如果重命名的文件已经存在的话,再想调用libssh2_sftp_rename会失败,这也是为什么只有第一次重命名会成功,在以后就报错。
因此解决方法是,在重命名之前检测远端是否存在重命名后的文件,如果存在的话删除掉已有的文件,或者重新命名一个新名字。

标签:rename,libssh2,LIBSSH2,SFTP,ERROR,sftp
From: https://www.cnblogs.com/chaichengxun/p/16601758.html

相关文章

  • Redis集群模式哈希槽rename问题
    (error)ERR'RENAME'commandkeysmustinsameslot一、介绍我们先来看基本的介绍RedisRename命令用于修改key的名称。1、语法redisrename命令的基本用法如......
  • sftp
     连接[email protected]#输入密码上传sftp>put/home/本机目录/文件名/usr/local/目标目录/1.2.3.4断开exit......
  • linux 文件服务器搭建 ftp sftp smb httpd
    服务器配置规划:sftp默认安装linux后开启,windows用户需要安装工具连接。ftp安装vsftpd服务,配置虚拟用户,制定上传下载目录samba:服务安装samba服务器,配置共享目录,设定......
  • pxe+kickstart+vsftp自动安装centos7操作系统
    PXE+kickstart自动安装centos7操作系统在配置前,首先关闭系统中的防火墙、selinux1、配置网络服务器方式1:http/https服务器充当iso源存放服务器1[root@localhost~]#......
  • vsftp日志xferlog格式分析
    1、开始vsftp记录日志。修改/etc/vsftpd/vsftpd.conf如下:xferlog_enable=YESxferlog_std_format=YESxferlog_file=/var/log/xferlogFTP服务器的日志设置,可以通过修改主......
  • Linux下重命名文件或文件夹(mv命令与rename命令)
    Linux下重命名文件或文件夹(mv命令与rename命令)-山高我为峰-博客园 https://www.cnblogs.com/liaojie970/p/6746331.html在Linux下重命名文件或目录,可以使用mv命令......
  • CentOS 8.4 (Redhat)安装 vsftpd 记录,aliyun的虚拟主机。
    1.建立一个ftpadmin账号,管理/var/ftp目录的上传等操作。2.在/etc/vsftpd/vsftpd.conf中添加(或生效)如下行,只是其中的部分修改的行:local_enable=YES //Uncomment......
  • psftp 的使用
    打开工具连接服务器[email protected]  上传和下载分别通过put和get命令来实现:下载上传文件夹,加上那个递归符号-r下载  上传 ......
  • Java-Java操作SFTP工具类
    一、SFTP工具类二、配置文件Bean修订记录版本是否发布2020-08-03v1.0是一、SFTP工具类importcom.*.*.common.util.FileUtil;importcom.*.*.comm......
  • SCP和SFTP区别
    https://www.iteye.com/blog/wb8206656-2231060不管SCP还是SFTP,都是SSH的功能之一。都是使用SSH协议来传输文件的。不用说文件内容,就是登录时的用户信息都是经过SSH加......