コマンド雑記帳

よく使うけど引数が多すぎて覚えられないコマンドや、たまに使うけど思い出せないコマンドたちをつらつらと書き連ねていきます。コピペでの利用を想定しています。


### シリアルコンソール

```shell-session
$ cu --parity=none --nostop --line /dev/ttyUSB0 --speed 115200 dir
```
```shell-session
$ screen /dev/ttyUSB0 115200 cs8 -ixon -ixoff -istrip
```
どちらも 115200 bps, 8 bit, パリティなし, 1 stop bit, フローコントロールなしで接続します。cu を終了するときは `~.` を入力します。screen を終了するときは `C-a k` を入力します。

~~screen だとちゃんと接続できるのに cu だとこちらのキー入力が向こうにうまく伝わらない (向こうの出力はこちらに表示される) ことがありました。原因はわからないのですがさっき回避策を見つけたのでここに追記しておきます。~~

~~[ここ](http://mail-index.netbsd.org/netbsd-help/1999/05/12/0004.html)にも "anything I type has no effect on the modem" とか多分同じ現象で困っていらした方がいらしたようです。type modem とか clocal とかの解法が記してありますが、ヒントになりました。~~

~~/etc/uucp/port を作成して "port dummy" と書いたら現象が発生しなくなりました。もちろん dummy のところは適当なもので構いません。多分 /etc/uucp/port ファイルを用意している人には発生しない現象のような気がします。type modem とか type direct とかは関係なかったです。空ファイルとか全部コメントとかにしてみましたがこれはダメでした。port の指定が必要なようです。環境は Ubuntu 14.04.5 LTS x86_64 で cu -v は cu (Taylor UUCP) 1.07 です。~~

上記取り消し線の部分は「[cu Tips](http://qiita.com/g0117736/items/270942c37483183d98ef)」にまとめました。

Mac OS X の cu を使ってみました。Mac OS X のことはよく分かりません。今は Mac OS X ではなく macOS と表記するようです。

さて、とある USB Serial デバイスを接続すると、以下のようなデバイスファイルが作成されました。

```shell-session
$ ls -l /dev/tty.usb*
crw-rw-rw-  1 root  wheel   17,  10 May 22 14:29 /dev/tty.usbserial-ggggggggA
crw-rw-rw-  1 root  wheel   17,  12 May 22 14:29 /dev/tty.usbserial-ggggggggB
```

ファイル名がふざけていますが誰でもアクセス出来そうです。しかしながら cu コマンドで接続しようとすると拒否られます。/var/spool/uucp ディレクトリにロックファイルを作ろうとして失敗しているようです。ディレクトリの属性は以下のようになっていました。

```shell-session
$ ls -ld /var/spool/uucp
drwxr-xr-x  2 _uucp  wheel  68 May 22 14:14 /var/spool/uucp
```

sudo で cu を起動すればうまく接続できることは確認したのですが、それでは面白くありません。自分を wheel グループに所属させた上でこのディレクトリを group writable にすればよさそうです。でも Mac OS X では wheel グループがそこかしこで使われているようです。wheel グループの権限を与えるのは過剰な権限付与のような気がしました。

そこで、このディレクトリのグループを _uucp にしてみました。グループを変更して group writable にするのは chgrp, chmod コマンドで対応できます。もちろん sudo が必要です。以下が変更した後の属性です。

```shell-session
drwxrwxr-x  2 _uucp  _uucp  68 May 22 14:14 /var/spool/uucp
```

さて次は自分を _uucp グループに所属させるのですが、Mac OS X 的なコマンドが必要です。以下を参照してください。

```shell-session
$ sudo dscl . -append /Groups/_uucp GroupMembership 自分のユーザー名
$ dscl . -read /Groups/_uucp
AppleMetaNodeLocation: /Local/Default
GeneratedUID: ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000042
GroupMembership: 自分のユーザー名
Password: *
PrimaryGroupID: 66
RealName:
 Unix to Unix Copy Protocol
RecordName: _uucp uucp
RecordType: dsRecTypeStandard:Groups
```

これで sudo せずに cu コマンドが使えるようになります。自分の所属グループは id コマンドで表示させることができます。


### ld.bfd と ld.gold

```shell-session
# update-alternatives --install /usr/bin/ld ld /usr/bin/ld.bfd 30 --slave /usr/share/man/man1/ld.1.gz ld.1.gz /usr/share/man/man1/ld.bfd.1.gz
# update-alternatives --install /usr/bin/ld ld /usr/bin/ld.gold 50 --slave /usr/share/man/man1/ld.1.gz ld.1.gz /usr/share/man/man1/ld.gold.1.gz
# update-alternatives --config ld
```


### pkg-config と pkgconf

以下は Ubuntu 14.04 の場合です。引数 --about を指定すると、どちらの pkg-config が起動されるのか判別できます。切り替え方法はイマイチです。切り替えることを想定していないのかもしれません。

```shell-session
# dpkg -l | egrep 'pkg-config|pkgconf'
ii  pkg-config                                0.26-1ubuntu4                                amd64        manage compile and link flags for libraries
ii  pkgconf                                   0.9.4-1                                      amd64        manage compile and link flags for libraries
# pkg-config --about 2>&1 | tail -1
Report bugs at <http://github.com/pkgconf/pkgconf/issues>.
# rm -f /usr/bin/pkg-config
# dpkg-divert --package pkgconf --remove --rename /usr/bin/pkg-config
# pkg-config --about 2>&1 | tail -1
--about: unknown option
# dpkg-divert --package pkgconf --divert /usr/bin/pkg-config.real /usr/bin/pkg-config
# mv /usr/bin/pkg-config /usr/bin/pkg-config.real
# ln -s pkgconf /usr/bin/pkg-config
```


### Makefile で umask を指定する
元ネタは[こちら](http://lists.endsoftwarepatents.org/archive/html/bug-gnu-utils/2012-03/msg00012.html)なのですが、/bin/sh で動作が確認できたのでここに記録しておきます。eval ではなく exec しているのは個人的な趣味です。先に起動するシェル (ここでは /bin/sh) は  [POSIX.1-2017 allows the single \<hyphen-minus\> to mark the end of the options, in addition to the use of the regular "--" argument](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html) に対応していれば何でもよいと思います。後で起動するシェル (こちらも /bin/sh) は Makefile のコマンド行を処理するのに使われます。

```makefile
SHELL   = /bin/sh -c 'umask 022; exec /bin/sh -c "$$2"' --

test:
        umask
```


### アカウント登録いろいろ

```shell-session
# adduser ユーザ名
```
```shell-session
# adduser ユーザー名 dialout   (ユーザー名を dialout グループに追加)
```
```shell-session
# deluser ユーザー名 sambashare   (ユーザー名を sambashre グループから削除)
```
```shell-session
# adduser --uid 127 --system --group --disabled-password \
          --no-create-home --home /var/lib/example7 --gecos 'Example 7' example7
```

### UID, GID で /etc/passwd などをソート

```shell-session
# umask 077

# sort -t: -n -k 3 /etc/passwd > /etc/passwd-
# cat /etc/passwd- > /etc/passwd
# rm /etc/passwd-

# sort -t: -n -k 3 /etc/group > /etc/group-
# cat /etc/group- > /etc/group
# rm /etc/group-

# awk -F: '{ print $1 }' /etc/passwd | while read u; do \
  egrep -e "^${u}:" /etc/shadow; done > /etc/shadow-
# cat /etc/shadow- > /etc/shadow
# rm /etc/shadow-

# awk -F: '{ print $1 }' /etc/group | while read g; do \
  egrep -e "^${g}:" /etc/gshadow; done > /etc/gshadow-
# cat /etc/gshadow- > /etc/gshadow
# rm /etc/gshadow-

# umask 022
```


### ufw の設定

```shell-session
# ufw disable
# ufw reset
# rm /etc/ufw/*.rules.2016*_*
# rm /lib/ufw/*.rules.2016*_*
# ufw enable
# ufw default DENY
# ufw logging off
# ufw allow 22/tcp
# ufw allow その他許可するポート番号/tcp
# ufw reload
# ufw status
```


### telnet で SMTP

```shell-session
$ telnet smtp-server 25
(SMTP サーバーからの応答は略)
HELO smtp-client.example.jp
MAIL From:<noname@example.jp>
RCPT To:<noname@example.jp>
DATA
Subject: test
From: nobody
To: nobody

This is a test mail.
Please ignore this.
.
QUIT
```


### telnet で POP3

```shell-session
$ telnet pop3-server 110
Trying 192.168.0.1...
Connected to pop3-server.
Escape character is '^]'.
+OK POP3 server ready <1896.697170952@dbc.mtview.ca.us>
USER ユーザー名
+OK ユーザー名 is a real hoopy frood
PASS 平文パスワード
+OK ユーザー名's maildrop has 2 messages (320 octets)
STAT
+OK 2 320
LIST
+OK 2 messages (320 octets)
1 120
2 200
.
RETR 1
+OK 120 octets
<the POP3 server sends message 1>
.
DELE 1
+OK message 1 deleted
RETR 2
+OK 200 octets
<the POP3 server sends message 2>
.
DELE 2
+OK message 2 deleted
QUIT
+OK dewey POP3 server signing off (maildrop empty)
Connection closed by foreign host.
```


### telnet で IMAP4

```shell-session
$ telnet imap4-server 143
Trying 192.168.0.1...
Connected to imap4-server.
Escape character is '^]'.
* OK
0 CAPABILITY
1 LOGIN ユーザー名 平文パスワード
1 OK Logged in.
2 LIST "" *
* LIST (\HasNoChildren) "." "INBOX"
2 OK List completed.
3 RENAME folder1.foo folder2.bar
3 OK Reanme completed.
4 CREATE folder3
4 OK Create completed.
5 DELETE folder4
5 OK Delete completed.
6 LOGOUT
* BYE Logging out
6 OK Logout completed.
Connection closed by foreign host.
```
[IMAP4 プロトコル参考資料](http://www.atmarkit.co.jp/ait/kw/mobile_kannkyou_yasashii_mail.html "「モバイル環境に優しいメールプロトコルIMAP」最新記事一覧")


### openssl で IMAP4S

```shell-session
$ openssl s_client -connect imap4-server:993 -crlf (-quiet)
(あとは telnet で IMAP4 と同じ)
```