다음 명령에 문제가 있습니다. 다른 사용자를 위해 vncpasswd를 설정하는 스크립트를 작성하고 싶습니다. 다음 명령을 실행하면 현재 사용자에게만 작동합니다.
#< echo "passw0rd\npassw0rd\nn" | vncpasswd
그러나 다음 명령을 실행할 때 결과 에코가 더 이상 프로그램에 유효한 입력이 아니기 때문에 문제가 발생합니다.
#< su nonrootuser -c "echo "passw0rd\npassw0rd\nn" | vncpasswd"
#> Using password file /home/nonrootuser/.vnc/passwd
#> Password: Warning: password truncated to the length of 8.
#> Verify: Passwords do not match. Please try again.
답변해주셔서 감사합니다! :디
답변1
쉘에 따라 이 echo
명령은 백슬래시를 개행 문자로 확장할 수도 있고 수행하지 않을 수도 있습니다 \n
. 예를 들어 bash는 기본적으로 이 작업을 수행하지 않지만 shopt -s xpg_echo
.
echo
그러나 내장 함수가 sh
컴퓨터에서 백슬래시 확장을 수행 하더라도 명령을 작성한 방식으로 인해 코드가 해당 작업을 트리거하지 않습니다. 명령 echo passw0rdnpassw0rdnn | vncpasswd
에 문자열을 전달합니다 . 두 번째 큰따옴표는 큰따옴표로 묶인 문자열 리터럴을 종료하고 세 번째 큰따옴표는 큰따옴표로 묶인 새 문자열 리터럴을 시작하므로 해당 시퀀스는 셸에서 큰따옴표 안에 있지 않으므로 로 확장됩니다 . 당신은 원래 다음과 같은 것을 쓰고 싶었습니다.su
\n
\n
n
su nonrootuser -c "echo -e 'passw0rd\npassw0rd\nn' | vncpasswd"
이렇게 하면 백슬래시가 두 셸을 문자 그대로 통과하여 백슬래시 확장을 수행하도록 지시하는 옵션을 전달할 수 -e
있습니다 echo
.
echo
그러나 완전히 이식 가능하지 않은 방식으로 만지작거리는 대신에 호출 printf
(완전히 신뢰할 수 있음)하거나 echo
각 라인에 대해 한 번씩 실행하십시오.
su nonrootuser -c "{ echo 'passw0rd'; echo 'passw0rd'; echo n; } | vncpasswd"
su nonrootuser -c "printf '%s\n' 'passw0rd' 'passw0rd' n | vncpasswd"
su nonrootuser -c "
vncpasswd <<EOF
passw0rd
passw0rd
n
EOF"