Bash

腳本中 SCP 命令的變數

  • May 21, 2019

我正在嘗試編寫一個腳本來檢查伺服器上最後修改/創建的文件是什麼,然後將其複製到此伺服器上的主目錄,然後將此文件從節點複製到我的本地電腦。

我想指出,我正在學習如何做到這一點,所以我根本沒有技能。

這是我的腳本,不要看“fr”選項,因為它是用於本地測試的。

#!/bin/bash
set -xv

dcma=some_server_name1
dcfr=some_server_name2
echo "FR czy MA?"

read dc

if [ "${dc,,}" == "fr" ]
then
echo "Wybrales Frankfurt!"
cd test/ ; out=$( ls -1tr | tail -n 1 ) ; cp $out ../
elif [ "${dc,,}" == "ma" ]
then
echo "Wybrales Boston!"
cmd=$( ssh -t $dcma ' cd /opt/automation/repository/hosts/ ; out=$( ls -1tr | tail -n 1 ) ; sudo cp $out ~/ ; ls -1tr ~/ | tail -n 1 ' )
cmdv=$( echo "$cmd" )
echo "Ostatnie wybrane hosty na serwerze: $cmdv"
scp -r some_server_name1:~/"$cmdv" .
fi

腳本在 SCP 命令上失敗,因為它說 $cmdv 變數沒有提到這樣的文件或目錄。

這是 set -xv 的輸出。

user-VirtualBox:~/hosty-skrypt$ ./hosty-v8 



dcma=some_server_name1
+ dcma=some_server_name1
dcfr=some_server_name2
+ dcfr=some_server_name2
echo "FR czy MA?"
+ echo 'FR czy MA?'
FR czy MA?

read dc
+ read dc
ma

if [ "${dc,,}" == "fr" ]
then
echo "Wybrales Frankfurt!"
cd test/ ; out=$( ls -1tr | tail -n 1 ) ; cp $out ../
elif [ "${dc,,}" == "ma" ]
then
echo "Wybrales Boston!"
cmd=$( ssh -t $dcma ' cd /opt/automation/repository/hosts/ ; out=$( ls -1tr | tail -n 1 ) ; sudo cp $out ~/ ; ls -1tr ~/ | tail -n 1 ' )
cmdv=$( echo "$cmd" )
echo "Ostatnie wybrane hosty na serwerze: $cmdv"
scp -r some_server_name1:~/"$cmdv" .
fi
+ '[' ma == fr ']'
+ '[' ma == ma ']'
+ echo 'Wybrales Boston!'
Wybrales Boston!
ssh -t $dcma ' cd /opt/automation/repository/hosts/ ; out=$( ls -1tr | tail -n 1 ) ; sudo cp $out ~/ ; ls -1tr ~/ | tail -n 1 ' 
++ ssh -t some_server_name1 ' cd /opt/automation/repository/hosts/ ; out=$( ls -1tr | tail -n 1 ) ; sudo cp $out ~/ ; ls -1tr ~/ | tail -n 1 '
some_username@some_server_name1's password: 
Connection to some_server_name1 closed.
+ cmd=$'hosts.merged.1558094140821\r'
echo "$cmd" 
++ echo $'hosts.merged.1558094140821\r'
+ cmdv=$'hosts.merged.1558094140821\r'
' echo 'Ostatnie wybrane hosty na serwerze: hosts.merged.1558094140821
Ostatnie wybrane hosty na serwerze: hosts.merged.1558094140821
' .cp -r 'some_server_name1:~/hosts.merged.1558094140821
some_username@some_server_name1's password: 
: No such file or directoryhosts.merged.1558094140821

知道如何解決這個問題嗎?

此外,我不能將此腳本放在目標機器上,因為它違反了公司政策。

我找到了解決方案。

事實證明,該變數最後附加了一個“\r”。

我通過使用 tr 命令解決了這個問題。

cmd=$( ssh -t some_server_name1 ' cd /opt/automation/repository/hosts/ ; out=$( ls -1tr | tail -n 1 ) ; sudo cp $out ~/ ; ls -1tr ~/ | tail -n 1 ' )
cmdv=$( echo "$cmd" | tr -d '\r' )

似乎目錄 /home/some_username/hosts.merged.1558094140821/ 不存在或不具有“some_username”的讀取/執行權限。為 scp 指定所需的使用者名可能是個好主意,以防萬一在遠端伺服器上訪問了錯誤的使用者。

例如:

scp -r remote_username@some_server_name1:~/"$cmdv" .

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