【问题标题】:File returns NULL Value while using sftp_open() for copying file from local to remote using SFTP libssh in C++使用 sftp_open() 在 C++ 中使用 SFTP libssh 将文件从本地复制到远程时,文件返回 NULL 值
【发布时间】:2019-02-22 03:31:44
【问题描述】:

我已经使用 C++ 中的 SFTP SSH 连接到服务器,并且我已经将文件从 远程复制到本地。现在我正在尝试从本地复制到远程,我从this 了解到这个,但它不起作用。我写了以下代码。

 fr = fopen("C:/Users/Sami/Desktop/we/s.txt", "r");
fseek(fr, 0, SEEK_END);
 lSize = ftell(fr);
rewind(fr);
char * buffer = (char*)malloc(sizeof(char)*lSize);
 result = fread(buffer, 1, lSize, fr);
file = sftp_open(sftp, "/home/serversj/Desktop/sami/s.txt", O_CREAT, 1);
nwritten = sftp_write(file, buffer, result);

我使用“fopen”打开本地系统文件并将文件数据存储到缓冲区中,然后将缓冲区内容读取到结果中。在调试时,我可以看到 sftp_open 函数在“文件”中创建了一个 NULL 值,因此 sftp_write 显示错误“没有这样的文件”。我在窗户上工作。我得到错误是在 sftp_open 中,我也尝试了this answer,但在 'sftp_open' 中出现问题。我不知道如何纠正这个..我陷入了困境。

错误是:'SFTP server : Permission denied.'.. 并且 ssh_get 错误是'No such file'

【问题讨论】:

  • 您的服务器上是否存在/home/serversj/Desktop/sami/ 目录?
  • @melpomene:是的,我已经使用该目录将文件从 远程复制到本地,并且在调试错误时显示“读取访问冲突。文件为 nullptr。”因此“权限被拒绝”。
  • 在您的其他问题中,您使用了/home/server/Desktop/sa/,即server 而不是serversjsa 而不是sami
  • 为什么不在代码中进行适当的错误检查?空指针取消引用并不意味着“权限被拒绝”。
  • 是的,实际上我并没有把程序中使用的实际路径放在这里,我只是重命名了这些路径,同时发布了一些安全问题的问题。但实际路径是存在的。我可以看到的错误是“sftp_open:SFTP 服务器:权限被拒绝。”。是否与 sftp_open(file,"",acces_type,mode) 中的设置模式有关; ?并且这里使用的access_type是'O_CREAT',mode是1。对吗?

标签: c++ sftp libssh


【解决方案1】:

检查你的常量:

#define O_RDONLY     0x0000
#define O_WRONLY     0x0001
#define O_RDWR       0x0002

#define O_CREAT      0x0100
#define O_TRUNC      0x0200
#define O_EXCL       0x0400

#define S_IFREG      0x8000          /* regular */
#define S_IREAD      0x0100          /* read permission, owner */
#define S_IWRITE     0x0080          /* write permission, owner */
#define S_IEXEC      0x0040          /* execute/search permission, owner */
#define S_IRWXU      S_IREAD | S_IWRITE | S_IEXEC

int accesstype = O_WRONLY | O_CREAT | O_TRUNC;
mode_t mode = S_IRWXU;
sftp_file file = sftp_open( sftpSession, dstFile, accesstype, mode );

【讨论】:

    【解决方案2】:

    您使用 sftp_open(); 仅用于使用 access_type O_CREAT 创建文件,您需要 O_WRONLY 将一些数据写入该文件.

     fr = fopen("C:/Users/Sami/Desktop/we/s.txt", "r");
        fseek(fr, 0, SEEK_END);
         lSize = ftell(fr);
        rewind(fr);
        char * buffer = (char*)malloc(sizeof(char)*lSize);
         result = fread(buffer, 1, lSize, fr);
        int access_type = O_WRONLY | O_CREAT;
        file = sftp_open(sftp, "/home/serversj/Desktop/sami/s.txt", access_type,S_IRWXU);
        nwritten = sftp_write(file, buffer, result);
    

    我希望这会奏效..

    【讨论】:

      猜你喜欢
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      • 2012-07-03
      相关资源
      最近更新 更多