在LinuxBash中,如何通过SFTP将数据传输到远程文件,而不将数据存储在本地文件中?
我需要能够通过SFTP将数据从内存传输到远程文件。我最初是通过SSH实现的,在工作时发现我没有SSH访问远程位置的权限,只有SFTP访问权限 下面是我的原始SSH代码的一个示例:在LinuxBash中,如何通过SFTP将数据传输到远程文件,而不将数据存储在本地文件中?,linux,bash,ssh,centos,sftp,Linux,Bash,Ssh,Centos,Sftp,我需要能够通过SFTP将数据从内存传输到远程文件。我最初是通过SSH实现的,在工作时发现我没有SSH访问远程位置的权限,只有SFTP访问权限 下面是我的原始SSH代码的一个示例: echo“机密数据”| sshroot@localhostcat>secret\u文件; 这正是我需要的,但以某种形式: sftproot@localhost将$secret\u数据放入secret\u文件; 原则上,我需要数据永远不要存储在本地机器上的文件中,并且完全从内存中处理 感谢您的回复。谢谢。在/etc/
echo“机密数据”| sshroot@localhostcat>secret\u文件;
这正是我需要的,但以某种形式:
sftproot@localhost将$secret\u数据放入secret\u文件;
原则上,我需要数据永远不要存储在本地机器上的文件中,并且完全从内存中处理
感谢您的回复。谢谢。在
/etc/fstab
中创建tmpfs
分区(不存储在驱动器上,仅存储在内存中),将文件存储在那里,然后使用所述方法,如果您确实想避免将文件存储到硬盘中
我通过设置/tmp
和/var/log
来避免在SSD驱动器上写满内容:
# <file system> <mount point> <type> <options> <dump> <pass>
none /tmp/ tmpfs size=15% 0 0
#
无/tmp/tmpfs大小=15%0
如果允许使用您自己的、经过黑客攻击的sftp副本,您可以使用
echo "my secret data 2" | (exec 6<&0 ; ( echo put /proc/self/fd/6 /tmp/secret | sftp user@remote_host))
现在,对于hack:sftp和scp,请确保本地文件是常规文件,但/proc/self/fd/。。。文件描述符是管道。您需要禁用源代码中的检查
对于sftp,您需要修改文件sftp client.c:查找所有出现的S_ISREG(…)
,并将其替换为1
如果您不定期检查openssh安全消息,并在必要时重新编译,则这是快速且肮脏的,可能会使您面临安全漏洞。更好的方法是使用带有维护良好的sftp库的脚本语言并使用它。多协议客户端明确支持从不可查找的文件描述符读取内容:
#!/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")
#/bin/bash
#^^^^^此处使用的某些功能在/bin/sh中不存在
lftp\
-远程用户名\
-e'put-o/tmp/secret/dev/stdin'\
sftp://remote_host \
<我想真正的要求是数据不在一个容易访问的位置。通过将数据存储在这个位置,虽然数据将保存在内存中,但它不会像本地存储的文件那样容易检查吗?很抱歉,我应该让原来的帖子更清楚地说明这一要求。当然,您可以将tmpfs
文件系统装载到其他任何人都无法访问的地方。这只是一个例子。有趣的问题。scp和sftp拒绝发送/proc/self/fd/0,因为它不是一个常规文件……如果您不太喜欢bash,这将在使用paramiko.BTW的Python中轻松完成,echo
对于这项工作来说是一个糟糕的工具选择。在阅读POSIX规范时,您会被允许对数据进行多大程度的破坏而震惊。(内容中的任何地方都有反斜杠?echo
的输出突然完全由实现定义!)
#!/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")