bash-herestring-newline-secrets
bashのヒアストリング(`<<<`)でGoogle Cloudシークレット(またはそれに類するもの)を作成する際に、末尾の改行が原因で発生するパスワード/シークレット認証エラーを修正します。以下の場合に使用してください:(1) パスワード認証が失敗するが、パスワード自体は正しい、(2) `<<< "value"`構文でシークレットを作成している、(3) 値は正しいのに「password authentication failed」や「invalid token」などのエラーが発生している。bashのヒアストリング(`<<<`)は末尾に改行を追加するため、シークレットが破損します。
description の原文を見る
Fix password/secret authentication failures caused by trailing newlines when creating Google Cloud secrets (or similar) with bash here-strings. Use when: (1) Password authentication fails with correct password, (2) Secret created with `<<< "value"` syntax, (3) Error like "password authentication failed" or "invalid token" despite correct value. Bash here-strings (`<<<`) add a trailing newline that corrupts secrets.
SKILL.md 本文
Bash ここ文字列のシークレット内の改行
問題
bash ここ文字列(<<<)を使用してシークレットを作成する場合、値の末尾に改行が自動的に追加されます。これにより認証に失敗し、実際はパスワード/トークンが正しいのに誤った改行文字が含まれているだけなのに、パスワード/トークンが間違っているかのような誤解を招くエラーメッセージが表示されます。
コンテキスト / トリガー条件
- シークレット作成コマンド:
gcloud secrets create NAME --data-file=- <<< "value" - または同様の例:
echo "value" | gcloud secrets create...(echo はデフォルトで改行を追加) - エラーメッセージの例:
- "password authentication failed for user X"
- "invalid token"
- "authentication failed"
- シークレット値は表示上正しく見える
- ローカルでは動作するがシークレット使用時に失敗する
解決策
間違った例(改行が追加される):
gcloud secrets create my-secret --data-file=- <<< "mypassword"
echo "mypassword" | gcloud secrets create my-secret --data-file=-
正しい例(改行なし):
echo -n "mypassword" | gcloud secrets create my-secret --data-file=-
printf '%s' "mypassword" | gcloud secrets create my-secret --data-file=-
既存のシークレットを修正する場合:
echo -n "correct-value" | gcloud secrets versions add my-secret --data-file=-
検証
シークレットの長さをチェックして末尾の改行を検出します:
# シークレットを取得してバイト数をカウント
gcloud secrets versions access latest --secret=my-secret | wc -c
# 期待される長さと比較(パスワード長 + 1 ではなくパスワード長)
または xxd を使用して実際のバイトを確認します:
gcloud secrets versions access latest --secret=my-secret | xxd | tail -1
# 末尾の '0a'(改行) を探す
例
症状:
Database connection test failed: password authentication failed for user "crawler"
調査:
$ gcloud secrets versions access latest --secret=my-db-password
mypassword
$ gcloud secrets versions access latest --secret=my-db-password | wc -c
11 # しかしパスワードは 10 文字のはず!
修正:
$ echo -n "mypassword" | gcloud secrets versions add my-db-password --data-file=-
Created version [2] of the secret [my-db-password].
注記
- これはシークレットを使用するすべてのシステムに影響します: データベース、API、トークンなど
<<<ここ文字列は bash 機能で常に改行を追加しますechoもデフォルトで改行を追加します。echo -nまたはprintf '%s'を使用してください- システムによっては シークレットから空白をトリムしますが、多くのシステム(PostgreSQL など)はトリムしません
- 認証失敗をデバッグする場合は、常に末尾の空白をまず確認してください
参考資料
- bash マニュアル ここ文字列について: https://www.gnu.org/software/bash/manual/bash.html#Here-Strings
ライセンス: MPL-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- divinevideo
- ライセンス
- MPL-2.0
- 最終更新
- 2026/5/12
Source: https://github.com/divinevideo/divine-mobile / ライセンス: MPL-2.0