我想制作一些小型 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/ls
以base64编码。
假设uudecode
您要运行该命令的计算机上可用。但通常应该是这样,就像uudecode
POSIX 命令一样。
您可以通过编码压缩的 tar 存档来扩展它以创建多个文件:
(echo 'uudecode << "_EOF_" | gunzip | tar xpf -'
tar cf - file1 file2 file3 dir/file4 | uuencode -m -
echo '_EOF_') >> your-script
(假设目标系统有gunzip
和tar
(不是 POSIX 命令,但很常见))。
这还有一个好处是可以让您对其他文件元数据进行编码,例如所有权或访问权限和修改时间(更类似于 ACL 和扩展属性,以及与某些tar
实现的硬链接关系)。它还允许您轻松创建非常规文件,例如目录、符号链接、设备......
另请参阅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 容器。