Linux
如何在 SFTP 數據路徑中傳遞日期變數?
我需要創建一個包含昨天日期的變數值的路徑。我需要使用 SFTP 獲取文件。這是我的嘗試。
#/bin/bash TS=$(date -d '30 mins ago' +"%Y%m%d") sshpass -p '12#$' sftp -P 2222 User_New@10.18.16.14 <<'END_SFTP' get /newNE/PSData$TS* /data/processedfiles END_SFTP
但是
TS
日期值沒有傳遞給遠端伺服器來獲取數據。File "/newNE/PSData$TS*" not found.
有人可以幫我解決這個問題嗎?
對於要在此處文件中執行的參數擴展(以及命令替換和算術擴展以及行繼續處理),必須引用分隔符的任何部分,因此:
#! /bin/sh - ts=$(date -d '30 mins ago' +"%Y%m%d") SSHPASS='12#$' sshpass -e sftp -P 2222 User_New@10.18.16.14 <<END_SFTP get /newNE/PSData$ts* /data/processedfiles END_SFTP
另請注意:
- 不應在命令行上傳遞密碼,該命令行在某些記帳日誌的輸出中
ps
或有時在某些記帳日誌中公開可用。將它們作為環境變數傳遞通常很好,因為這通常被認為是私有的。更好的是使用公鑰認證。您需要確保對腳本的讀取權限受到限制,並且它包含該密碼。- shebangs
#!
以解釋器的路徑開頭。添加 a-
也是一種很好的做法。使用 just#/bin/bash
,這只是一個註釋,因此在沒有 shebang 的情況下,您的系統可能會執行sh
以解釋腳本。- 但是,在這裡,
bash
該腳本中沒有任何特定內容,因此您最好使用sh
並刪除該依賴項bash
(並且在執行腳本時可能使用更少的資源,除非您在 is 的系統上/bin/sh
)bash
。- 在這裡,您確實依賴於 GNU
date
(對於那個非標準-d
選項),它的可移植性甚至比bash
(bash 是 GNU shell,但在非 GNU 系統上也很常見)。如果使用,您可以通過定義為(在舊版本之後)bash
來刪除該依賴項。ts``printf -v ts '%(%Y%m%d)T' "$(( EPOCHSECONDS - 30 * 60 ))"``printf -v EPOCHSECONDS '%(%s)T' -1``bash