簡體   English   中英

如何通過SFTP將數據傳輸到遠程文件而不將數據存儲在Linux Bash的本地文件中?

[英]How to transfer data into remote file over SFTP without storing data in a local file in Linux Bash?

我需要能夠通過SFTP將數據從內存傳輸到遠程文件。 我最初通過SSH工作,在工作時,發現我沒有SSH訪問遠程位置,只有SFTP訪問。

這是我原來的SSH代碼示例:

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

這正是我所需要的,但是在某種形式下:

sftp root@localhost put $secret_data secret_file;

原則上,我需要將數據永遠不存儲在本地機器上的文件中,並完全從內存中處理。

任何回復都表示贊賞。 謝謝。

多協議客戶端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")

注意使用<()而不是<<< (在某些情況下,后者可以通過編寫臨時文件來實現;前者將是現代Linux上的/dev/fd style重定向,或者可以實現在其他一些平台上使用FIFO)。

/etc/fstab創建tmpfs分區(不存儲在驅動器上,僅存儲在內存中),將文件存儲在那里,然后使用您描述的方法,如果您真的想避免將文件存儲到硬盤中。

我已經設置了這種方式/tmp/var/log以避免在整個SSD驅動器上寫入:

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
none    /tmp/       tmpfs   size=15%    0   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/ magic文件系統,打開它的進程的/ 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庫並使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM