我需要能够通过SFTP将数据从内存传输到远程文件中。我最初通过SSH工作,在工作时发现我没有SSH访问远程位置,只能访问SFTP。
以下是我原来的SSH代码示例:
echo "secret_data" | ssh root@localhost cat > secret_file;
这正是我所需要的,但是以某种形式:
sftp root@localhost put $secret_data secret_file;
原则上,我需要将数据永远不存储在本地计算机上的文件中,并完全从内存中处理。
任何回复都表示赞赏。感谢。
答案 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实现。)