シェルスクリプト

ゴールデンウィークはシェルスクリプト漬けな (っ´∀`)っ ゃー でした。こんにちは。さて、Linuxマシンに外付けディスクをマウントして運用している場合、あるディレクトリがマウントされているかどうかの真偽を条件分岐したいこともあるかと思います。

絶対に「/PATH/TO/HOGE」しかマウントしないんだ!という鉄の意志があればよいのですが、皆さんカジュアルにいろんなディレクトリをマウントすると思いますので、チェックが大変ですよね?私は以下のように、${HOME}/Document 以下をUSBハードディスクに外出ししていいます。

[nullpopopo@U24E-RED ~]$ df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 3.9G     0  3.9G   0% /dev
tmpfs                    3.9G     0  3.9G   0% /dev/shm
tmpfs                    3.9G  1.5M  3.9G   1% /run
tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/mapper/fedora-root  678G   37G  607G   6% /
tmpfs                    3.9G   56K  3.9G   1% /tmp
/dev/sda1                976M  211M  698M  24% /boot
/dev/md0                 3.7T  774G  2.9T  21% /home/nullpopopo/Documents
tmpfs                    789M   20K  789M   1% /run/user/42
tmpfs                    789M     0  789M   0% /run/user/1000

…続きを読む

シェルスクリプトの自動運転でsudoを使うには、NOPASSWDで、かつ !requiretty な設定をすればよいのだが、うっかりsudoできないユーザーでこれを実行してしまった場合、いつまでもパスワードの入力待ちで止まってしまう。これに気付かず後続処理が走ってしまうのは怖いのだが、 /etc/sudoers.d/ユーザー名 のファイルをgrepして判断しようにもsudoを使わないといけない(rootで実行すればよいとか言わないで><)。

そこでぽぽは考えましたよ。「(ぴこーん!) 最初にsudoで何かしらの無害なコマンドを叩かせて終了ステータスを捕まえればええんやぁ!」

というわけでこんな処理をスクリプトの最初に仕込んでやればよい。

…続きを読む

リモートホストにSSH接続できることを確認してからrsyncする

リモートホストにSSH接続できることを確かめてからrsyncしたいなー、というそれだけのキッカケで書いたシェルスクリプト。恐らくシェルスクリプト初心者にも読みやすい作り、のはず。

単にrsyncする前にsshでログインして「:」だけ叩いて帰ってきて「どうだった?」と終了ステータスを捕まえて、sshが正常終了だったらrsyncする、というそれだけなんですが、終了ステータス捕まえるためだけに何秒も待たされるのが嫌だったので、sshコマンドのあとに「ConnectTimeout 1」オプションをつけています。

#!/bin/bash
LANG=C
set -eux

FROM_DIR=${HOME}/N/U/L/L/P/O/P/O/P/O
TO_DIR=${HOME}/M/A/R/I/N/A
SSH_USER=nullpopopo
TO_HOST=sakura

# ------------------------------------------------------------ #
# by @nullpopopo
# First Commit 2017/11/15
# ------------------------------------------------------------ #

SSH_TIMEOUT_STATUS=$(
     ssh -o "ConnectTimeout 1" ${TO_HOST} :     > \
     /dev/null 2>&1                             ; \
     echo $?
    )

if [ ${SSH_TIMEOUT_STATUS} = 0 ];
then
  ssh ${TO_HOST} mkdir -p ${TO_DIR}
  rsync -ahvz                           \
    ${FROM_DIR}/*                       \
    ${SSH_USER}@${TO_HOST}:${TO_DIR}/
fi

はい、答えだけ知りたい人はここで回れ右(つめたいなあ 偉そうだなあ)。

…続きを読む

どうもこんばんは。 @nullpopopo です。またおっさんになってしまいました。以下の要件でLinuxのローカルユーザーを作成したくなったので、シェルスクリプト一撃でできるようにしてみました。

  1. OSインストール直後の真っさらな状態(root以外にログインできるユーザーはいない)
  2. UID GIDともに1000番から連番で作成。ただし、GIDは1000番固定。
  3. グループ名は「webmaster」
  4. パスワードはランダムな8文字で、 /root 直下にパスワードのメモを残しておく(もちろん後で消す)

…続きを読む