Skip to the content.

sudo がなぜホスト名を参照するのか?

hostnamectl でホスト名前を変えたら sudo にかなりの時間がかかるようになってしまった。
/etc/hosts を更新することで直るのはわかるのだが、sudo とホスト名の関係がわからなかった。

以下の理由らしい。
https://superuser.com/questions/429790/sudo-command-trying-to-search-for-hostname

ChatGPT による翻訳。

/etc/sudoersファイルは複数のサーバー間で配布できるように設計されています。これを実現するために、ファイル内の各権限にはホスト部分があります。
通常、これはALL=に設定されており、これは権限がどのサーバーでも有効であることを意味しますが、特定のホストに設定することもできます。

%sudo    kaagini=(ALL) ALL

このルールが適用されるべきかどうかをsudoが知るためには、実行されているホストを調査する必要があります。これには/etc/hostsが正しいことを前提とした呼び出しが使われています。そのため、これが正しくない場合には失敗します。 もし権限のホスト部分が全ての権限に対してALL=に設定されている場合、sudoは名前の検索をする必要がないと主張されるかもしれませんが、それはうまく機能しません。sudoはルールを処理する前に実行されている場所を把握するようです。
これは実際にはsudoが現在のマシンでユーザーが何ができるかを確認するためのもので、管理者としては、100台のサーバーがあれば、それぞれのマシンごとに異なる/etc/sudoersファイルを維持する必要があります。sudoersは権限にホスト部分を持っているので、1つのsudoersファイルを維持し、それをすべてのマシンに配布することができ、それでも各マシンでユーザーが何ができるかについて詳細な制御が可能です。

Dev Containers テンプレ

Rust 用

Dockerfile
(refer: https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user)

FROM rust:1.84-bookworm

RUN apt update \
  && apt -y install libssl-dev pkg-config sudo \
  && apt clean \
  && rm -rf /var/lib/apt/lists/*

ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID

RUN groupadd --gid $USER_GID $USERNAME \
  && useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME \
  && echo "$USERNAME ALL=(root) NOPASSWD:ALL" > /etc/sudoers.d/$USERNAME \
  && chmod 0440 /etc/sudoers.d/$USERNAME 

RUN rustup component add rustfmt clippy

ENTRYPOINT ["/bin/bash"]

compose.yml

services:
  rust_dev:
    build:
      context: .
      dockerfile: Dockerfile
    restart: always
    tty: true
    volumes:
      - ../:/workspace
    working_dir: /workspace

devcontainer.json

{
  "dockerComposeFile": ["compose.yml"],
  "service": "rust_dev",
  "workspaceFolder": "/workspace",
  "remoteUser": "vscode",
  "customizations": {
    "vscode": {
      "extensions": [
        "rust-lang.rust-analyzer",
        "vadimcn.vscode-lldb"
      ]
    }
  }
}

Lambda 用

TODO: 上に追加して清書

apt -y install pipx
pipx install cargo-lambda
pipx ensurepath

Bind Address の意味

keen さんが全て説明してくれた。
https://keens.github.io/blog/2016/02/24/bind_addressnoimigayouyakuwakatta/

実際に使ってみても127.0.0.1を指定すればローカルホストから、0.0.0.0を指定すれば外部からでも参照出来るな、くらいの認識しかありませんでした。

上記記事を閲覧するまで本当にこの通りの認識で、
何なら学生の頃は 192.168.12.255 とか指定すれば 192.168.12.* からの接続のみ受け付けるのかな?などの勘違いをしていた。(実際にやってみて違うことは理解した)

関数名のとおり、本当に Bind なんだなぁ。

私自身最初は C# でプログラミングを始めたのだが、ネットワークのプログラムを書くときに最初に触るのは System.Net.Sockets.TcpListener だった。
MSDN に記述された TcpListener のコンストラクタの説明は以下だ。

public TcpListener (System.Net.IPAddress localaddr, int port);

パラメーター

localaddr IPAddress
ローカルIPアドレスを表す IPAddress。

port Int32
受信接続の試行を待機するポート。

今読むと「何故ローカルIPアドレスを指定する必要が?」と疑問が湧くのだが、当時はまぁいいやで済ませてしまっていた。どこのサンプルも大抵 IPAddress.Any を指定していたしそんなもんだろと思っていた。

VSCode で日本語入力ができない

当然ディストロを入れ直すなんてことは滅多に無い。
前回入れ直した際に VSCode 上で Input Method を切り替えることができずかなりの時間を浪費してしまった。
今回もつい先程まで切り替えることができずうんざりしたので、VSCode 上で日本語入力できるまでの手順を記録しておく。

今回は Debian 12 を使用している。

$ sudo aptitude -y install fcitx5-mozc
$ sudo im-config -n fcitx5
$ sudo reboot

(再起動じゃなくてログオフでいい)

Fcitx Configuration を開き、Input MethodKeyboard JapaneseMozc を設定する。

$ fcitx5-configtool

fcitx5 の自動起動設定。

$ mkdir -p ~/.config/autostart
$ cp /usr/share/applications/org.fcitx.Fcitx5.desktop ~/.config/autostart/.

以下の内容のファイルを作成する。

$ cat /etc/environment.d/fcitx5.conf
GTK_IM_MODULE=fcitx5
QT_IM_MODULE=fcitx5
XMODIFIERS=@im=fcitx5

前回までの環境はここまでの設定で VSCode で日本語が使えたはずだが今回は IM が切り替わらなかった。
どうやら Debian インストール時に Language を English でインストールすると Gnome 側が IM をうまく認識できないらしい。

Gnome に IM に fcitx5 を使っているということをわからせてやる。

$ gsettings set org.gnome.settings-daemon.plugins.xsettings overrides "{'Gtk/IMModule':<'fcitx5'>}"

以下のコマンドで設定した値が表示されれば OK。

$ gsettings get org.gnome.settings-daemon.plugins.xsettings overrides
{'Gtk/IMModule': <'fcitx5'>}

この状態で再起動したところ、VSCode で日本語入力ができた。

ディレクトリ及びフォルダのサイズを取得

現在携わっているプロジェクトで、特定のディレクトリの下のファイルを定期的に S3 上にアップロードする必要がある。
アップロードするサイズが大きい場合にどのディレクトリ(or ファイル)が問題になっているかを調査したい。
(アップロードの対象外にできるかどうかは人間の判断が必要になるので。)

# カレントディレクトリ下でサイズが大きいディレクトリ・ファイルの上位 10 件を出力
$ du -ahd 1 . | sort -rh | head -10
-a, --all:
    write counts for all files, not just directories

-h, --human-readable:
    print sizes in human readable format (e.g., 1K 234M 2G)

-d, --max-depth=N:
    print  the  total for a directory (or file, with --all) only if it is N or fewer levels below the command line argument;  --max-depth=0 is the same as --summarize