메뉴 닫기

쉘 스크립트 제작 중 발생했던 ‘/r’: command not found 해결 방안

오브젝트 스토리지는 다양하고 간편한 프로그램을 폭넓게 지원하는것이 특징으로 스크립트를 작성한다면 주기적인 파일의 업로드도 가능합니다. 이번 문제는 curl을 통한 파일 업로드 스크립트를 제작 중 발생했으며 보통 curl을 통해 오브젝트 스토리지를 사용하려면 아래와 같은 X-Auth-Token의 토큰 값이 필요하고 해당 토큰은 일정 시간이 지나면 갱신을 진행 해야하는 특성을 가지고 있습니다. 

“차라리 쉽고 빠른 프로그램을 사용하면 되지 않는가?”

라는 생각이 들 수 있으나 curl 명령어는 리눅스/윈도우에서 기본적으로 제공하고 있기에 서버 등에서 별도로 프로그램을 설치하지 않아도 되는 좋은 장점이 있어 우분투 계열에서 스크립트 제작을 진행하는중입니다. 내용이 너무 길다고 생각되시면 맨 밑의 참고 사항만 확인하시는것을 권장하며 해당 글로 인한 문제에 관해서는 책임을 지지 않습니다.

HTTP/1.1 204 No Content
X-Storage-Url: http://xxx.xxx.xxx.xxx/swift/v1/AUTH_fewafeafewagvfdzgragrvfafgewafdsaghtrjytfkuf
X-Storage-Token: AUTH_rgwtk48489489436453123185443864863484563486348693487867863as863w748693qg8f3dz748
X-Auth-Token: AUTH_rgwtk48489489436453123185443864863484563486348693487867863as863w748693qg8f3dz748
X-Trans-Id: tx00000000000000fedafeawc-rghrtehs2221-26316886c-default
X-Openstack-Request-Id: tx00000000000000fedafeawc-rghrtehs2221-26316886c-default
Content-Type: application/json; charset=utf-8
Date: Wed, 04 Jan 2023 05:40:34 GMT

# X-Auth-Token 키 확인 명령어
스크립트를 제작하기 전에 중요한 점은 수동으로 명령어를 사용하면서 문제없이 작동하는지 확인하는 것입니다.

curl -s -i -g -X GET “xxx.xxx.xxx.xxx/auth/” -H “X-Auth-User: 유저ID:엑세스 키” -H “X-Auth-Key: 시크릿 키” |grep X-Auth-Token | awk ‘{print $2}’

# 결과 값
명령어를 사용하면 awk를 통해 토큰 값만 출력되는것을 확인할수 있습니다.

AUTH_rgwtkafjio3anbh49apvbf8cvah80a409gf4uiogh890rasdfbfah804an3124fdsav4r8a6ghr1ae23

# 버킷의 파일/폴더 리스트 확인
출력 된 토큰 값으로 버킷 내부에 있는 파일/폴더의 리스트를 확인했습니다.

curl -i -X GET xxx.xxx.xxx.xxx/swift/v1/유저ID/버킷명 -H “X-Auth-Token:AUTH_rgwtkafjio3anbh49apvbf8cvah80a409gf4uiogh890rasdfbfah804an3124fdsav4r8a6ghr1ae23”

# 파일/폴더 리스트 출력 확인
리스트가 정상적으로 보이는것이 확인되며 해당 명령어로 쉘 스크립트로 만들어도 문제가 없겠다는 생각이 들었습니다.

2022-12-03_backup
2022-12-30_backup
2023-01-03_backup

# 스크립트 제작 (X-Auth-Token 키 생성/리스트 출력)
위에서 적은 명령어를 기반으로 간단한 스크립트를 제작했습니다.

#!/bin/bash

# 토큰 생성을 위한 변수
token_create=`curl -s -i -g -X GET “xxx.xxx.xxx.xxx/auth/” -H “X-Auth-User: 유저ID:엑세스 키” -H “X-Auth-Key: 시크릿 키” |grep X-Auth-Token | awk ‘{print $2}’`

# 리스트 확인을 위한 명령어
curl -i -X GET xxx.xxx.xxx.xxx/swift/v1/유저ID/버킷명 -H “X-Auth-Token:${token_create}”

# 명령어 사용
스크립트의 내용대로라면 파일/폴더의 리스트가 출력되어야하나 정상적으로 리스트를 받아오지 못합니다.

HTTP/1.1 401 Unauthorized
Content-Length: 12
X-Trans-Id: tx00000000000048645636-0fea186ae7d-dffe48w6a6c-default
X-Openstack-Request-Id: tx00000000000048645636-0fea186ae7d-dffe48w6a6c-default
Accept-Ranges: bytes
Content-Type: text/plain; charset=utf-8
Date: Wed, 04 Jan 2023 06:23:41 GMT

# 문제 확인 진행

#!/bin/bash

# 토큰 생성을 위한 변수
token_create=`curl -s -i -g -X GET “xxx.xxx.xxx.xxx/auth/” -H “X-Auth-User: 유저ID:엑세스 키” -H “X-Auth-Key: 시크릿 키” |grep X-Auth-Token | awk ‘{print $2}’`

echo “${token_create}”

# 출력 값
AUTH_rgwtkafjio3anbh49apvbf8aefawfeghf33221j8uf9ir664wat231572dqafasfsac35ik

# 토큰을 복사 후 파일/리스트를 명령어로 정상 출력 확인
curl -i -X GET xxx.xxx.xxx.xxx/swift/v1/유저ID/버킷명 -H “X-Auth-Token:AUTH_rgwtkafjio3anbh49apvbf8aefawfeghf33221j8uf9ir664wat231572dqafasfsac35ik”

2022-12-03_backup
2022-12-30_backup
2023-01-03_backup

# 해결책 확인
위와 같이 token_create 변수를 통해 생성된 값을 복사해서 사용하면 문제없이 리스트가 출력되는걸 알 수 있습니다. 그러면 어디가 문제일까요? 스크립트의 내용을 다시 바꿔서 상황을 확인 했습니다.

#!/bin/bash

# 토큰 생성을 위한 변수
token_create=`curl -s -i -g -X GET “xxx.xxx.xxx.xxx/auth/” -H “X-Auth-User: 유저ID:엑세스 키” -H “X-Auth-Key: 시크릿 키” |grep X-Auth-Token | awk ‘{print $2}’`

${token_create}

# 출력 값
$’AUTH_rgwtka414g864wac84bg8r6a4er86aw3486y4464gf86ag4r86a34286zs7s\r’: command not found

# 원인
‘\r’: command not found은 주로 윈도우(DOS)에서 가져온 스크립트를 리눅스(UNIX) 계열에서 가져올때 발생할수도 있는 문제로 확인되며 정상적인 값에 ‘\r’이 추가되어 발생한 문제로 확인됩니다. 출력 값은 파일 내부에 저장되는 형태가 아니기에 sed 기능을 통해 토큰 값 마지막에 발생하는 ‘\r’을 제거 하겠습니다.

#!/bin/bash

# 토큰 생성을 위한 변수에 ‘\r’을 제거하기위한 sed ‘s/\r$//’ 명령어를 추가
token_create=`curl -s -i -g -X GET “xxx.xxx.xxx.xxx/auth/” -H “X-Auth-User: 유저ID:엑세스 키” -H “X-Auth-Key: 시크릿 키” |grep X-Auth-Token | awk ‘{print $2}’ |sed ‘s/\r$//’`

# 리스트 확인을 위한 명령어
curl -i -X GET xxx.xxx.xxx.xxx/swift/v1/유저ID/버킷명 -H “X-Auth-Token:${token_create}”

# 파일/폴더 리스트 출력 확인
토큰 값에 추가로 입력된 ‘\r’을 제거 후 스크립트가 정상적으로 작동하는것을 확인했습니다. 

2022-12-03_backup
2022-12-30_backup
2023-01-03_backup

※ 참고 

1. 윈도우에서 가져온 쉘 스크립트 내부에 ‘\r’이 포함되어있는 경우

cp 스크립트 스크립트_backup
sed -i ‘s/\r$//’ 스크립트 

2. 변수 등을 통해 출력되는 값에 ‘\r’이 포함되어있는 경우
변수 뒤에 |(파이프)와 sed를 사용하여 변수가 출력될때 ‘\r’이 출력되지 않게 합니다.

|sed ‘s/\r$//’
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x