컬 명령이 변수를 사용할 수 없는 이유가 있나요?
제 설정입니다. 클라이언트 데이터를 노출할 수 없고, 테스트 환경이 없기 때문에 실제 값을 사용하지 않습니다.
제가 두 개의 컬 명령을 사용하고 있다는 것을 알 수 있을 것입니다. 예, 하나의 명령으로 결합할 수 있다는 것을 알고 있지만 이것이 작동하도록 할 수 없었기 때문에 테스트하기 위해 두 개의 개별 명령으로 분할했습니다.
여기서는 시스템의 인바운드 폴더 경로를 설정했습니다.
[root@acme logs]# act="roadrunner"
[root@acme logs]# content="xml"
[root@acme logs]# inbndfldr='/ftp/'"$act"'/inbound'
[root@acme logs]# destinationFolder="$inbndfldr"/"$content"/
[root@acme logs]# logFolder="$inbndfldr"/logs
여기서는 원격 시스템의 아웃바운드 폴더 경로를 설정했습니다.
[root@acme logs]# targetHost="SFTP://welcometotheroad.net"
[root@acme logs]# THFolderName="OUTBOUND"
[root@acme logs]# THFolder='/'"$THFolderName"
[root@acme logs]# THSftpAddress=$targetHost$THFolder
[root@acme logs]# THDeleteSftpAddress=$targetHost$THFolder'/'
여기에서는 원격 시스템에 대한 인증을 설정합니다.
[root@acme logs]# username=mrRoadRunner
[root@acme logs]# password=Beep-8eep!
[root@acme logs]# sessionAuthentication="$username":"$password"
여기에서 파일 참조를 설정했습니다.
[root@acme logs]# fileref="openroad2019.xml"
여기서는 파일이 원격 서버에 존재하는지 확인합니다.
[root@acme logs]# THFiles=$(curl -sSk -u $sessionAuthentication $THSftpAddress | grep $fileref | awk '{print $9}')
[root@acme logs]# echo $THFiles
[root@acme logs]# openroad2019.xml
여기에서 루프를 시작합니다.
[root@acme logs]# for targetFile in $THFiles
> do
> dateTimeStamp=`date +%Y%m%d%H%M%S`
> traceLog="$logFolder"/"$targetFile"trace"$dateTimeStamp".log
> testLog="$logFolder"/test"$dateTimeStamp".log
> deltraceLog="$logFolder"/del"$targetFile"trace"$dateTimeStamp".log
> deltestLog="$logFolder"/deltest"$dateTimeStamp".log
> deleteString='"-rm '"$THFolderName"'/'"$targetFile"'"'
> masterGetStr=`echo curl \-k \-\-trace "$traceLog" \-\-user "$sessionAuthentication" \-O "$THSftpAddress"\/"$targetFile" \-\-ftp\-ssl \&\>\>"$testLog" 2\>\&1`
> masterDeleteStr=`echo curl \-sSk \-\-trace $deltraceLog \-u $sessionAuthentication $THDeleteSftpAddress \-Q$deleteString \&\>\> $deltestLog 2\>\&1`
> echo
> echo \-\-\-\-\-
> echo "$masterGetStr"
> echo \-\-
> echo "$masterDeleteStr"
> echo \-\-\-\-\-
> echo
> curl -k --trace "$traceLog" --user "$sessionAuthentication" -O "$THSftpAddress"/"$targetFile" --ftp-ssl &>> "$testLog" 2>&1
> curl -sSk --trace $deltraceLog -u $sessionAuthentication $THDeleteSftpAddress -Q$deleteString &>> $deltestLog 2>&1
> done
출력은 다음과 같습니다.
-----
curl -k --trace /ftp/roadrunner/inbound/logs/openroad2019.xmltrace20190628180349.log --user mrRoadRunner:Beep-8eep! -O SFTP://welcometotheroad.net/OUTBOUND/openroad2019.xml --ftp-ssl &>>/ftp/roadrunner/inbound/logs/test20190628180349.log 2>&1
--
curl -sSk --trace /ftp/roadrunner/inbound/logs/delopenroad2019.xmltrace20190628180349.log -u mrRoadRunner:Beep-8eep! SFTP://welcometotheroad.net/OUTBOUND/ -Q"-rm OUTBOUND/openroad2019.xml" &>> /ftp/roadrunner/inbound/logs/deltest20190628180349.log 2>&1
-----
첫 번째 컬 명령은 제대로 작동하고 필요한 위치에 파일을 저장합니다.
두 번째 컬 명령은 원격 시스템의 파일을 삭제해야 하지만 작동하지 않습니다. 여기에서 관련 로그를 확인합니다.
::::::::::::::
delopenroad2019.xmltrace20190628180349.log
::::::::::::::
== Info: Trying 0.0.0.0...
== Info: TCP_NODELAY set
== Info: Connected to welcometotheroad.net (0.0.0.0) port 22 (#0)
== Info: SSH MD5 fingerprint: Th3re1$4WarpDr1v3N$+4r$#1P!
== Info: SSH authentication methods available: publickey,password
== Info: Using SSH private key file '/root/.ssh/id_rsa'
== Info: SSH public key authentication failed: Username/PublicKey combination invalid
== Info: Initialized password authentication
== Info: Authentication complete
== Info: Sending quote commands
== Info: Syntax error in SFTP command. Supply parameter(s)!
== Info: Connection #0 to host welcometotheroad.net left intact
== Info: getaddrinfo(3) failed for OUTBOUND:80
== Info: Couldn't resolve host 'OUTBOUND'
== Info: Closing connection 1
::::::::::::::
deltest20190628180349.log
::::::::::::::
curl: (21) Syntax error in SFTP command. Supply parameter(s)!
curl: (6) Couldn't resolve host 'OUTBOUND'
::::::::::::::
test20190628180349.log
::::::::::::::
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 4290 100 4290 0 0 3248 0 0:00:01 0:00:01 --:--:-- 3252
100 4290 100 4290 0 0 3247 0 0:00:01 0:00:01 --:--:-- 3247
[root@acme logs]#
그러나 명령을 수동으로 입력하면 원격 시스템에서 파일이 작동하고 삭제됩니다.
curl -sSk --trace /ftp/roadrunner/inbound/logs/delopenroad2019.xmltrace20190628180349.log -u mrRoadRunner:Beep-8eep! SFTP://welcometotheroad.net/OUTBOUND/ -Q"-rm OUTBOUND/openroad2019.xml" &>> /ftp/roadrunner/inbound/logs/deltest20190628180349.log 2>&1
[root@rh1 logs]# more *20190628180546*.log
::::::::::::::
openroad2019.xmltrace20190628180546.log
::::::::::::::
Info: Trying 0.0.0.0...
== Info: TCP_NODELAY set
== Info: Connected to welcometotheroad.net (0.0.0.0) port 22 (#0)
== Info: SSH MD5 fingerprint: Th3re1$4WarpDr1v3N$+4r$#1P!
== Info: SSH authentication methods available: publickey,password
== Info: Using SSH private key file '/root/.ssh/id_rsa'
== Info: SSH public key authentication failed: Username/PublicKey combination invalid
== Info: Initialized password authentication
== Info: Authentication complete
<= Recv data, 2000 bytes (0x7d0)
0000: ef bb bf 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e ...<?xml version
...
... (details removed)
...
0110: 6e 73 74 72 75 63 74 69 6f 6e 73 48 65 61 64 65 nstructionsHeade
0120: 72 3e r>
== Info: Connection #0 to host welcometotheroad.net left intact
::::::::::::::
del_openroad2019.xmltrace20190628180546.log
::::::::::::::
== Info: Trying 0.0.0.0...
== Info: TCP_NODELAY set
== Info: Connected to welcometotheroad.net (0.0.0.0) port 22 (#0)
== Info: SSH MD5 fingerprint: Th3re1$4WarpDr1v3N$+4r$#1P!
== Info: SSH authentication methods available: publickey,password
== Info: Using SSH private key file '/root/.ssh/id_rsa'
== Info: SSH public key authentication failed: Username/PublicKey combination invalid
== Info: Initialized password authentication
== Info: Authentication complete
=> Send data, 55 bytes (0x37)
0000: 64 72 77 78 72 2d 78 2d 2d 2d 20 32 20 66 74 70 drwxr-x--- 2 ftp
0010: 61 64 6d 69 6e 20 66 74 70 61 64 6d 69 6e 20 20 admin ftpadmin
...
... (details removed)
...
0050: 30 30 2d 32 36 37 36 39 36 37 33 5f 44 49 5f 4c 00-26769673_DI_L
0060: 45 30 2e 58 4d 4c 0a E0.XML.
== Info: Sending quote commands
== Info: Connection #0 to host welcometotheroad.net left intact
::::::::::::::
delopenroad2019.xmltrace20190628180546.log
::::::::::::::
== Info: Trying 0.0.0.0...
== Info: TCP_NODELAY set
== Info: Connected to welcometotheroad.net (0.0.0.0) port 22 (#0)
== Info: SSH MD5 fingerprint: Th3re1$4WarpDr1v3N$+4r$#1P!
== Info: SSH authentication methods available: publickey,password
== Info: Using SSH private key file '/root/.ssh/id_rsa'
== Info: SSH public key authentication failed: Username/PublicKey combination invalid
== Info: Initialized password authentication
== Info: Authentication complete
== Info: Sending quote commands
== Info: Syntax error in SFTP command. Supply parameter(s)!
== Info: Connection #0 to host welcometotheroad.net left intact
== Info: getaddrinfo(3) failed for OUTBOUND:80
== Info: Couldn't resolve host 'OUTBOUND'
== Info: Closing connection 1
::::::::::::::
del_test20190628180546.log
::::::::::::::
drwxr-x--- 2 ftpadmin ftpadmin 0 Jun 28 23:38 .
drwxr-x--- 2 ftpadmin ftpadmin 0 Apr 26 2019 ..
-rwxr-x--- 1 ftpadmin ftpadmin 7780 Jun 27 14:36 NextFile20190620172738.XML
-rwxr-x--- 1 ftpadmin ftpadmin 2440 Jun 27 14:36 NextFile20190620172740.XML
-rwxr-x--- 1 ftpadmin ftpadmin 7980 Jun 27 14:36 NextFile20190624111531.XML
-rwxr-x--- 1 ftpadmin ftpadmin 2441 Jun 27 14:36 NextFile20190624111533.XML
-rwxr-x--- 1 ftpadmin ftpadmin 7858 Jun 27 14:36 NextFile20190626165728.XML
-rwxr-x--- 1 ftpadmin ftpadmin 2500 Jun 27 14:36 NextFile20190626165729.XML
-rwxr-x--- 1 ftpadmin ftpadmin 15424 Jun 27 14:36 NextFile20190627091426.XML
-rwxr-x--- 1 ftpadmin ftpadmin 4104 Jun 27 14:37 NextFile20190627091427.XML
-rwxr-x--- 1 ftpadmin ftpadmin 10417 Jun 27 14:37 NextFile20190627092525.XML
-rwxr-x--- 1 ftpadmin ftpadmin 3071 Jun 27 14:37 NextFile20190627092527.XML
-rwxr-x--- 1 ftpadmin ftpadmin 15594 Jun 27 14:37 NextFile20190627093345.XML
-rwxr-x--- 1 ftpadmin ftpadmin 4279 Jun 27 14:37 NextFile20190627093347.XML
-rwxr-x--- 1 ftpadmin ftpadmin 17237 Jun 27 14:37 NextFile20190627094528.XML
-rwxr-x--- 1 ftpadmin ftpadmin 4290 Jun 27 14:37 NextFile20190627094530.XML
-rwxr-x--- 1 ftpadmin ftpadmin 15608 Jun 27 14:37 NextFile20190627100222.XML
-rwxr-x--- 1 ftpadmin ftpadmin 4288 Jun 27 14:37 NextFile20190627100224.XML
-rwxr-x--- 1 ftpadmin ftpadmin 2455 Jun 27 14:37 NextFile20190627102026.XML
-rwxr-x--- 1 ftpadmin ftpadmin 7858 Jun 27 15:18 NextFile20190627111647.XML
-rwxr-x--- 1 ftpadmin ftpadmin 2500 Jun 27 15:18 NextFile20190627111648.XML
-rwxr-x--- 1 ftpadmin ftpadmin 7858 Jun 27 18:56 NextFile20190627145327.XML
-rwxr-x--- 1 ftpadmin ftpadmin 2500 Jun 27 18:56 NextFile20190627145328.XML
-rwxr-x--- 1 ftpadmin ftpadmin 12797 Jun 27 20:08 NextFile20190627160344.XML
-rwxr-x--- 1 ftpadmin ftpadmin 3609 Jun 27 20:08 NextFile20190627160345.XML
내 질문은 "왜 루프에서 작동하지 않습니까?"입니다.
답변1
변수에 따옴표를 추가하지 마세요.
쉘 명령 구문 분석은 명시적이고 고정된 순서로 발생하며 변수 대체(공식 매개변수 확장)가 수행됩니다(예!)뒤쪽에명령줄 인용문을 처리합니다. 당신이 할 때
deleteString='"-rm '"$THFolderName"'/'"$targetFile"'"'
...
curl ... -Q$deleteString ...
"-rm OUTBOUND/openroad2019.xml"
값을 변수에 넣고 값이 대체되면 공백(또는 일반적으로 IFS)으로 분할되어 전달됩니다.둘다른 매개변수 중에서 컬에 대한 매개변수는 다음과 같습니다.
...
-Q"-rm
OUTBOUND/openroad2019.xml"
...
이들 중 첫 번째는 원격 서버를 혼란스럽게 하고 오류를 생성합니다.
Syntax error in SFTP command. Supply parameter(s)!
두 번째 URL은 컬에 의해 액세스할 두 번째 URL로 처리되므로 OUTBOUND가 유효한 호스트 이름이 아니라고 올바르게 불평하게 됩니다.
대신 변수 값에 공백을 인용하고 큰따옴표로 묶으십시오.치환공백을 유지하되 어떤 종류의 따옴표도 추가하지 마세요.존재하다값:
deleteString="-rm $THFolderName/$targetfile"
...
curl ... -Q"$deleteString" ...
# or if you prefer
curl ... "-Q$deleteString" ...
# (-Q are not special to shell so it doesn't matter if they're quoted)
# or more simply drop the extra variable and just
curl ... -Q"-rm $THFolderName/$targetfile" ...
그리고for 루프와는 아무런 관련이 없습니다변수에만 관련됩니다.
참고로, 귀하의 복잡하고 투박한 echo
명령은 분명히 쉘의 기능을 "재창조"하려고 시도하고 있지만 실제로는 그렇게 하지 않으며 아마도 오해를 불러일으켜 시간을 낭비하고 있을 것입니다. 쉘이 명령을 확장하고 실행하는 방법을 알고 싶다면 옵션을 설정 x
하고그것은 당신에게 말할 것입니다. 특정 명령(여기서는 두 개)에 대해 set -x
이전 및 set +x
이후 작업을 수행합니다. 스크립트의 경우 sh -x script args...
편집이 필요 없이 간단히 실행하여 전체 스크립트를 디버깅할 수 있습니다 .