Linux
通過 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} 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] [======= ....