서버에서 마지막으로 수정/생성된 파일이 무엇인지 확인한 다음 해당 서버의 홈 디렉터리에 복사한 다음 해당 파일을 노드에서 로컬 컴퓨터로 복사하는 스크립트를 작성하려고 합니다.
저는 이 방법을 배우는 중이라 기술이 전혀 없다는 점을 지적하고 싶습니다.
여기 제 스크립트가 있습니다. "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"
문제가 해결되기를 바랍니다.