Bash 스크립트에서 두 문자열을 연결하려고 하는데 예상한 결과를 얻을 수 없습니다.
USERNAME="ubuntu"
MASTER="some IP"
KEYFILE="/Path/to/keyfile.pem"
STR1=`sudo ssh -q -t -o StrictHostKeyChecking=no -i $KEYFILE $USERNAME@$MASTER -p 22 'sudo hostname'`
STR2=`sudo ssh -q -t -o StrictHostKeyChecking=no -i $KEYFILE $USERNAME@$MASTER -p 22 "sudo grep search /etc/resolv.conf"`
STR2=`echo $STR2 | awk '{print $2}'`
echo $STR1
echo $STR2
STR3="$STR1""$STR2" #OR "$STR1$STR2" OR $STR1$STR2
echo "$STR3" # OR $STR3
OUTPUT:
ip-10-30-209-xx
ap-xxx-1.compute.internal
ap-xxx-1.compute.internal
두 번째 문자열만 얻었지만 첫 번째 문자열은 무시됩니다. 여기서 예상한 결과를 얻지 못하는 이유는 무엇입니까?
또 다른 흥미로운 점은 호기심에서 문자열을 역순으로 연결하면 STR3=$STR2$STR1
출력이 심지어 이상해진다는 것입니다 ip-10-30-209-xx.compute.internal
. 여기 완전 헷갈려요..
답변1
두 번째 문자열은 무시되지 않고 숨겨집니다. 보려면 실행하세요.
echo "$STR3" | cat -v
문제 STR1
는입력하다특징. 이 문자는 터미널에 커서를 줄의 시작 부분으로 다시 이동하라고 지시합니다. 일반 개행 문자 앞에 표시됩니다. 발행된 이유는 해당 옵션을 사용하여 터미널을 에뮬레이트하도록 SSH에 지시하여 -t
항목이 올바르게 표시되도록 준비하기 때문입니다. 문자열로 출력을 캡처할 때 유용한 결과를 제공하지 않습니다.
표시되는 명령은 모든 사용자로 실행할 수 있으므로 sudo가 필요하지 않습니다. sudo가 필요하지 않은 경우에는 필수가 아닙니다 -t
.
STR1=`ssh -q -i "$KEYFILE" "$USERNAME@$MASTER" -p 22 'hostname'`
STR2=`ssh -q -i "$KEYFILE" "$USERNAME@$MASTER" -p 22 "grep search /etc/resolv.conf" | awk {print $2}`
STR3="$STR1$STR2"
실제 스크립트에 반드시 sudo가 필요한 경우 캐리지 리턴을 제거하십시오.
STR=`ssh -t … 'sudo mycommand' | tr -d '\r'`
ssh와 sudo를 결합하는 것은 번거롭습니다. 모든 권한 에스컬레이션에 SSH를 사용하는 것이 더 쉽습니다. 이를 위해서는 SSH를 사용하여 루트 계정에 로그인할 수 있도록 허용해야 합니다. 다른 곳에서 읽을 수 있는 내용과 달리 이는 본질적으로 안전하지 않습니다.로컬 사용자에서 루트로 권한 상승의 위험이 종종 과대평가됩니다.) 공격자가 sudoer 계정에 액세스할 수 있으면 루트에도 액세스할 수 있습니다. 하지만 유용한 로그를 유지하려면 로그를 제한하는 것이 가장 좋습니다.직접루트 계정에 액세스합니다. 다음 지시어를 입력하면 로컬 사용자에게 루트 권한에 대한 액세스 권한을 부여할 수 있습니다 sshd_config
.
PermitRootLogin no
…
Match Address 127.0.0.1,::1
PermitRootLogin yes
Match User root
PasswordAuthentication no
GSSAPIAuthentication
KbdInteractiveAuthentication no
그러면 루트는 SSH를 통해 로그인할 수 있지만 키 인증과 localhost를 통해서만 로그인할 수 있습니다. 키를 설정한 후 SSH 로그인을 연결할 수 있습니다.
STR=`ssh … 'ssh root@localhost "mycommand"'`
답변2
스크립트 출력을 표시하지 않았거나 STR2에 이상한 값이 있습니다.
다음으로 끝나도록 스크립트를 업데이트하세요.
#!/bin/bash
STR1="ip-10-30-209-xx"
STR2="a ap-xxx-1.compute.internal"
STR2=`echo $STR2 | awk '{print $2}'`
echo 'str1['$STR1']'
echo 'str2['$STR2']'
STR3="$STR1""$STR2" #OR "$STR1$STR2" OR $STR1$STR2
echo 'str3['"$STR3"']'
이것은 만든다:
str1[ip-10-30-209-xx]
str2[ap-xxx-1.compute.internal]
str3[ip-10-30-209-xxap-xxx-1.compute.internal]
그 다음에서서히과제를 자신의 과제로 바꾸기