Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何确认SFTP文件交付?_Linux_Unix_Ssh_Sftp - Fatal编程技术网

Linux 如何确认SFTP文件交付?

Linux 如何确认SFTP文件交付?,linux,unix,ssh,sftp,Linux,Unix,Ssh,Sftp,我正在为非root用户使用SFTP和公钥发送文件,看起来该文件已发送,但我在目标文件夹中找不到它,可能是由于权限原因 sftp> ls sftp> put /tmp/testx Uploading /tmp/testx to /folder1/target_folder /tmp/testx 100% 5 0.0KB/s 00:01 sftp> get testx Couldn't stat re

我正在为非root用户使用SFTP和公钥发送文件,看起来该文件已发送,但我在目标文件夹中找不到它,可能是由于权限原因

sftp> ls
sftp> put /tmp/testx
Uploading /tmp/testx to /folder1/target_folder
/tmp/testx                                 100%    5     0.0KB/s   00:01
sftp> get testx
Couldn't stat remote file: No such file or directory
File "/folder1/target_folder/testx" not found.
sftp> ls
sftp>
以下是-vvv:

debug3: SSH_FXP_REALPATH . -> /folder1
debug3: Looking up /tmp/file_to_send
debug3: Sent message sender_host 4 T:17 I:2
debug3: Wrote 80 bytes for a total of 2653
debug3: Received stat reply T:105 I:2
debug3: Sent message SSH2_FXP_OPEN I:3 P:/folder1/target_directory/file_to_send
debug3: Wrote 112 bytes for a total of 2765
debug3: Sent message SSH2_FXP_WRITE I:4 O:0 S:6206
debug3: Wrote 6288 bytes for a total of 9053
debug3: SSH2_FXP_STATUS 0
目标目录

 drw-rw-rw-    1  0   0       target_directory

在没有服务器访问权限的情况下,如何确保文件已交付

对于完全任意的服务器实现,这是不可能的。通常需要使传入目录只写入不受信任的用户,以防止滥用公开(或广泛)访问的文件服务器(例如,使用它们来承载不相关的内容;曾几何时,盗用凭据的FTP服务器经常被盗版者使用——防止上传的内容在未经管理审查的情况下被下载可以防止这种情况发生)。因此:如果服务器管理员选择不让您查看上传的文件,那么,您就无法查看上传的文件

但是——SFTP协议提供了一个约定:如果您在写入句柄后告诉服务器关闭句柄,并且服务器说所有涉及的操作都成功无误,那么如果文件未成功接收(无论服务器随后决定如何处理,这可能包括或可能不包括使其可供下载),这表明存在服务器端错误,而不是SFTP客户端的错误


当我上次实现自定义SFTP服务器时(出于客户支持目的,使用Paramiko实现),我在成功上传后发送了电子邮件通知;不过,这显然是一种特定于实现的行为)。

上传文件时,您所能做的就是检查是否没有错误。这就是SFTP服务器提供给您的所有信息

使用命令行OpenSSH
sftp
客户端,您可以检查其退出代码(您需要使用
-b
开关)

echo“put file.txt”| sftp-b-user@host
如果[$?-等式0]
然后
回显“已上载文件”
其他的
echo“文件未上载”
fi

另见


SFTP服务器完全可能不允许您下载刚刚上载的文件

这种行为有两个常见的原因:

  • 公共“上传”目录。这是为了防止您下载其他用户的文件
  • 有一个过程可以立即选择上传的文件进行处理

    • 我知道这是一条旧线。。。 下面是我能想到的最好的方法,使用openssh sftp客户端将密码验证上传到一个盲文件夹。 (使用ftp时要精确得多…)


      SSHPASS=${PASSWORD}SSHPASS-e sftp-vvv-oStrictHostKeyChecking=no-oBatchMode=no-b-${LOGON}@${FTPSITE}>${LOB}ftp.log 2>&1在用户交互模式下,我看到100%的进度指示文件已发送,我知道这在批处理模式下不可用。-vvv日志中的哪一行相当于此“100%”?换句话说,我应该在日志中查找什么来表示文件已发送?100%也不能告诉您太多信息--它告诉您发送的字节数与预期的字节数匹配,但这并不意味着它们都已写入。听起来这不是一个关于底层SFTP协议的问题,而是关于实现该协议的OpenSSH命令行工具的代码库的问题;我知道前者远比后者好。值得注意的是,paramiko默认情况下会在文件上传后执行
      stat()
      ,以确保其远程和本地大小匹配。(对于重命名、移动或不允许典型客户端访问刚上载的文件的服务器,可以禁用此选项)。如果这样做行得通的话,相信没有错误是有意义的,这是一件更确定的事情,但很明显,这并不适用于所有服务器,包括您在这里看到的一个。您使用命令行工具而不是直接实现协议并提供有关其处理服务器提供的错误消息的文档保证的客户端库是否有特殊原因?
      SSHPASS=${PASSWORD} sshpass -e sftp -vvv -oStrictHostKeyChecking=no -oBatchMode=no -b - ${LOGON}@${FTPSITE} >${LOB}ftp.log 2>&1 <<EOF
      pwd
      cd upload
      put ${XMTFILE}
      quit
      EOF
      # sftp does not use FTP codes - it only gives the final status of the requested operation
      Status=$?
      # Not perfect, but sending a single file using -vvv should produce 2 lines containing "debug3: SSH2_FXP_STATUS 0"
      Tmp=`grep "debug3: SSH2_FXP_STATUS 0" ${LOB}ftp.log | wc -l`
      [ ${Tmp} -ne 2 ] && Status=1 # Override sftp exit value based on log info