curl -4 ifconfig.me # => 218.42.96.86(当時のグローバルIPv4) nslookup pinocchio.mydns.jp # => 関係のないIPv4が複数返る(Aレコードが“変”な状態)
| 項目 | 内容 | 結論 |
|---|---|---|
| IPv6優先 | Linux環境ではIPv6が優先されやすく、ログインはIPv6で通ることがある。 | OK(仕様として自然)。ただし更新はIPv4で確実化が必要。 |
| URLパラメータ認証 | MID=...&PWD=... をURLに入れる方式で 401(Basic認証要求)に遭遇。 |
NG。以後は Basic認証に統一。 |
| 旧スクリプト | directip.html + ifconfig.me で IP を自前取得し、結果を /dev/null に捨てていた。 |
NG。黙って失敗しやすく、再発要因。 |
| cron のPATH | cron はログインシェルではなく PATH が最小。Anacondaの curl しかないと “curlが見つからない”。 | 対策必須。OS標準curlを導入し /usr/bin/curl を明示。 |
紙に書く場合は2行に分けてもよい(\で継続)。実体は1コマンド。
curl -4 -u mydns798820:******** \ "https://www.mydns.jp/login.html?HOST=pinocchio.mydns.jp"
nslookup pinocchio.mydns.jp が IPv4 1個で期待値を返す。mv ~/mydns_update.sh ~/mydns_update.sh.bad
「消さないが実行しない」=事故防止+後日比較用(教材化にも使える)。
sudo apt install curl
dpkg -L curl | grep '/bin/curl$' # => /usr/bin/curl
注意: which curl が Anaconda を指すことはあり得る(base環境がPATH先頭)。運用スクリプトは /usr/bin/curl を明示して解決。
/home/murata/mydns_update.shPASS は必ず自分で置換(このHTMLを共有する場合は秘匿)。
#!/bin/bash
set -eu
ID="mydns798820"
PASS="********" # ←自分のパスワードに置換
HOST="pinocchio.mydns.jp"
LOG="/home/murata/mydns_update.log"
if /usr/bin/curl -4 -sS -u "${ID}:${PASS}" \
"https://www.mydns.jp/login.html?HOST=${HOST}" > /tmp/mydns_ok.$$ 2>&1
then
# 成功時:タイムスタンプだけ
date '+%Y-%m-%d %H:%M:%S OK' > "$LOG"
else
# 失敗時:エラー内容を記録
{
date '+%Y-%m-%d %H:%M:%S ERROR'
cat /tmp/mydns_ok.$$
} > "$LOG"
fi
rm -f /tmp/mydns_ok.$$
chmod 700 ~/mydns_update.sh chmod 700 ~/mydns_update.sh.* # .bad / .save も含めて保護した場合
~/mydns_update.sh >/dev/null && echo OK
crontab -e
*/10 * * * * /bin/bash /home/murata/mydns_update.sh
crontab -l
ポイント: cron 側の > mydns_update.log 2>&1 は付けない。ログはスクリプト内で責任を持って書く。
cat ~/mydns_update.log
nslookup pinocchio.mydns.jp
A. はい。\ は「次行も同じコマンド」の意味。見やすさのため2行で書いてよいが、実体は1コマンド。
A. crontab -e(ユーザーcrontab)なら不要。root crontab を触るときのみ sudo が必要。
A. 対話環境では PATH 先頭が anaconda になることがある。運用では /usr/bin/curl を明示して解決。
このHTMLは「作業の再現」「後日の引き継ぎ」「教材化」を意識して作成。 パスワード等の秘匿情報は必ずマスクして保存・共有すること。