[英]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.