スクリプトのSCPコマンドの変数

スクリプトの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

$ cmdv変数にそのファイルやディレクトリが記載されていないため、SCPコマンドでスクリプトが失敗します。

これは 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

この問題を解決する方法を知っていますか?

また、このスクリプトは会社のポリシーに違反しているため、ターゲットコンピュータに配置することはできません。

答え1

解決策が見つかりました。

変数の末尾に「\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' )

答え2

/home/some_username/hosts.merged.1558094140821/ ディレクトリが存在しないか、"some_username"に対する読み取り/実行権限がないようです。リモートサーバーから無効なユーザーにアクセスする場合は、scpに必要なユーザー名を指定することをお勧めします。

たとえば、

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

答え3

/opt/automation/repository/hosts/スクリプトは、サーバー上のその場所で最後に変更されたファイル名を取得します。some_servername1

これはscpパスを無視してファイル名を取得します。

コマンドを次から変更します。

scp -r some_server_name1:~/"$cmdv"

到着

scp -r some_server_name1:/opt/automation/repository/hosts/"$cmdv"

問題が解決することを願っています。

関連情報