如何确认sftp文件传递?

时间:2015-01-29 20:22:08

标签: linux unix ssh sftp

我使用sftp和公共密钥为非root用户发送文件,看起来像是发送文件,但我无法在目标文件夹中找到它,可能是由于权限。

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

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

3 个答案:

答案 0 :(得分:6)

您可以做的就是在上传文件时检查没有错误。这是SFTP服务器为您提供的所有信息。

使用命令行OpenSSH sftp客户端,您可以检查其退出代码。

echo "put file.txt" | sftp -b - user@host
if [ $? -eq 0 ]
then
    echo "File uploaded"
else
    echo "File NOT uploaded"
fi

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

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

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

答案 1 :(得分:1)

对于完全任意的服务器实现,这是不可能的。通常希望将传入目录设置为只写不受信任的用户,以防止滥用公共(或其他广泛)可访问的文件服务器(例如使用它们来托管不相关的内容;曾几何时,海盗经常使用盗取凭据的FTP服务器 - 防止上载的内容在没有管理审查的情况下被下载阻止了这种情况。因此:如果服务器管理员选择不让您看到上传的文件,那么,您就看不到上传的文件了。

然而 - SFTP协议提供了一个契约:如果你在写入后告诉服务器关闭句柄,并且服务器说所有涉及的操作都成功而没有错误,那么如果文件没有成功接收(无论如何)然后服务器决定使用它,这可能包括或不包括使其可供下载访问),这表示服务器端错误,并不是您的SFTP客户端的错误。

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

答案 2 :(得分:1)

我知道这是一个老线程...... 这是我能够使用openssh sftp客户端将密码身份验证上传到盲文件夹中的最佳方法。 (ftp更精确......)

{{1}}