난 달린다:
sshpass -p 'OldPassword' ssh -o StrictHostKeyChecking=no [email protected] 'echo "Te3EQeF2U!-Em_C3eBU6A&a=u2$e28*c" | passwd root --stdin'
내 비밀번호에 특수 문자가 포함 echo "Te3EQeF2U!-Em_C3eBU6A&a=u2$e28*c"
되어 있다는 것을 몰랐습니다 .bash: !-Em_C3eBU6A: event not found
이를 바탕으로 누구든지 내 비밀번호를 무엇으로 설정했는지 알아낼 수 있나요?
답변1
시도해 볼 수 있나요 Te3EQeF2U!-Em_C3eBU6A&a=u2*c
? 이것은 가상 머신에서 복사할 때 효과적이었습니다.
참고로 저는 이렇게 했습니다.
CentOS 가상 머신에서:
$ mv /usr/bin/passwd /usr/bin/passwd.orig
$ vim /usr/bin/passwd
<INSERT>
while read line
do
echo "$line" >> /tmp/passwd
done < /dev/stdin
<SAVE>
이는 바이너리를 동일한 입력을 받아 간단히 쓰는 바이너리 passwd
로 대체합니다 .passwd --stdin
/tmp/passwd
그러다가 달려가서 들어 sshpass -p '<VM-PASSWORD>' ssh -o StrictHostKeyChecking=no root@<VM-IP> 'echo "Te3EQeF2U!-Em_C3eBU6A&a=u2$e28*c" | passwd root --stdin'
갔어Te3EQeF2U!-Em_C3eBU6A&a=u2*c
/tmp/passwd
완료되면 passwd
원본 바이너리를 다시 옮기십시오.
답변2
그냥 사용하면 안 되나요 echo 'root:password' | chpasswd
(또는 ... | chpasswd -e
비밀번호가 이미 암호화된 경우)? 그것이 chpasswd
목적입니다. man chpasswd
자세한 내용 및 기타 옵션을 확인하세요 .
또한 문자열을 올바르게 인용하거나 암호를 입력해야 합니다. ( 비어 있을 수 있는 $e28
변수의 값으로 확장됨 ) 을 포함하므로 큰따옴표로 묶는 것을 원하지 않을 것입니다 .$e28
$
따라서 as 를 이스케이프 처리 \$
하거나 전체 비밀번호 문자열을 작은따옴표로 묶어야 합니다. ssh
명령이 이미 작은따옴표로 묶여 있기 때문에 이는 약간 어렵습니다 . 다행스럽게도 작은따옴표 안에 작은따옴표를 삽입하는 표준적이고 안정적인 방법이 있습니다. 즉, 를 사용하는 것입니다 '\''
.
sshpass -p 'OldPassword' ssh -o StrictHostKeyChecking=no \
[email protected] 'echo '\''root:Te3EQeF2U!-Em_C3eBU6A&a=u2$e28*c'\'' | chpasswd'
더 좋은 점은 다음과 같이 사용하는 것이 더 간단할 것입니다.
echo 'root:Te3EQeF2U!-Em_C3eBU6A&a=u2$e28*c' | ssh [email protected] chpasswd