Linux

如何在 SFTP 數據路徑中傳遞日期變數?

  • April 18, 2022

我需要創建一個包含昨天日期的變數值的路徑。我需要使用 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/shbash
  • 在這裡,您確實依賴於 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

引用自:https://unix.stackexchange.com/questions/699425