技術メモのかけら

内容はもとより調べたことすら忘れてしまうので個人的なメモです。とにかく短く、結論だけ書いていきます。

groupaddとuseraddのrオプションでシステムアカウントを作成する

groupaddとuseraddにrオプションを指定するとsystemアカウントになる

-r, --system create a system account

# groupadd -r r_group
# groupadd -r r_group2
# grep r_group /etc/group
r_group:x:998:
r_group2:x:997:

IDが振られる範囲は/etc/login.defsのSYS_GID_MINSYS_GID_MAXで定義されているが、IDは降順に振られるようである

#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN                  1000
GID_MAX                 60000
# System accounts
SYS_GID_MIN               201
SYS_GID_MAX               999

普通のグループはGID_MINGID_MAXで定義されている通り、1000以降が振られる

# groupadd normal_group
# grep group /etc/group
normal_group:x:1000:

ユーザも同じ感じ

# useradd -r -g r_group r_user
# useradd -g normal_group normal_user
# grep user /etc/passwd
r_user:x:999:998::/home/r_user:/bin/bash
normal_user:x:1000:1000::/home/normal_user:/bin/bash

IDが振られる範囲は同じく/etc/login.defsで定義されている。

#
# Min/max values for automatic uid selection in useradd
#
UID_MIN                  1000
UID_MAX                 60000
# System accounts
SYS_UID_MIN               201
SYS_UID_MAX               999

普通のユーザとの違いは、/etc/shadowを見るとパスワードの有効期限がブランクになっている

r_user:!!:17528::::::
normal_user:!!:17528:0:99999:7:::

また、/etc/login.defsのCREATE_HOMEの設定を無視してホームディレクトリが作成されない

$ ls /home
normal_user

ただ、ログインできてしまう。
システムユーザとして使用するには、ログインシェルは使えないようにしたい。
ログインさせないために/sbin/nologinは知ってたけど、メッセージを返さない/bin/falseというのもあるらしい

# /sbin/nologin
This account is currently not available.
# echo $?
1
# /bin/false
# echo $?
1

本番環境ではメッセージを返さない/bin/falseデバッグ環境は /sbin/nologinとか使い分けると良さそう。

#  useradd -r -g r_group -s /bin/false r_user

途中まで打ったコマンドを保持しつつ別のコマンドを実行する方法

途中まで打ったけど、別のコマンドを打ちたくなった、でも打ちかけたのを消すのは惜しい。
そんな場合は Alt + q

$ docker exec -it  (あれ、コンテナIDなんだっけ?)

Alt + qを押すと一旦プロンプトがクリアされる。

$

別のコマンドを実行して、めでたくコンテナIDが分かった。打ちかけのコマンドが復元されるので続きをどうぞ。

$ docker ps 
CONTAINER ID        IMAGE                                 COMMAND                  CREATED             STATUS                   PORTS               NAMES
bf0c389358f9        centos:7.4.1708                       "/bin/bash"              9 hours ago         Exited (0) 9 hours ago                       34_redmine_1

$ docker exec -it

SQL中のVALUES

SELECT句が使える場所ならどこでもVALUESが使えるとのこと。

-- select 1,'one' union select 2,'two' union select 3,'three'と等価
postgres=# VALUES (1, 'one'), (2, 'two'), (3, 'three');
 column1 | column2
---------+---------
       1 | one
       2 | two
       3 | three
(3 rows)

asで別名をつければテーブルを指定できるところに使える。列名はデフォルトでcolumn1, column2のようになる。

postgres=# select column1,column2 from (values ('あいうえお',1),('かきくけこ',2),('さしすせそ',3)) as t;
  column1   | column2
------------+---------
 あいうえお |       1
 かきくけこ |       2
 さしすせそ |       3
(3 rows)

列名をつけることも可能です。

select no,hiragana from (values ('あいうえお',1),('かきくけこ',2),('さしすせそ',3)) as t(hiragana,no);

Re:dashのユーザ削除

GUIで操作できないので、コマンドから行う必要がある。
自分の場合はDockerでインストールしたので、下記コマンドを実行して削除。
画面で操作できるようにならないかな。

docker exec -it {コンテナID} ./manage.py users delete {メアド}

botからのアクセスを拒否する

拒否してるのにbeingbotがしつこくアクセスしてくるのでユーザエージェント指定で弾くApacheの設定を入れた。
httpd.confあたりに書いておく。

BrowserMatch "beingbot" bot
<Directory />
  order allow,deny
  allow from all
  deny from env=bot
</Directory>

readlineが7にバージョンアップされてgradleとpsqlが動かなくなった

何もした覚えがないのだが、ある日急にgradleとpsqlが動かなくなった。

$ gradle tasks
dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
  Referenced from: /usr/local/bin/bash
  Reason: image not found
[1]    52259 abort      gradle tasks

$ psql
dyld: Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
  Referenced from: /usr/local/bin/psql
  Reason: image not found
[1]    52489 abort      psql

どちらもlibreadline.6.dylib がないと言ってエラーを吐いている。

あまり記憶にないけど、Homebrewでreadlineを入れていたようで、現在は7.0.3が適用されているようだ。

$ brew info readline 
readline: stable 7.0.3 (bottled) [keg-only]
Library for command-line editing
https://tiswww.case.edu/php/chet/readline/rltop.html
/usr/local/Cellar/readline/6.3.6 (46 files, 2MB)
  Poured from bottle on 2014-05-29 at 11:25:42
/usr/local/Cellar/readline/6.3.8 (46 files, 2MB)
  Poured from bottle on 2014-10-18 at 05:30:37
/usr/local/Cellar/readline/7.0.3 (46 files, 2MB)
  Poured from bottle on 2017-02-28 at 22:25:05
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/readline.rb
==> Caveats
This formula is keg-only, which means it was not symlinked into /usr/local.

macOS provides the BSD libedit library, which shadows libreadline.
In order to prevent conflicts when programs look for libreadline we are
defaulting this GNU Readline installation to keg-only.


For compilers to find this software you may need to set:
    LDFLAGS:  -L/usr/local/opt/readline/lib
    CPPFLAGS: -I/usr/local/opt/readline/include

6系のものに切り替えてみる

$ brew switch readline 6.3.8
Cleaning /usr/local/Cellar/readline/6.3.6
Cleaning /usr/local/Cellar/readline/6.3.8
Cleaning /usr/local/Cellar/readline/7.0.3
Opt link created for /usr/local/Cellar/readline/6.3.8

動いた!

$ psql --version
psql (PostgreSQL) 9.4.0

おそらく7系をインストールした何かが動かなくなるんだろうなと思いつつ、とりあえず良しとする。

RedmineでSVNの差分を見ようとすると「リポジトリに、エントリ/リビジョンが存在しません。」エラーになる

Passenger+ApacheRedmineを運用しているが、SVNのコミットの差分を見ようとすると「リポジトリに、エントリ/リビジョンが存在しません。」とエラーが表示されるようになった。
コミットメッセージなどは取得出来ているので、リビジョンが存在しないと言われても良く分からん状態なので調査してみた。

エラー「リポジトリに、エントリ/リビジョンが存在しません。」 — Redmine.JP

上記サイトにあるように、まずerror_logを見てみるとそれっぽいエラーメッセージが出力されていた。

App 32640 stderr: svn: Can't convert string from 'UTF-8' to native encoding:
App 32640 stderr: svn: Index: ?\233?\155?\187?\230?\176?\151?\230?\150?\153?\233?\135?\145.txt

更に調べてみると、正に下記サイトに書いてあるとおりファイル名が日本語だとうまく変換出来ていなかったようだ。

CentOSでApacheを日本語ロケール(ja_JP.utf8)で起動する | maeda.log

/etc/sysconfig/httpdHTTPD_LANG=ja_JP.utf8 を指定して事なきを得た。

Redmineのサーバー移設をした後に発生したので以前は設定されていたようだがノウハウが失われていたようだ。
せめてもう少しエラーメッセージが分かりやすいと良いのだが。