Bashを使用して事前に挿入されたテキストを含むファイルを作成するには? [コピー]

Bashを使用して事前に挿入されたテキストを含むファイルを作成するには? [コピー]

私は新しいコンピュータでいくつかのタスクを自動化する小さなbashスクリプトを作成したいと思います。

私がまだ手動で行う唯一のことは、ファイルを作成してviファイルにテキストを貼り付けることだけです。

Bashで「必要なテキスト」を含むファイルXをどのように生成しますか? Enterキーを押し、必要に応じてファイルを上書きし、必要に応じてディレクトリを作成する必要はありませんか?

ありがとう

例:デフォルトのsshd_configファイルをマイバージョンに置き換えて、私の公開SSHキーを含むファイルを作成します。インスタントから別の.shファイルを生成します。このような。

答え1

テキストコンテンツの場合、最も簡単な方法はここでドキュメントを使用することです。特に、テキストに複数の行が含まれている場合はさらにそうです。スクリプトに次の行を追加します。たとえば、スクリプトでfile.txt次のテキストで行を作成できます。

cat << 'EOF' > file.txt
Here is some text
or other
EOF

EOF(挿入されたテキストに表示されない限り、ファイルの終わりの表示として上記の表示の代わりに何でも使用できますEOF

任意の内容を含むファイルには使用できますuudecode。作成中のファイルの権限を指定することもできます。たとえば、fooコンテンツと権限を持つファイルを生成するスクリプトの場合は、次のようになります/bin/ls

(echo 'uudecode << "_EOF_"'
uuencode -m /bin/ls foo
echo _EOF_) >> your-script

これにより、スクリプトに適切なコードが追加されます。それは次のとおりです。

uudecode << "_EOF_"
begin-base64 755 foo
f0VMRgIBAQAAAAAAAAAAAAMAPgABAAAAMFQAAAAAAABAAAAAAAAAADD3AQAA
[...]
AAAAAAAAAAAAAAA=
====
_EOF_

コンテンツは/bin/lsbase64でエンコードされます。

uudecodeコマンドを実行したいコンピュータで使用できるとします。ただし、uudecodePOSIXコマンドと同様に、通常はそうする必要があります。

圧縮tarアーカイブをエンコードして拡張して、複数のファイルを作成できます。

(echo 'uudecode << "_EOF_" | gunzip | tar xpf -'
tar cf - file1 file2 file3 dir/file4 | uuencode -m -
echo '_EOF_') >> your-script

(ターゲットシステムにgunzipand tar(POSIXコマンドではなく共通)があると仮定)。

tarまた、所有権やアクセス権、変更時間(ACLおよび拡張属性、一部の実装とのハードリンク関係に似ています)などの他のファイルメタデータをエンコードできるという利点もあります。また、ディレクトリ、シンボリックリンク、デバイスなどの非伝統的なファイルを簡単に作成できます。

また見てくださいshar便利ポータブル自動抽出アーカイブを作成するのに役立ちます。

答え2

スクリプトでできる

sudo mv /etc/ssh/sshd_config /etc/ssh/sshd_config.orig
sudo cp "$HOME/my_configs/sshd_config" /etc/ssh/
sudo chmod go-w /etc/ssh/sshd_config

または

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.orig
cat "$HOME/my_configs/sshd_config" | sudo tee /etc/ssh/sshd_config >/dev/null

古いものをバックアップし、sshd_config新しいものをインストールします。

つまり、ファイルをどこかに収集して正しい場所にコピーし、インストールされたファイルに正しい権限があることを確認します。これはスクリプトを介して自動化できます。

ただし、AnsibleやPuppetなどの自動化された構成および構成管理用の専門ソフトウェアがあります。

この種のソフトウェアは、複数台のコンピュータをセットアップする必要がある場合、より興味深いことがあります。たとえば、Ansibleを使用してコンピューティングクラスタの顧客用にプライベートDockerコンテナを設定します。

関連情報