それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

journalctlで指定のサービス(ユニット)のログを上手に見る方法-期間指定,サービス指定,json

systemd の status の結果で、ログもうちょっと多く見たい

takuya@:mysql$ systemctl  status nginx
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-07-23 13:52:28 JST; 41min ago
     Docs: man:nginx(8)
 Main PID: 15612 (nginx)
    Tasks: 10 (limit: 4915)
   Memory: 26.1M
      CPU: 1.534s
   CGroup: /system.slice/nginx.service
           ├─15612 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           ├─15613 nginx: worker process
           ├─15619 nginx: worker process
           └─15621 nginx: cache manager process

 7月 23 13:52:28 acid systemd[1]: Starting A high performance web server and a reverse proxy server...
 7月 23 13:52:28 acid systemd[1]: Started A high performance web server and a reverse proxy server.
## ここをもっと見たい

status で、末尾に表示されるログは最新のプロセス起動後のログだけなので、過去の再起動時のプロセスもあわせて見たいと思いますよね。

journalctl -u で見れます。

journalctl -u nginx.service

または service を省略しても見られます。

journalctl -u nginx

tailf / tail -f 的なことがやりたい

tailf / tail -f みたいにログをフォローして表示したい

journalctl -f

これが便利。/var/log/ を探さなくていいんです。楽

その他のオプション

今日のログを見たい --since today をつければ見れる。

takuya@:nginx$ journalctl -u nginx  --since today
-- Logs begin at Tue 2018-05-29 01:08:01 JST, end at Mon 2018-07-23 14:36:01 JST. --
 7月 23 13:51:53 acid systemd[1]: Stopping A high performance web server and a reverse proxy server...
 7月 23 13:51:53 acid systemd[1]: Stopped A high performance web server and a reverse proxy server.
 7月 23 13:52:28 acid systemd[1]: Starting A high performance web server and a reverse proxy server...
 7月 23 13:52:28 acid systemd[1]: Started A high performance web server and a reverse proxy server.

date で解釈できるものなら何でも行けそう

journalctl -u nginx  --since 2018-06-01
journalctl -u nginx  --since yesterday 
journalctl -u nginx  --since '3 days ago'
journalctl -u nginx  --since '3 hours ago'

since と until を組み合わせて期間

since と似たようなものに until があります。

since / until と組み合わせて、ログの表示期間を指定することができる。

json でくれ

-o json-pretty をつければ json でみれるぜ

journalctl -u nginx  --since 'today' -o json-pretty
{
        "__CURSOR" : "s=0997617705f94f34ae01266fa219a576;i=550fb9;b=2bf63364741441b1a80057285897e9b8;m=9ae801170e;t=571a3677f43ab;x=294ec4728d5abe08",
        "__REALTIME_TIMESTAMP" : "1532321513554859",
        "__MONOTONIC_TIMESTAMP" : "665317349134",
        "_BOOT_ID" : "2bf63364741441b1a80057285897e9b8",
        "_MACHINE_ID" : "19458862819a493f879c4a7d4730c653",
        "_HOSTNAME" : "acid",
        "PRIORITY" : "6",
        "SYSLOG_FACILITY" : "3",
        "SYSLOG_IDENTIFIER" : "systemd",
        "_UID" : "0",
        "_GID" : "0",
        "_TRANSPORT" : "journal",
        "_CAP_EFFECTIVE" : "3fffffffff",
        "CODE_FILE" : "../src/core/unit.c",
        "CODE_LINE" : "1493",
        "CODE_FUNCTION" : "unit_status_log_starting_stopping_reloading",
        "_PID" : "1",
        "_COMM" : "systemd",
        "_EXE" : "/lib/systemd/systemd",
        "_CMDLINE" : "/sbin/init",
        "_SYSTEMD_CGROUP" : "/init.scope",
        "_SYSTEMD_UNIT" : "init.scope",
        "_SYSTEMD_SLICE" : "-.slice",
        "UNIT" : "nginx.service",
        "MESSAGE_ID" : "de5b426a63be47a7b6ac3eaac82e2f6f",
        "MESSAGE" : "Stopping A high performance web server and a reverse proxy server...",
        "_SOURCE_REALTIME_TIMESTAMP" : "1532321513554828"
}

他のフィルタ方法

その他にも

_PID=8088 として プロセスIDごとで見たり

_UID=108 として UID ごとで見たり

--no-pagerページャーを無効にしたり

でも、これってgrep である程度できるので特に実験はしない。

日付の絞り込みはgrep では苦手な分野なので重宝しそう。

また、grep ができないことや日付以外は jq を使えば条件書けるし工夫次第では便利だと思う。

参考資料

https://www.loggly.com/ultimate-guide/using-journalctl/

systemdのjournalctl で指定のサービスのログを見たいけど見れない(mysql)

mysql のログが見れない。

systemctl コマンドの status でログが見れる。

takuya@:mysql$ systemctl status mysqld.service
● mariadb.service - MariaDB database server
   Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
(snif)
      CPU: 717ms
   CGroup: /system.slice/mariadb.service
           └─19015 /usr/sbin/mysqld

 7月 23 14:20:31 acid systemd[1]: Starting MariaDB database server...
 7月 23 14:20:32 acid mysqld[19015]: 2018-07-23 14:20:32 139713357013568 [Note] Using unique option prefix 'key_buffer' is error-prone and can break in the future. Please use the full name 'k
 7月 23 14:20:32 acid mysqld[19015]: 2018-07-23 14:20:32 139713357013568 [Note] /usr/sbin/mysqld (mysqld 10.1.26-MariaDB-0+deb9u1) starting as process 19015 ...
 7月 23 14:20:33 acid systemd[1]: Started MariaDB database server.

しかし、journalctl では no entry

no entries と言われる。

takuya@:mysql$ journalctl -u mysqld.service
-- No entries --

は?ふざけんな。 systemd

mariadb で見れる。

30分ほど悩んだ結果。これで見れることがわかる。

takuya@:mysql$ journalctl -u mariadb.service
-- Logs begin at Tue 2018-05-29 01:08:01 JST, end at Mon 2018-07-23 14:32:02 JST. --
 6月 18 16:35:28 acid systemd[1]: Stopping MariaDB database server...
 6月 18 16:35:30 acid systemd[1]: Stopped MariaDB database server.
-- Reboot --
 6月 18 16:58:00 acid systemd[1]: Starting MariaDB database server...
 6月 18 16:58:02 acid mysqld[1733]: 2018-06-18 16:58:02 140132049048128 [Note] Using unique option prefix 'key_buffer' is error-prone and can break in the future. Please use the full name 'ke

systemd 要注意

別名だと見れないのかよ。グループに注意する必要がある。systemd はもうちょっとなんとかならないんですか。。。

php composer intall で github rate Limitと言われたときの対処方法

composer install ができなくて詰んだ

composer instal しようとしたら次のエラーが

Could not fetch ~, please create a GitHub OAuth token to go over the API rate limit

GitHub OAuth token to go over the API rate limit のエラーはfetch の上限に掛かったらしい。

対応;自分のキーを使う。

パーソナルアクセストークンを使うといいんです。→ https://github.com/settings/tokensトークンを確認

ScrenCaptured 2018-07-21 20.04.06

画面でトークンを作ったら、それをcomposer の設定に登録する。

composer にトークンをいれる

composer config -g github-oauth.github.com <your_oauthtoken>

面倒くさいときは、コマンドでトークンを発行

curlトークンを作ったら楽だね。

curl -u '[your github username]' \
-d '{"scopes":["repo"],"note":"token for composer "}' \
https://api.github.com/authorizations

参考資料

公式にドキュメントがあります。

https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens

windows 10 でログオフを楽にキーボードショートカットを割り当てる

Windows 10 でログオフが煩雑になった

Windows 10でログオフやCTRL-ALT-DELで押した画面にキーボードショートカットがなくなった。 いままではシングルキー(ALT系)が割り当てられていたのでキー操作だけでログオフができた

いまはできない

また、Win-Lでロック画面を起動した後に、Wを押せばログイン画面に戻せたのに。 ロック画面でのユーザー切り替えにショートカットがなくなった

マウス持つのめんどくさい。タッチパネルならタッチするだけなのですが、通常のPCモニタに対してタッチパネルなど購入していただけるはずもなく

ログオフコマンドにキーボードショートカットを割り当てる。

f:id:takuya_1st:20180720134553p:plain

やり方は簡単

logoff.exe のショートカットを作ってスタートメニューに登録し、プロパティを開く、ショートカットを登録

登録したショートカットはグローバルショートカットとして動作する

ログオフはコマンドラインから呼び出せる

ログオフってコマンドなんですよ。

f:id:takuya_1st:20180720135130p:plain

ログオフの実体は %systemroot%

sys32 にある logoff.exe がログオフコマンドの本体

f:id:takuya_1st:20180720135050p:plain

ショートカットを作って、そこにグローバルなショートカットを割り当てる。

f:id:takuya_1st:20180720135026p:plain

なんでこんな面倒なことをやってるのか

Win-Lでロックすればいいんだけど。 共有PCなんだからロック画面でも誰も座ってなかったらログインすればいいのに、

「takuyaさん ログイン中ですがパソコン使ってます?」といちいちくそ丁寧に聞いてくるパソコンの大先生がいっぱいるんですよ。

もうね、あほかと。いちいち聞かずにログインしてしまえばいいじゃないか。返事するのもめんどくさい。

共有PCでロック状態で放置してたらログインすればいいじゃん。 ロック画面にユーザーの名前が出るからめんどくさいマイクロソフトが悪い。

めんどくさすぎなのでWin-L以外のパパっとログオフする必要があった。

はぁ、PCの仕組みより、「マナー」っぽいことを自分ルールで増やされるのは困る。

追記

Home editionにはlogoff.exeがなかった

どんなwindowsにもついてるわけではなさそう

ext4 の拡張はマウントしたまで出来た

ext4 のリサイズ

マウントを解除して、、て思ってて、うっかりやらかしたら、そのまま拡張できちゃった。

マウントしたままで出来たわ

takuya@:~$ sudo resize2fs /dev/mapper/spanning--test-spanning--lv
resize2fs 1.43.4 (31-Jan-2017)
Filesystem at /dev/mapper/spanning--test-spanning--lv is mounted on /home/takuya/mnt/spanning; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 4
The filesystem on /dev/mapper/spanning--test-spanning--lv is now 7861248 (4k) blocks long.

takuya@:~$ df /dev/mapper/spanning--test-spanning--lv -h
ファイルシス                            サイズ  使用  残り 使用% マウント位置
/dev/mapper/spanning--test-spanning--lv    30G  1.1G   27G    4% /home/takuya/mnt/spanning
takuya@:~$

まぁほとんどやることはないんだろうけど便利ですよね。

関連

lvm でオンラインリサイズできたのか - それマグで!

MacのSecurity コマンドでキーチェインから読み出したときにパーミッションを聞かれないようにする。

security コマンドでパスワード見るとダイアログが邪魔

sudo security find-generic-password  -a  0000docomo  -w

ダイアログが出てくる。

https://i.gyazo.com/43f43c8debf3fd07dba3006374e0d558.png

キーチェインのダイアログを消す。

該当のキー(パスワード)のエントリにアクセス許可を出せばいい。

ただしiCloudのキーチェインはさわれないのでシステムキーチェインに限る。もしiCloudにしかエントリがなければ、システムキーチェインにコピーする(同期されないけど)

https://i.gyazo.com/195540a92a5c42fc04a3c671b80b5f32.png

これが許可した状態

security コマンドにアクセス許可を与えておくと、次からパスワード確認なく使える。

https://i.gyazo.com/32937e9fede87f2725abc6eaceced675.png

関連資料

Macのsecurity コマンドでキーチェインからwifi のssid のパスワードを取り出す - それマグで!

macのファイルダイアログで隠しフォルダ( /usr, /bin ) を表示するのにキーボードショートカットが便利

キーボードショートカットで隠しをファイル・フォルダを表示

CMD + SHIFT + .

ファイルダイアログからしか不可視フォルダの表示と非表示を切り替えられないのですが。

コマンドから入力して、常に表示するには

defaults write com.apple.finder AppleShowAllFiles No; killall Finder

もとに戻すには

defaults write com.apple.finder AppleShowAllFiles Yes; killall Finder

参考資料

https://ianlunn.co.uk/articles/quickly-showhide-hidden-files-mac-os-x-mavericks/

findコマンドで日付と時刻を指定して最近のファイルを削除する

find コマンドで最近のファイルを削除したい

間違って作っちゃったファイルなどを削除したい。 find コマンドならそれも簡単

find コマンドで今日のファイルを見つける

今日(直近24時間)のファイルを見つける

find var/tmp -type f -daystart  -mtime -1  -exec ls -l {} \;

削除と組み合わせる

find var/tmp -type f -daystart  -mtime -1  -delete {} \;

ここ30分のファイルを一覧する

find /var/cache/nginx/fpm -type f -mmin -30 -exec ls -l {} \;

mmin の m は mitime のm 、なので、 amin: atimecmin:ctime も使える。

ここ30分のファイルを削除する

find /var/cache/nginx/fpm -type f -mmin -30 -delete;

find コマンド便利

ファイルを探すのにとても便利なのに、あまり使われていないと思う。なんでみんな手作業でやっちゃうの?

以前のエントリもみてください

すぐわかるfindコマンドの使い方 - それマグで!

nl で空行(empty line) を表示する

nl コマンドで行番号を空行を含めて表示する

なにもない行を無視してしまうので、空行を含めて行番号表示したいですよね。

オプションをつける

nl -b a

-b, --body-numbering=STYLE のオプションで all の a をつける。

実行サンプル

takuya@webhooks$ cat .env  | nl -b a
     1    APP_NAME=Laravel
     2    APP_ENV=local
     3    APP_KEY=base64:q/pPI5TtWLR7nyYTlFTsoV/fKaFTRNNXuRsaYHa5pWY=
     4    APP_DEBUG=true
     5    APP_LOG_LEVEL=debug
     6    APP_URL=http://localhost
     7
     8    #DB_CONNECTION=mysql
     9    #DB_HOST=127.0.0.1
    10    #DB_PORT=3306
    11    #DB_DATABASE=homestead
    12    #DB_USERNAME=homestead
    13    #DB_PASSWORD=secret
    14
    15    BROADCAST_DRIVER=log
    16    CACHE_DRIVER=file
    17    SESSION_DRIVER=file
    18    SESSION_LIFETIME=120
    19    QUEUE_DRIVER=sync
    20
    21    REDIS_HOST=127.0.0.1
    22    REDIS_PASSWORD=null
    23    REDIS_PORT=6379
    24
    25    MAIL_DRIVER=smtp
    26    MAIL_HOST=smtp.mailtrap.io
    27    MAIL_PORT=2525
    28    MAIL_USERNAME=null
    29    MAIL_PASSWORD=null
    30    MAIL_ENCRYPTION=null
    31
    32    PUSHER_APP_ID=
    33    PUSHER_APP_KEY=
    34    PUSHER_APP_SECRET=
    35    PUSHER_APP_CLUSTER=mt1

参考資料

関連資料

行番号を付けるためだけのコマンド【nl】(順位を表示にもつかえそう) - それマグで!

参考資料

sed で指定行に「挿入」する

sed で指定した行に文字を挿入

sed 使うと、X行目に文字を追加することができます。

sed  -i '3i#Hello' /etc/hosts

これを実行すると、 3行目に、#Hello が挿入されます。

ちゃんと3行目に追加されたのか

nl を組み合わせることで、sed の結果を行数を見ながら確認ができます。

cat file | sed -e 'command' | nl -b a

sed 実験するときのコツ→ cat / nl

cat をあわせて使う。

sed -i でファイルを直接書き換えると、もとに戻すのが面倒くさい。 なので、実験にはオプションでやるか、cat を使う

直接書き換えるときは -i を使う

直接書き換える

sed -i file

書き換え前に試す

sed '10iName' file

または、cat を使う

cat file | sed '10iName'

2019/05/16

カテゴリ整理

Macのsecurity コマンドでキーチェインからwifi のssid のパスワードを取り出す

macssid のパスワードをターミナルからコマンド経由で取り出す。

security コマンドを使うと、無線LANのパスワード(PSK)を平分で取得することができる。

WiFiのキーをSSIDごとに、キーチェインが保存しているので、それを指定して取り出す感じ

コマンド

security find-generic-password -D "AirPort network password"  -a $SSID -g

自分のキーチェインから取り出すのsudo はときに使わない、KeychainAgentからローカルのユーザー認証を聞かれるので自分のMacユーザー名とパスワードをいれる。

パスワードだけがほしい。

パスワードだけがほしいときは、 -w オプションにする

security find-generic-password -D "AirPort network password"  -a $SSID -w

実行例

takuya@Desktop$ security find-generic-password -D "AirPort network password"  -a  0000docomo -g
keychain: "/Library/Keychains/System.keychain"
version: 256
class: "genp"
attributes:
    0x00000007 <blob>="0000docomo"
    0x00000008 <blob>=<NULL>
    "acct"<blob>="0000docomo"
    "cdat"<timedate>=0x32303134303532353039333232305A00  "20140525093220Z\000"
    "crtr"<uint32>=<NULL>
    "cusi"<sint32>=<NULL>
    "desc"<blob>="AirPort network password"
    "gena"<blob>=<NULL>
    "icmt"<blob>=<NULL>
    "invi"<sint32>=<NULL>
    "mdat"<timedate>=0x32303134303532353039333232305A00  "20140525093220Z\000"
    "nega"<sint32>=<NULL>
    "prot"<blob>=<NULL>
    "scrp"<sint32>=<NULL>
    "svce"<blob>="AirPort"
    "type"<uint32>=<NULL>
password: "B35D084737"

ちなみに 0000docomo は日本全体で共通なので公開しても構わないものである。

実はオプションはほとんどなくてもいい。

明示的にSSIDを指定してわかりやすくして上記例を書いたけど。オプションは次のもので十分

sudo security find-generic-password  -a  0000docomo  -w

これで十分。

2018-07-18 追記

オプションについて記述を追加

参考資料

https://apple.stackexchange.com/questions/176119/how-to-access-the-wi-fi-password-through-terminal

関連記事

Macに保存時したWifiパスワードを表示するにはキーチェインアクセス - それマグで!

networksetupコマンドの使い方:ヘルプのみかた

networksetup コマンド

mac には networksetup コマンドという、ネットワークでアレコレするためのコマンドが用意されている。

コマンドでアレコレできるけど、だんだんめんどくさくなって、Xcode立ち上げてAPI叩いちゃうんだけどさ。

networksetup コマンドの気持ちを理解してあげることにした。

バイス(en0) なのか 名前(Wi-Fi) なのか

たとえば、SSIDにつなぐときは次のようにする。

sudo networksetup -setairportnetwork en0  0000docomo shared_key

たとえば、DNSを上書きするには次のようにする

networksetup -setdnsservers Wi-Fi 8.8.8.8

ヘルプを見ると書いてある。

networksetup -setairportpower <device name> <on off>
networksetup -setdnsservers <networkservice> <dns1> [dns2] [...]

ヘルプを見れば書いてあるんだけど、いつもどっちなのか見失う。

<device name> が en0 のようなデバイス<networkservice> がネットワーク名

確認するには

networksetup -listallhardwareports

実行すると、次のようになる。

Hardware Port: Wi-Fi
Device: en0
Ethernet Address: 60:03:xxxxxxxxxx

ここの出力から <networkservice>Hardware Port が対応し、<device name>Device が対応してることがわかる。

無線LANのことは airpot と呼ぶ

無線LANのことは歴史的背景から airport と呼ぶ。Wi-Fiなどのなまえは使わない。

なので無線LAN関連の設定コマンドを見るときは grep で airport してあげればいい。

takuya@my_command$ networksetup -setdnsservers | grep airport
networksetup -getairportnetwork <device name>
networksetup -setairportnetwork <device name> <network> [password]
networksetup -getairportpower <device name>
networksetup -setairportpower <device name> <on off>

プロキシ関連の設定を見たければ

同じように grep で見てあげれば、使い方が出てくる。

takuya@my_command$ networksetup | \grep -P "(?<=networksetup ).+proxy.+"

Usage: networksetup -getwebproxy <networkservice>
Usage: networksetup -setwebproxy <networkservice> <domain> <port number> <authenticated> <username> <password>
Usage: networksetup -setwebproxystate <networkservice> <on off>
Usage: networksetup -getsecurewebproxy <networkservice>
Usage: networksetup -setsecurewebproxy <networkservice> <domain> <port number> <authenticated> <username> <password>
Usage: networksetup -setsecurewebproxystate <networkservice> <on off>
(略
Usage: networksetup -setautoproxyurl <networkservice> <url>
Usage: networksetup -getautoproxyurl <networkservice>
Usage: networksetup -setautoproxystate <networkservice> <on off>

networksetup でできないこと

たとえば、MACアドレスを変更したり、ルーティング・テーブルを変更したりといったことはできない。

man を見ると、次のように書いてある。

NETWORKSETUP(8)           BSD System Manager's Manual          NETWORKSETUP(8)

NAME
     networksetup -- configuration tool for network settings in System Preferences.

man には次の通り、 network settings in System Preferences. つまり、システム環境設定でできることは全てできるってことですね。

6to4 とかあったんですね。。

すべてのオプションはこれ。。。

おおいなぁ。

takuya@my_command$ networksetup
-addDeviceToBond                     -duplicatenetworkservice             -getinfo                             -listVLANs                           -removepreferredwirelessnetwork      -setmanualwithdhcprouter             -setv4off
-addpreferredwirelessnetworkatindex  -enableloginprofile                  -getmacaddress                       -listallhardwareports                -renamenetworkservice                -setmedia                            -setv6LinkLocal
-connectpppoeservice                 -enablesystemprofile                 -getmedia                            -listallnetworkservices              -set6to4automatic                    -setnetworkserviceenabled            -setv6additionalroutes
-create6to4service                   -enableuserprofile                   -getnetworkserviceenabled            -listalluserprofiles                 -set6to4manual                       -setpassiveftp                       -setv6automatic
-createBond                          -export8021xLoginProfiles            -getpassiveftp                       -listdevicesthatsupportVLAN          -setMTU                              -setpppoeaccountname                 -setv6manual
-createVLAN                          -export8021xProfiles                 -getproxyautodiscovery               -listlocations                       -setadditionalroutes                 -setpppoepassword                    -setv6off
-createlocation                      -export8021xSystemProfile            -getproxybypassdomains               -listloginprofiles                   -setairportnetwork                   -setproxyautodiscovery               -setwebproxy
-createnetworkservice                -export8021xUserProfiles             -getsearchdomains                    -listnetworkserviceorder             -setairportpower                     -setproxybypassdomains               -setwebproxystate
-createpppoeservice                  -getMTU                              -getsecurewebproxy                   -listpppoeservices                   -setbootp                            -setsearchdomains                    -showBondStatus
-deleteBond                          -getadditionalroutes                 -getsocksfirewallproxy               -listpreferredwirelessnetworks       -setcomputername                     -setsecurewebproxy                   -showpppoestatus
-deleteVLAN                          -getairportnetwork                   -getstreamingproxy                   -listvalidMTUrange                   -setdhcp                             -setsecurewebproxystate              -switchtolocation
-deletelocation                      -getairportpower                     -getv6additionalroutes               -listvalidmedia                      -setdnsservers                       -setsocksfirewallproxy               -version
-deleteloginprofile                  -getcomputername                     -getwebproxy                         -ordernetworkservices                -setftpproxy                         -setsocksfirewallproxystate
-deletepppoeservice                  -getcurrentlocation                  -help                                -printcommands                       -setftpproxystate                    -setstreamingproxy
-deleteuserprofile                   -getdnsservers                       -import8021xProfiles                 -removeDeviceFromBond                -setgopherproxy                      -setstreamingproxystate
-detectnewhardware                   -getftpproxy                         -isBondSupported                     -removeallpreferredwirelessnetworks  -setgopherproxystate                 -settlsidentityonsystemprofile
-disconnectpppoeservice              -getgopherproxy                      -listBonds                           -removenetworkservice                -setmanual                           -settlsidentityonuserprofile

参考資料

man networksetup

mac のDNSの設定をコマンドから追加し削除し取得する。

Mac の設定のネットワークのDNSのところ

次のところの設定を追加したり削除するのに、設定→ネットワーク→Wifi→詳細→DNS→追加ボタン と手順が多すぎる。

f:id:takuya_1st:20180710024839p:plain:w250

DNSサーバーの設定を書き換える。

DNSサーバーをDHCPでもらったもの以外に指定する。

networksetup -setdnsservers Wi-Fi 1.1.1.1 8.8.8.8

これで、追加できる。

削除

設定をクリアする。

DNSサーバーの指定を解除する

networksetup -setdnsservers Wi-Fi "Empty"

状況としてはクリアしたいときのほうが多いよね。Emptyと文字列をいれるってことが分からなくて苦労した

設定を確認する。

現在の設定を取得して、いまのDNS設定を確認するには。

networksetup -getdnsservers Wi-Fi 

これを使えば、いまDHCPDNS割当を「上書き」の設定をしているか確認できる。

DHCPからのDNS割当を確認するには

cat /etc/resolv.conf

resolv.conf を見るのが手軽だと思う。

ネットワークを設定する名前を取得する

今回の例では「Wi-Fi」といきなり書いていたが、この名前はプロファイルによって管理されていて、その名前は次のコマンドで取得できる。

takuya@my_command$ networksetup  -listallnetworkservices
An asterisk (*) denotes that a network service is disabled.
USB-Serial Controller
Wi-Fi
PPPoE
Apple USB Ethernet Adapter
iPhone USB
Bluetooth PAN

ハードウェアとネットワーク名の対応は次のコマンドで

初期設定は en0がWi-Fi なので、それ以外を使うことは殆どないと思うけど。

takuya@my_command$ networksetup -listallhardwareports

Hardware Port: Wi-Fi
Device: en0
Ethernet Address: 60:03:xxxxxxxxxxxx

Hardware Port: Bluetooth PAN
Device: en3
Ethernet Address: 60:03:xxxxxxxxxxxxxx

Hardware Port: Thunderbolt 1
Device: en1
Ethernet Address: 72:00:xxxxxxxxxxx

Hardware Port: Thunderbolt 2
Device: en2
Ethernet Address: 72:00:xxxxxxxxxx

Hardware Port: Thunderbolt ブリッジ
Device: bridge0
Ethernet Address: 62:03:xxxxxxx

Hardware Port: Thunderbolt Bridge
Device: bridge1
Ethernet Address: 62:03:xxxxxxxxxx

VLAN Configurations
===================

参考

networksetup

ブラウザでリモートのターミナルを起動できるShell in A box がiOSから使うのに便利

Shell in a Box が便利だった

Macからはターミナルで解決するし、特に生活に不便を感じないんだが、ちょっとしたファイルサーバーのメンテンス(ファイル消す)とかでMac起動するのもめんどくさい

iOS Safariから使えるターミナル

各種ターミナルのアプリがあるんだが、秘密鍵のインストールとかめんどくさいし。

f:id:takuya_1st:20180703165322p:plain

インストール

sudo apt install shellinabox

しかも手軽にインストールができる。

起動

sudo service shellinabox start

アクセス

ローカルアドレスの :4200 にhttpsでアクセスする

open https://127.0.0.1:4200

これでOK。あとはログイン画面が出てくる

アクセスする

f:id:takuya_1st:20180703165920p:plain

https でアクセスする必要がある。

基本的な設定

/etc/default/shellinabox 設定ファイル

基本的な設定ファイルは debianの場合は次の場所に保存されていました。

# Should shellinaboxd start automatically                                          
SHELLINABOX_DAEMON_START=1                                                         
                                                                                   
# TCP port that shellinboxd's webserver listens on                                 
SHELLINABOX_PORT=4200                                                              
                                                                                   
# Parameters that are managed by the system and usually should not need            
# changing:                                                                        
# SHELLINABOX_DATADIR=/var/lib/shellinabox                                         
# SHELLINABOX_USER=shellinabox                                                     
# SHELLINABOX_GROUP=shellinabox                                                    
                                                                                   
# Any optional arguments (e.g. extra service definitions).  Make sure              
# that that argument is quoted.                                                    
#                                                                                  
#   Beeps are disabled because of reports of the VLC plugin crashing               
#   Firefox on Linux/x86_64.                                                       
SHELLINABOX_ARGS="--no-beep"          

ローカルホストに限定する

デフォルトでは 0.0.0.0 を listen してしまうので、localhsot に限定する。

SHELLINABOX_ARGS="--no-beep --localhost-only"

nginx と組み合わせる。

http 通信なので、 ssl とかめんどくさいことは nginx にリバプロさせる。

 location /my.shell/ {                                                  
    proxy_pass https://localhost:4200//;                                           
  }          

これで、nginx と組み合わせる事ができる。あと外向きにCertbot でLetsEncyptすれば、SSL問題なく使えそうだ。

nginx に認証を掛ける。

nginx には auth_request ディレクティブがあるので、これを使って認証を掛けることにする。

 location /my.shell/ {                                                  
    auth_request /check_oauth.php;                                                  
    error_page 401 =302  https://$host/oauth.php?redirect_to=$uri&$query_string;   
    proxy_pass https://localhost:4200//;                                           

うん、これで安心

auth_request については、以前書きました。→http://takuya-1st.hatenablog.jp/entry/2018/05/08/182127

便利な点

docker のコンテナにssh 入れなくてもぱぱっと状況を見ることできそう。

iOS から使うと便利。

ターミナルをインストールしなくてブラウザで解決するね。

iOS はアプリを入れられないから、足りない機能やちょっとしたツールは、ブラウザで解決する事が多いしこれで安心。

f:id:takuya_1st:20180703170830j:plain:w200

難点

使ってみてわかった問題。

ログインがローカル経由になるのでリモートIPや接続ログが全部リンクローカルアドレスになる。

転送と描画に時間がかかるので、巨大なファイルをcat すると表示終了までに時間がかかりすぎてヤバイ。

公開鍵認証を使うのが大変。踏み台のDockerに入れるべきかもしれない。

追記

プロセスのfork と exec がどうなってるのかなと、ps叩いてみたら、/usr/bin/shellinaboxd が *:4200 で待ち受けて、root で login を呼び出してて、pts/0 を作ってる

ssh とはちょっと違うのでWEBブラウザSSHというにはちょっと違うかな。

shellin+ 21095  0.0  0.0  37724  5472 ?        Ss   17:02   0:00 /usr/bin/shellinaboxd -q ...
shellin+ 21096  0.0  0.0  37184  2124 ?        S    17:02   0:00  \_ /usr/bin/shellinaboxd -q ...
root     23435  0.0  0.0  74232  3484 pts/0    Ss   18:12   0:00      \_ login -p -h 127.0.0.1                                                                                                                                            
takuya   23444  0.1  0.0  26504 11024 pts/0    S    18:12   0:00          \_ -bash                                                                                                                                                        
takuya   23803  0.0  0.0  38196  3780 pts/0    R+   18:13   0:00              \_ ps auxf                                                                                                                                                  

右クリックメニューで、色を変える

f:id:takuya_1st:20211124033249p:plain

右クリックメニューでキーボードを有効にする

f:id:takuya_1st:20211124033221p:plain

キーボードを常にONにできたらiOSで優秀なターミナルとして動作可能なんだけど。キーボードを常にONにする方法がわからないですね。

iOSの場合は、ランドスケープ(横向き)のすると、キーボードを使いやすい。

f:id:takuya_1st:20211124034740p:plain

2021-11-24 追記

キーボードとカラーについて追記

参考資料

https://www.smarthomebeginner.com/increase-shellinabox-security/

Macが接続しているルーターのIPアドレスをコマンドで取り出す。ルーティングを取得する方法4種

ルーターIPをパパッと取り出したい。

無線ルーターのIPにアクセスしたいときに、設定→ネットワーク→無線LANとたどるのは面倒くさいですよね。

ルーターIPとはなにか?

ネットワークの用語で言えばデフォルトゲートウェイである。つまり ip コマンドでデフォルトゲートウェイを取り出せばいいのである。

冒頭のテーマは次のように換言が可能である。

ここまでの考察から、ルーターIPアドレスとは次のように考えればいい。

ルーターIPアドレスを取り出したい
→ デフォルトゲートウェイのIPを調べる
→ ルーティング・テーブルからデフォルトゲートウェイを取り出す。

ip コマンドでやる場合

macOS に限りらず、GNU Linux では一般的になった iproute2 コマンドで 、デフォルトゲートウェイを取得する

ip route | \grep -Po '(?<=default via )[\d\.]+'

ちなみに、mac でも ip コマンドは使うことができる。brew でインストールが可能。Linuxと同じ環境を実現するために入れておくと便利

Mac らしい方法

networksetup で、WiFi(en0)の設定を取得する・

networksetup -getinfo Wi-Fi | \grep -Po "(?<=Router: )[\d\.]+"

BSDコマンドの routeコマンドを使う場合。

takuya@Desktop$ sudo route get default
   route to: default
destination: default
       mask: default
    gateway: 100.114.91.252
  interface: en0
      flags: <UP,GATEWAY,DONE,STATIC,PRCLONING>
 recvpipe  sendpipe  ssthresh  rtt,msec    rttvar  hopcount      mtu     expire
       0         0         0         0         0         0      1500         0
takuya@Desktop$ sudo route get default | \grep -Po '(?<=gateway:).+'
 100.114.91.252

netstat コマンドを使う場合

netstatawk を組み合わせてもできますね。

takuya@Desktop$ netstat -nr | \grep -Po '(?<=default).+'  | awk '{ print $1 }'
100.114.91.252

ポイント

冒頭でも書いたけど、「ルーターのIP」を調べるという一般的に使われる話し言葉を「技術用語」でどう解釈するか。そこがこの解決方法であった。それにすぐ気づくか気づかないかで、エンジニアとしてのレベルが分かるんじゃないかな。ググってここに到達した人は僕のポエムを参考にしてほしい。

選択肢がいっぱいあるというのは素晴らしい

選択肢がいっぱいあるのは素晴らしい。Windowsにくらべコマンドの互換性やコマンド移植が進んでいるのはやっぱりMacなのかなぁ。