通过 ssh 运行脚本并评估主机内的一些 var/comand

通过 ssh 运行脚本并评估主机内的一些 var/comand

我正在创建一个脚本来在服务器之间迁移一些数据。

我的头痛:

(...)
ssh -t -i ${KEY} ${USER}@${HOST} "cd /home/${ACCOUNT}/var/${DOMAIN}/ && tar cf - mail/ -P | pv -s $(du -sb mail/ | awk '{print $1}') | gzip > mail.tar.gz"

该命令返回类似“我找不到邮件文件夹”的内容,我想我知道为什么。

该命令在 ssh 连接之前评估pv -s $(du -sb mail/ | awk '{print $1}'),并且第一台服务器中不存在邮件文件夹。但如果我对当前字节大小进行硬编码,脚本将起作用。

我怎样才能绕过这种情况?

我会使用',但已经在使用 '{print $1}',还尝试创建另一个变量来适应类似的东西'pv -s $(du -sb mail/ | awk \'{print $1}\') ',但仍然没有运气,我已经尝试了很多带有普通引号和双引号的可能性。

PS:抱歉我的“英语”

题外话:如果有人向我指出一些好文章(或一些要搜索的关键关键字)来解释/显示声明、显示和评估变量的所有可能性,我会很高兴,我不知道正确的术语。就像 ${var} 和 $var 一样,当您使用"or时 echo 会做什么',以及如何转义重复引号、双引号、连接等......


完整脚本示例:

clear
printf "\n\n"
echo "********************************  INTERWORX --> CPANEL  *************************************"
printf "\n\n"

USER=root
HOST=xxx.xxx.xxx.xxx
PORT=xxxx
KEY=/var/somewhere
# ----------------
ACCOUNT=myaccount
DOMAIN=example.com

printf " ► ---------------------- [ ${HOST} ]\n"
printf " ►►---------------------- \n"

ssh -t -i ${KEY} ${USER}@${HOST} "cd /home/${ACCOUNT}/var/${DOMAIN}/ && tar cf - mail/ -P | pv -s \$(du -sb mail/ | awk '{print $1}')  | gzip > mail.tar.gz"

printf "\n ►►► ------------ [ mail.tar.gz ]\n\n"

scp -i ${KEY} ${USER}@${HOST}:/home/${ACCOUNT}/var/${DOMAIN}/mail.tar.gz .
                          ( ... )

答案1

既然您在评论中提到了调试选项,我认为这值得这样回答:

用作set -x序列中的第一个命令

ssh -t -i ${KEY} ${USER}@${HOST} "set -x ; cd /home/${ACCO ....."

这清楚地显示了您案例中的故障点:

没有逃脱$1

....
    ++ du -sb mail/
    + pv -s 12314 mail/   # <<< awk printed all the line instead of expected just 1st column with size and that ruined the command
    pv: mail/: read failed: Is a directory
...

与逃脱

....
 ++ du -sb mail/
 + pv -s 12314    # <<< pv gets expected number
      10kiB 0:00:00 [ 184MiB/s] [=======
....

相关内容