如何通过SFTP将数据传输到远程文件而不将数据存储在Linux Bash的本地文件中?

时间:2015-11-16 21:09:10

标签: linux bash ssh centos sftp

我需要能够通过SFTP将数据从内存传输到远程文件中。我最初通过SSH工作,在工作时发现我没有SSH访问远程位置,只能访问SFTP。

以下是我原来的SSH代码示例:

echo "secret_data" | ssh root@localhost cat > secret_file;

这正是我所需要的,但是以某种形式:

sftp root@localhost put $secret_data secret_file;

原则上,我需要将数据永远不存储在本地计算机上的文件中,并完全从内存中处理。

任何回复都表示赞赏。感谢。

3 个答案:

答案 0 :(得分:0)

tmpfs中创建/etc/fstab分区(不存储在驱动器上,仅存储在内存中),将文件存储在那里然后使用您描述的方法,如果您真的想避免将文件存储到硬盘中

我已经设置了这种方式/tmp/var/log,以避免在整个SSD驱动器上写入:

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
none    /tmp/       tmpfs   size=15%    0   0

答案 1 :(得分:0)

如果允许使用您自己的,被黑客攻击的sftp副本,您可以使用

echo "my secret data 2" | (exec 6<&0 ; ( echo put  /proc/self/fd/6 /tmp/secret | sftp user@remote_host))

exec将传输秘密的stdin重定向到另一个文件描述符,在本例中为6.第二个echo发出sftp命令来执行。它使用/proc/魔术文件系统,/ proc / self重定向到打开它的进程的/proc/<pid>,以及文件描述符6的proc/<pid>/fd/6名称,并复制数据它从那里读取到远程主机上的文件。

如果您可以使用黑客版本的scp会更容易,这会读取

echo "my secret data 2" | scp /proc/self/fd/0 user@remote_host:/tmp/secret

现在对于hack:sftp和scp确保本地文件是常规文件,但/ proc / self / fd / ...文件描述符是管道。您需要禁用源代码中的检查。

对于sftp,您可以修改文件sftp-client.c:查找S_ISREG(...)的所有出现并将其替换为1

如果您不定期检查openssh安全消息并在必要时重新编译,这会很快且很脏并且可能会让您对安全漏洞开放。更好的方法是使用脚本语言和维护良好的sftp库并使用它。

答案 2 :(得分:0)

多协议客户端lftp明确支持从不可搜索的文件描述符中读取内容:

#!/bin/bash
#      ^^^^ some features used here are not present in /bin/sh

lftp \
  -u remote_username                 \
  -e 'put -o /tmp/secret /dev/stdin' \
  sftp://remote_host                 \
  < <(printf '%s' "$secret_data")

注意使用<()而不是<<<(在某些情况下,后者可以通过编写临时文件来实现;前者将是/dev/fd - 样式重定向在现代Linux上,或者可以在其他一些平台上使用FIFO实现。)