脚本中 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

脚本在 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

知道如何解决这个问题吗?

另外,我无法将此脚本放置在目标计算机上,因为这违反了公司政策。

答案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"

希望这能解决这个问题。

相关内容