如何在SFTP数据路径中传递日期变量?

如何在SFTP数据路径中传递日期变量?

我需要创建一个带有包含昨天日期的变量值的路径。我需要使用 SFTP 获取文件。这是我的尝试。

#/bin/bash

TS=$(date -d '30 mins ago' +"%Y%m%d")

sshpass -p '12#$' sftp -P 2222 [email protected] <<'END_SFTP'
get /newNE/PSData$TS*  /data/processedfiles
END_SFTP

TS日期值没有传递到远程服务器来获取数据。

File "/newNE/PSData$TS*" not found.

有人可以帮我解决这个问题吗?

答案1

对于要在此处文档内执行的参数扩展(以及命令替换和算术扩展以及行继续处理),分隔符的任何部分都不能被引用,因此:

#! /bin/sh -

ts=$(date -d '30 mins ago' +"%Y%m%d")

SSHPASS='12#$' sshpass -e sftp -P 2222 [email protected] <<END_SFTP
get /newNE/PSData$ts* /data/processedfiles
END_SFTP

另请注意:

  • 密码不应在命令行上传递,该命令行在某些记帐日志的输出中ps或有时在某些记帐日志中公开可用。将它们作为环境变量传递通常很好,因为这通常被认为是私有的。更好的是使用公钥身份验证。您需要确保对脚本的读取访问受到限制并且它包含该密码。
  • shebangs 开头,#!后面是通往解释器的路径。添加 a-也是一个很好的做法。如果只有#/bin/bash,那只是一条注释,因此在没有 shebang 的情况下,您的系统可能会运行sh来解释脚本。
  • 然而,在这里,该脚本中没有任何bash特定的内容,因此您不妨使用sh并删除该依赖项bash(并且在运行脚本时可能会使用更少的资源,除非您所在的系统/bin/shbash)。
  • 在这里,您确实依赖于 GNU date(对于该非标准-d选项),它的可移植性甚至比bash(bash 是 GNU shell,但也常见于非 GNU 系统)更差。如果使用bash,您可以通过定义tsprintf -v ts '%(%Y%m%d)T' "$(( EPOCHSECONDS - 30 * 60 ))"printf -v EPOCHSECONDS '%(%s)T' -1在旧版本的后面bash)来删除该依赖性。

相关内容