ファイル~/.ssh/authorized_keys
形式は、次のように簡単に要約できます。
- キーごとに1行を含むテキストファイル。
- 空行と
#
octothorpe()で始まる行は無視されます。 - 4つのフィールドがあります。オプション、ボタンタイプ、鍵そしてコメント;
- フィールド 1 と 4 はオプションです。
- 二重引用符を使用している場合は、フィールド1にスペースを含めることができます。
- 4番目のフィールドには、引用符で囲むことなくスペースを含めることができます。
完全な説明はにありますman sshd
。
ファイルのキーbash
を操作する安定したスクリプト可能な(例)方法はありますか?~/.ssh/authorized_keys
たとえば、スクリプトは次のようになります。
- 特定のキーの抽出(例:ボタンタイプ、鍵そしてコメントフィールド)、
- 操作(追加、変更、削除)オプション大地、
- 操作(追加、変更、削除)コメント大地、
- すべてのキーを繰り返す
- キーを削除します。
ssh-keygen
ファイル(例:ssh-add
&c。)を変更するためのSSHツールがないようで、~/.ssh.authorized_keys
ファイルの特性オプションそしてコメントsed
フィールドを使用すると、通常awk
またはメソッドを使用してperl -pe
これを確実に達成することが困難になります。
コメントをフォロー、これは簡単な質問です。~/.ssh/authorized_keys
ファイルを読み、すべてのキーを出力するスクリプトを想像してみてください。キーのみ出力します。オプションもなく、スペースやコメント行もありません。
各行はスペースで区切られているため、これを行うのに問題がありますが、次のようになります。
- オプションにはスペースを含めるか、完全に含めることができません。
- 空白のため、コメントはゼロ個以上のフィールドになることがあります。
したがって、行に含まれるフィールドの数は不明であり、その行にフィールドがいくつあるかは簡単にはわかりません。オプション期間。
理解するには、過度に複雑な正規表現が必要です。オプションフィールドを使用すると、残りの行が出力される前に確実に削除できます。私はsed
これをやってみましたperl -pe
。
この種のスクリプトの人為的なユースケースは次のとおりです。すべてのキーの指紋のリスト。
答え1
説明を見ると、オプションとコメント行を削除したいようです。によるとman 8 sshd
:
公開キーは、スペースで区切られたオプション、キータイプ、base64エンコードキー、コメントフィールドで構成されています。オプションフィールドはオプションです。キーのタイプは、「ecdsa-sha2-nistp256」、「ecdsa-sha2-nistp384」、「ecdsa-sha2-nistp521」、「ssh-ed25519」、「ssh-dss」、または「ssh-rsa」です。未使用 どの目的にも使用されません (ただし、ユーザーはキーを簡単に識別できます)
だからあなたはこれを行うことができます:
sed '
/^[ ]*$/d;
/^#/d;
s/^.* \(ecdsa-sha2-nistp256\|ecdsa-sha2-nistp384\|ecdsa-sha2-nistp521\|ssh-ed25519\|ssh-dss\|ssh-rsa\) /\1 /' \
~/.ssh/authorized_keys
これは、キーコメントに背中が含まれていないと仮定しますssh-dss
。ssh-rsa
また、実装のsed(1)
サポートを想定しています。OR
\|
テキストエディタを使用する方が簡単で安全です。 :)