【问题标题】:Run perl command in external server using ssh [closed]使用 ssh 在外部服务器中运行 perl 命令 [关闭]
【发布时间】:2021-08-27 02:51:43
【问题描述】:

我想使用 SSH 在远程位置运行 perl 命令

#!/bin/ksh -x
ssh $RFTPUSERID@$RFTPSERVER /bin/bash >> ${LOGFILE} << EOF
cd ${ARCHIVEPATH}
find  ${ARCHIVEPATH} -type f -mtime +${ARCHIVERETENTIONDAYS} -name "${WLDCRD}*" -exec rm -rf {} \;
ls ${ARCHIVEPATH} | grep -v gz$ | perl -lne '$date=`date '+%Y%m%d_%H%M%S'`; chomp($date); `mv ${ARCHIVEPATH}$_ $_$date`;'
find ${ARCHIVEPATH} -type f ! -name "*.gz" -exec gzip {} \;
exit
EOF

第一个命令可以删除旧文件,第三个命令也可以压缩文件,但是使用 perl 功能将日期附加到文件名的第二个命令不起作用。

【问题讨论】:

  • 你做了什么调试?前任。 perl 在用户的 PATH 中吗?您是否打印了 perl 收到的参数?您的ls ... | grep 是否返回您期望的内容?你的...| grep -v gz$ 可能会导致问题,$ 对外壳来说意味着什么。需要双引号和反斜杠。
  • @Nic3500 : 我认为 gz$ 虽然风格肯定不好,但在这里是无害的。因为$ 后面有一个空格,所以shell 不会解释它。例如echo $
  • @SharadR.Telkar:另外,不工作并不是对问题的非常有意义的描述。请参阅here 学习,如何在Stack Overflow 上提出明智的问题。
  • @Nic3500:A,你是对的。对不起。这是一个 Perl 表达式(-e 标志)。你对不匹配的报价也是正确的。 OP 尝试将单引号嵌套在单引号内。难怪它不起作用....
  • 您可以xargs 或重新格式化您的代码而不使用 perl,因为您似乎只是在重命名带有额外日期的文件...

标签: bash perl unix ssh aix


【解决方案1】:

您的脚本可以写得更健壮(而且更简单):

#!/bin/ksh -x
ssh "$RFTPUSERID@$RFTPSERVER" /bin/bash >> "${LOGFILE}" << EOF
shopt -s extglob
cd "${ARCHIVEPATH}"
find  "${ARCHIVEPATH}" -type f -mtime "+${ARCHIVERETENTIONDAYS}" -name "${WLDCRD}*" -exec rm -rf {} \;
date="\$(date '+%Y%m%d_%H%M%S')"
for file in "${ARCHIVEPATH}"/!(*.gz); do mv "\$file" "\${file##*/}\$date"; done
find "${ARCHIVEPATH}" -type f ! -name "*.gz" -exec gzip {} \;
exit
EOF

您通常总是希望引用变量扩展来防止不必要的副作用,循环文件名扩展的结果是far, far better,而不是尝试处理ls 的输出。当你在 perl 脚本中所做的只是调用其他程序时......使用 perl 而不是 shell 是没有意义的。

脚本的双重解析,首先是本地的ksh,然后是远程的bash,确实让事情变得更复杂了......因此循环中的变量转义和命令替换date.

【讨论】:

  • 如果您没有要搜索的目录树,则可能会删除对 gzip 文件的最后查找并将 gzip 移动到循环中。
猜你喜欢
  • 2022-11-08
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
相关资源
最近更新 更多