Linux

通過 ssh 執行腳本並評估主機內的一些 var/comand

  • June 29, 2018

我正在創建一個腳本來在伺服器之間遷移一些數據。

我的頭痛:

( … )

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} and $ 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 .
                         ( ... )

由於您在評論中提到了調試選項,我認為這值得這樣回答:

用作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] [=======
....

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