스크립트: 시스템 사용자를 기반으로 사서함 SQL 레코드 쓰기

스크립트: 시스템 사용자를 기반으로 사서함 SQL 레코드 쓰기

명령에 문제가 있거나 오류가 표시되지 않습니다. 또한 비활성화된 사용자와 UID가 500을 초과하는 사용자를 제외해야 합니다. 이것은 내가 사용해야하는 SQL 명령입니다

INSERT INTO `mailbox` (`username`, `password`, `name`, `maildir`, `quota`, `local_part`, `domain`, `created`, `modified`, `active`) VALUES ('$username, '$pass', '', '$xxxx', 0, 'xxx', 'xxx', 'date --rfc-3339=date', 'date --rfc-3339=date', 1);"

이것은 제가 쓴 스크립트입니다. 출력 오류입니다.

답변1

문제는 SQL의 백틱이 쉘에 의해 명령 대체로 처리된다는 것입니다. 쉘은 백틱 문자열을 명령으로 실행하여 해당 비트를 특정 명령의 출력으로 바꾸려고 시도합니다.

echo문자열에 큰따옴표가 있기 때문에 쉘이 이를 수행합니다 .

이 특정 문제를 해결하려면 각 백틱을 이스케이프 처리하세요 \`.

이상적으로는 SQL을 작은따옴표로 묶은 문자열로 전달할 수 있지만 이는 변수가 확장되지 않음을 의미합니다.

다음과 같이 하면 더 안전합니다.

printf 'INSERT INTO `mailbox` (`username`, `password`, `name`, `maildir`, `quota`, `local_part`, `domain`, `created`, `modified`, `active`) VALUES ("%s", "%s", "", "%s", 0, "xxx", "xxx", "date --rfc-3339=date", "date --rfc-3339=date", 1);\n' "$username" "$pass" "$xxxx"

...사용 중인 특정 데이터베이스가 큰따옴표로 묶인 필드 데이터를 처리할 수 있다고 가정합니다.

관련 정보