다른 사용자를 위한 명령줄 애플리케이션 자동화

다른 사용자를 위한 명령줄 애플리케이션 자동화

다음 명령에 문제가 있습니다. 다른 사용자를 위해 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\nn

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"

관련 정보