컬 삭제 명령이 스크립트된 for 루프에서 작동하지 않습니다.

컬 삭제 명령이 스크립트된 for 루프에서 작동하지 않습니다.

컬 명령이 변수를 사용할 수 없는 이유가 있나요?

제 설정입니다. 클라이언트 데이터를 노출할 수 없고, 테스트 환경이 없기 때문에 실제 값을 사용하지 않습니다.

제가 두 개의 컬 명령을 사용하고 있다는 것을 알 수 있을 것입니다. 예, 하나의 명령으로 결합할 수 있다는 것을 알고 있지만 이것이 작동하도록 할 수 없었기 때문에 테스트하기 위해 두 개의 개별 명령으로 분할했습니다.

여기서는 시스템의 인바운드 폴더 경로를 설정했습니다.

[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...편집이 필요 없이 간단히 실행하여 전체 스크립트를 디버깅할 수 있습니다 .

관련 정보