作業ノート

様々なまとめ、雑感など

bashのヒアドキュメントで、root権限下のディレクトリにスクリプトを作成する

以前、bashのヒアドキュメントを使ったスクリプトの作成で、catを使ったスクリプトの作成方法を紹介した。

[vagrant@localhost ~]$ cat <<'EOT' > test.sh
> #!/bin/bash
> set -eu
>
> echo 'test'
>
> EOT

[vagrant@localhost ~]$ ls -l test.sh
-rw-rw-r-- 1 vagrant vagrant 34  7月  1 22:30 2015 test.sh

作成先が実行ユーザで書き込みできるディレクトリなら問題ないが、root権限が必要なディレクトリでは

[vagrant@localhost ~]$ cat <<'EOT' > /usr/local/bin/test.sh
> #!/bin/bash
> set -eu
>
> echo 'test'
>
> EOT
-bash: /usr/local/bin/test.sh: 許可がありません

作成できない。

作成するには、catの標準出力をパイプでつなぎ、sudoteeを実行して、ファイル名を出力先にする。

[vagrant@localhost ~]$ cat <<'EOT' | sudo tee /usr/local/bin/test.sh > /dev/null
> #!/bin/bash
> set -eu
>
> echo 'test'
>
> EOT
[vagrant@localhost ~]$ ls -l /usr/local/bin
合計 4
-rw-r--r-- 1 root root 34  7月  1 22:40 2015 test.sh

追記するには、tee-aオプションを指定する。

[vagrant@localhost ~]$ cat <<'EOT' | sudo tee -a /usr/local/bin/test.sh > /dev/null
> echo 'test2'
>
> EOT

[vagrant@localhost ~]$ cat /usr/local/bin/test.sh
#!/bin/bash
set -eu

echo 'test'

echo 'test2'

teeは、標準入力の内容を指定したファイルと標準出力に出力する。

上記の方法では、teeを使って入力内容をファイルに出力しているが、標準出力は必要ないため/dev/nullにリダイレクトしている。

参考