| --admin= (둘 중 하나) --device=pi-01 장치 HMAC 키를 새로 만들고, 서버 UPDATE 문과 Pi 쪽 절차를 출력 --admin=admin 새 비밀번호를 STDIN 으로 받아 Argon2id 해시와 UPDATE 문을 출력 출력된 SQL 을 phpMyAdmin 에서 실행하십시오. 이 도구는 DB 를 건드리지 않습니다. TXT); exit(2); } /** MySQL 문자열 리터럴. 여기서 만드는 값은 hex/해시뿐이지만, 식별자는 운영자 입력이다. */ function sql_quote(string $s): string { return "'" . str_replace(["\\", "'"], ["\\\\", "''"], $s) . "'"; } if ($device !== null) { if (!is_string($device) || !preg_match('/^[A-Za-z0-9._-]{1,64}$/', $device)) { fwrite(STDERR, "device_id 형식이 올바르지 않습니다(영숫자 . _ - , 64자 이내): {$device}\n"); exit(1); } $secret = bin2hex(random_bytes(DEVICE_SECRET_BYTES)); $secret_q = sql_quote($secret); $q = sql_quote($device); echo << 190) { fwrite(STDERR, "username 이 비었거나 너무 깁니다.\n"); exit(1); } fwrite(STDERR, "새 비밀번호 (화면에 표시되지 않음, " . MIN_PASSWORD_LEN . "자 이상): "); $plain = read_secret_line(); fwrite(STDERR, "\n한 번 더: "); $again = read_secret_line(); fwrite(STDERR, "\n"); if ($plain !== $again) { fwrite(STDERR, "두 입력이 다릅니다. 중단합니다.\n"); exit(1); } if (strlen($plain) < MIN_PASSWORD_LEN) { fwrite(STDERR, "비밀번호가 " . MIN_PASSWORD_LEN . "자 미만입니다. 중단합니다.\n"); exit(1); } $hash = Password::hash($plain); $plain = $again = ''; // 이 프로세스가 더 들고 있을 이유가 없다 $q = sql_quote($admin); $h = sql_quote($hash); echo <</dev/null && echo ok')) === 'ok'; if (!$hidden) { fwrite(STDERR, "\n (경고: 이 터미널에서는 입력을 숨길 수 없었습니다. 화면과 히스토리를 확인하십시오)\n"); } } $line = fgets(STDIN); if ($hidden) { @shell_exec('stty echo 2>/dev/null'); } if ($line === false) { fwrite(STDERR, "입력을 읽지 못했습니다.\n"); exit(1); } return rtrim($line, "\r\n"); }