Bash
腳本中 SCP 命令的變數
我正在嘗試編寫一個腳本來檢查伺服器上最後修改/創建的文件是什麼,然後將其複製到此伺服器上的主目錄,然後將此文件從節點複製到我的本地電腦。
我想指出,我正在學習如何做到這一點,所以我根本沒有技能。
這是我的腳本,不要看“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" .