20201201のLinuxに関する記事は11件です。

Linux まとめ

備忘録としてまとめる。

ls

  • * 任意の文字列
  • ? 任意の1文字
$ls *.html
Index.html home.html

$ls /bin/x???
/bin/zcat /bin /bin/zcmp  /bin/znew

オプション

ファイルの詳細情報を表示する。
$ls -l
drwx------+  4 ryohei.udagawa  staff   128  9 16 14:25 Movies
drwx------+  3 ryohei.udagawa  staff    96  9  9 16:17 Music
drwx------+  4 ryohei.udagawa  staff   128  9 16 16:08 Pictures
drwxr-xr-x+  4 ryohei.udagawa  staff   128  9  9 16:17 Public

隠しファイルも含めた全てのファイルを表示する。
$ls -a
.            .ssh            Library
..            .vscode            Movies

ファイル種別を表示する
$ls -F
Applications/    Downloads/    Music/        workspace/
Desktop/    Library/    Pictures/

cat

% cat -n /etc/hosts

1    ##
2    # Host Database
3    #
4    # localhost is used to configure the loopback interface
5    # when the system is booting.  Do not change this entry

less(catより広く見れる)

$less ファイル名

/<文字列>  下方向に向かって検索
?<文字列>  上方向に向かって検索

rm(削除)

ディレクトリも合わせて削除する
rm -r dir

ファイルを削除する際に警告文を表示しない
rm -f file

ファイルの削除前に確認する
rm -I file

mv

mv 移動元 移動先

#ファイル名を変更
$mv file file1

#ファイルを移動(移動先がディレクトリならば、ファイル移動)
$mv file1 dir/

上書きする前に確認する
$mv -I file file1

cp

cp コピー元 コピー先

#ファイルをコピー
$cp file new_file

#ファイルをディレクトリ内にコピー
$cp file dir

上書きする前に確認する
$cp -i file new_file

ディレクトリをコピーする
$cp -r dir new_dir  

find

find 検索開始ディレクトリ 検索条件 アクション

ファイル名を指定してファイルを検索。ファイル名の大文字小文字を区別する
$find .-name README.md

#ワイルドカードが使える。*を使って指定する時は''で囲うこと
$find . -name '*.html' -print

ファイル名を指定してファイルを検索。ファイル名の大文字小文字を区別しない
$find . -iname readme.md

# -type fは通常ファイル
$find . -type f -print

#-type | はシンポリックリンク
find . -type | -print

#-type dはディレクトリ
$find . -type d -print

複数の検索条件を指定。なお、-aは省略可能
$find . -type d -a -name images -print
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Arch Linux: AURヘルパー'yay'のインストール方法

archlinuxのAURヘルパーのなかで一番人気のyayのインストール方法について書いていきます。

今回の内容はとても丁寧かつ慎重にインストールしているので少し面倒に感じる方もいるかもしれませんが、基本コピペするだけでOKなので辛抱してください。

今回は2つのやり方を紹介します。
1つ目はgit cloneを使ったやり方です。
Archlinuxを使っている人はgit cloneを使ってインストールするのがいいでしょう。

2つ目は普通にpacmanでインストールする方法です。
yayがリポジトリに登録されているArchベースのLinuxを使っている人はこちらのほうが簡単なのでこちらの方法をおすすめします。

git cloneを使ったやり方

yayがリポジトリに登録されているかわからない人はとりあえずこちらの方法でインストールしておきましょう。

1.念の為アップデートしておきます。

sudo pacman -Syu

2.git cloneを使うのでまずはgitをインストールします。

sudo pacman -S git

3.yayはGO言語で書かれているのでGOコンパイラをインストールします。

sudo pacman -S go

4.次のステップでgitをクローンするので、クローンする場所へ移動します。
まあ別に移動しなくてもいいのですが、今回はわかりやすいようにDownloadsフォルダに移動します。

cd Downloads

5.gitリポジトリからクローンします。AUR-yay-git

git clone https://aur.archlinux.org/yay-git.git

6.lsでyayディレクトリがあるか確認します。すると'yay'と出ると思います。出たら成功なので次のステップへ進みます。

ls

7.cdコマンドを使ってyayディレクトリに入ります。

cd yay

8.ついにソースからビルドしていきます。

makepkg -si

9.ビルドが完了したあと、以下のコマンドを実行しyayのバージョン((yay v10.1.1 - libalpm v12.0.2)←こんな感じの(2020/12/01/現在))が出ればインストール完了です。
もうDownloadsフォルダにあるyayは消してもらって構いません。

yay -V

pacmanを使ったやり方

1.念の為アップデートしておきます。

sudo pacman -Syu

2.インストールします。

sudo pacman -S yay

3.以下のコマンドを実行しyayのバージョン((yay v10.1.1 - libalpm v12.0.2)←こんな感じの(2020/12/01/現在))が出ればインストール完了です。

yay -V
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

nlコマンドの使い方を調べる

Unix系のコマンドライン環境には、様々なマニュアルがシステム上に備わっています。この記事では、nlコマンドの使い方をコマンドの機能を用いて調べる方法を説明していきます。実際のnlの使い方については次回以降の記事で説明していく予定です。

マニュアルの表示方法

--helpオプション

一番簡単に参照できるのは、コマンドのオプションにあるヘルプ(Usage)を見ることです。実装によってはヘルプがない場合もあります。

※”▶”の行をクリックすると実行結果が表示されます

$ nl --help #GNU coreutils
coreutils
Usage: gnl [OPTION]... [FILE]...
Write each FILE to standard output, with line numbers added.

With no FILE, or when FILE is -, read standard input.

Mandatory arguments to long options are mandatory for short options too.
  -b, --body-numbering=STYLE      use STYLE for numbering body lines
  -d, --section-delimiter=CC      use CC for logical page delimiters
  -f, --footer-numbering=STYLE    use STYLE for numbering footer lines
  -h, --header-numbering=STYLE    use STYLE for numbering header lines
  -i, --line-increment=NUMBER     line number increment at each line
  -l, --join-blank-lines=NUMBER   group of NUMBER empty lines counted as one
  -n, --number-format=FORMAT      insert line numbers according to FORMAT
  -p, --no-renumber               do not reset line numbers for each section
  -s, --number-separator=STRING   add STRING after (possible) line number
  -v, --starting-line-number=NUMBER  first line number for each section
  -w, --number-width=NUMBER       use NUMBER columns for line numbers
      --help     display this help and exit
      --version  output version information and exit

Default options are: -bt -d'\:' -fn -hn -i1 -l1 -n'rn' -s<TAB> -v1 -w6

CC are two delimiter characters used to construct logical page delimiters;
a missing second character implies ':'.

STYLE is one of:

  a      number all lines
  t      number only nonempty lines
  n      number no lines
  pBRE   number only lines that contain a match for the basic regular
         expression, BRE

FORMAT is one of:

  ln     left justified, no leading zeros
  rn     right justified, no leading zeros
  rz     right justified, leading zeros


GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Report any translation bugs to <https://translationproject.org/team/>
Full documentation <https://www.gnu.org/software/coreutils/nl>
or available locally via: info '(coreutils) nl invocation'

coreutilsのnlでは、使えるオプションの一覧などを簡潔に表示してくれます。しかし、BSD系のnlでは、エラーメッセージ「nl: illegal option -- -」が先頭に表示されます。

$ nl --help #*BSD(macOS)

*BSD(macOS)
nl: illegal option -- -
usage: nl [-p] [-b type] [-d delim] [-f type] [-h type] [-i incr] [-l num]
          [-n format] [-s sep] [-v startnum] [-w width] [file]

結果的にヘルプは表示されていますが、--helpオプションが実装されておらず間違った使い方だと認識されています。そのため親切に有効なオプションを同時に表示してくれているというわけです。

Manpage

前回の記事でも軽く触れましたが、ManpageはUnix系のシステムで最も一般的なマニュアルの確認方法です。コマンドだけでなく様々な情報をまとめています。例えば他のカテゴリにも同一名の項目がある場合には、セクション番号を指定して区別する必要があります。コマンドのセクション番号は1です。たとえば、printf1でコマンド、3でC言語の関数についての説明を読むことができman 3 printfのようにセクション番号を指定します。Manpageのページャはlessと同じ操作で扱うことができますので、スペースでページ送り、qで終了できます。

$ man nl #GNU coreutils
coreutils
NL(1)                            User Commands                           NL(1)



NAME
       nl - number lines of files

SYNOPSIS
       nl [OPTION]... [FILE]...

DESCRIPTION
       Write each FILE to standard output, with line numbers added.

       With no FILE, or when FILE is -, read standard input.

       Mandatory  arguments  to  long  options are mandatory for short options
       too.

       -b, --body-numbering=STYLE
              use STYLE for numbering body lines

       -d, --section-delimiter=CC
              use CC for logical page delimiters

       -f, --footer-numbering=STYLE
              use STYLE for numbering footer lines

       -h, --header-numbering=STYLE
              use STYLE for numbering header lines

       -i, --line-increment=NUMBER
              line number increment at each line

       -l, --join-blank-lines=NUMBER
              group of NUMBER empty lines counted as one

       -n, --number-format=FORMAT
              insert line numbers according to FORMAT

       -p, --no-renumber
              do not reset line numbers for each section

       -s, --number-separator=STRING
              add STRING after (possible) line number

       -v, --starting-line-number=NUMBER
              first line number for each section

       -w, --number-width=NUMBER
              use NUMBER columns for line numbers

       --help display this help and exit

       --version
              output version information and exit

       Default options are: -bt -d'\:' -fn -hn -i1 -l1 -n'rn' -s<TAB> -v1 -w6

       CC are two delimiter characters used to construct logical  page  delim-
       iters; a missing second character implies ':'.

       STYLE is one of:

       a      number all lines

       t      number only nonempty lines

       n      number no lines

       pBRE   number  only  lines  that  contain a match for the basic regular
              expression, BRE

       FORMAT is one of:

       ln     left justified, no leading zeros

       rn     right justified, no leading zeros

       rz     right justified, leading zeros

AUTHOR
       Written by Scott Bartram and David MacKenzie.

REPORTING BUGS
       GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
       Report any translation bugs to <https://translationproject.org/team/>

COPYRIGHT
       Copyright (C) 2020 Free Software Foundation, Inc.  License GPLv3+:  GNU
       GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
       This  is  free  software:  you  are free to change and redistribute it.
       There is NO WARRANTY, to the extent permitted by law.

SEE ALSO
       Full documentation <https://www.gnu.org/software/coreutils/nl>
       or available locally via: info '(coreutils) nl invocation'



GNU coreutils 8.32                March 2020                             NL(1)

$ man nl #BSD(macOS)
*BSD(macOS)
NL(1)                     BSD General Commands Manual                    NL(1)

NAME
     nl -- line numbering filter

SYNOPSIS
     nl [-p] [-b type] [-d delim] [-f type] [-h type] [-i incr] [-l num]
        [-n format] [-s sep] [-v startnum] [-w width] [file]

DESCRIPTION
     The nl utility reads lines from the named file or the standard input if
     the file argument is omitted, applies a configurable line numbering fil-
     ter operation and writes the result to the standard output.

     The nl utility treats the text it reads in terms of logical pages.
     Unless specified otherwise, line numbering is reset at the start of each
     logical page.  A logical page consists of a header, a body and a footer
     section; empty sections are valid.  Different line numbering options are
     independently available for header, body and footer sections.

     The starts of logical page sections are signalled by input lines contain-
     ing nothing but one of the following sequences of delimiter characters:

           Line      Start of
           \:\:\:    header
           \:\:      body
           \:        footer

     If the input does not contain any logical page section signalling direc-
     tives, the text being read is assumed to consist of a single logical page
     body.

     The following options are available:

     -b type      Specify the logical page body lines to be numbered.  Recog-
                  nized type arguments are:

                  a       Number all lines.

                  t       Number only non-empty lines.

                  n       No line numbering.

                  pexpr   Number only those lines that contain the basic regu-
                          lar expression specified by expr.

                  The default type for logical page body lines is t.

     -d delim     Specify the delimiter characters used to indicate the start
                  of a logical page section in the input file.  At most two
                  characters may be specified; if only one character is speci-
                  fied, the first character is replaced and the second charac-
                  ter remains unchanged.  The default delim characters are
                  ``\:''.

     -f type      Specify the same as -b type except for logical page footer
                  lines.  The default type for logical page footer lines is n.

     -h type      Specify the same as -b type except for logical page header
                  lines.  The default type for logical page header lines is n.

     -i incr      Specify the increment value used to number logical page
                  lines.  The default incr value is 1.

     -l num       If numbering of all lines is specified for the current logi-
                  cal section using the corresponding -b a, -f a or -h a
                  option, specify the number of adjacent blank lines to be
                  considered as one.  For example, -l 2 results in only the
                  second adjacent blank line being numbered.  The default num
                  value is 1.

     -n format    Specify the line numbering output format.  Recognized format
                  arguments are:
                  ln      Left justified.
                  rn      Right justified, leading zeros suppressed.
                  rz      Right justified, leading zeros kept.

                  The default format is rn.

     -p           Specify that line numbering should not be restarted at logi-
                  cal page delimiters.

     -s sep       Specify the characters used in separating the line number
                  and the corresponding text line.  The default sep setting is
                  a single tab character.

     -v startnum  Specify the initial value used to number logical page lines;
                  see also the description of the -p option.  The default
                  startnum value is 1.

     -w width     Specify the number of characters to be occupied by the line
                  number; in case the width is insufficient to hold the line
                  number, it will be truncated to its width least significant
                  digits.  The default width is 6.

ENVIRONMENT
     The LANG, LC_ALL, LC_CTYPE and LC_COLLATE environment variables affect
     the execution of nl as described in environ(7).

EXIT STATUS
     The nl utility exits 0 on success, and >0 if an error occurs.

SEE ALSO
     jot(1), pr(1)

STANDARDS
     The nl utility conforms to IEEE Std 1003.1-2001 (``POSIX.1'').

HISTORY
     The nl utility first appeared in AT&T System V Release 2 UNIX.

BUGS
     Input lines are limited to LINE_MAX (2048) bytes in length.

BSD                            January 26, 2005                            BSD

Texinfo

GNUのコマンドユーティリティであるcoreutilsは、公式のマニュアルとしてTexinfoというものがあります。GNUは情報提供方法としてTexinfoを推奨しているため、Manpageの記述はcoreutilsの開発メンバーによって直接メンテナンスされていません。LinuxではLinux man-page projectが内容の更新を担っています。詳しい説明を参照する場合には、オリジナルのTexinfoを閲覧するほうが良いでしょう。man同様にinfoで各コマンドの説明を表示できます。ページャにはEmacsが使われるため、操作には少々慣れが必要です。スペースでページ送り、Ctrl-x Ctrl-cで終了できます。

$ info nl #GNU coreutils
coreutils
File: coreutils.info,  Node: nl invocation,  Next: od invocation,  Prev: tac invocation,  Up: Output of entire files

3.3 ‘nl’: Number lines and write files
======================================

‘nl’ writes each FILE (‘-’ means standard input), or standard input if
none are given, to standard output, with line numbers added to some or
all of the lines.  Synopsis:

     nl [OPTION]... [FILE]...

   ‘nl’ decomposes its input into (logical) page sections; by default,
the line number is reset to 1 at each logical page section.  ‘nl’ treats
all of the input files as a single document; it does not reset line
numbers or logical pages between files.

   A logical page consists of three sections: header, body, and footer.
Any of the sections can be empty.  Each can be numbered in a different
style from the others.

   The beginnings of the sections of logical pages are indicated in the
input file by a line containing exactly one of these delimiter strings:

‘\:\:\:’
     start of header;
‘\:\:’
     start of body;
‘\:’
     start of footer.

   The two characters from which these strings are made can be changed
from ‘\’ and ‘:’ via options (see below), but the pattern and length of
each string cannot be changed.

   A section delimiter is replaced by an empty line on output.  Any text
that comes before the first section delimiter string in the input file
is considered to be part of a body section, so ‘nl’ treats a file that
contains no section delimiters as a single body section.

   The program accepts the following options.  Also see *note Common
options::.

‘-b STYLE’
‘--body-numbering=STYLE’
     Select the numbering style for lines in the body section of each
     logical page.  When a line is not numbered, the current line number
     is not incremented, but the line number separator character is
     still prepended to the line.  The styles are:

     ‘a’
          number all lines,
     ‘t’
          number only nonempty lines (default for body),
     ‘n’
          do not number lines (default for header and footer),
     ‘pBRE’
          number only lines that contain a match for the basic regular
          expression BRE.  *Note Regular Expressions: (grep)Regular
          Expressions.

‘-d CD’
‘--section-delimiter=CD’
     Set the section delimiter characters to CD; default is ‘\:’.  If
     only C is given, the second remains ‘:’.  (Remember to protect ‘\’
     or other metacharacters from shell expansion with quotes or extra
     backslashes.)

‘-f STYLE’
‘--footer-numbering=STYLE’
     Analogous to ‘--body-numbering’.

‘-h STYLE’
‘--header-numbering=STYLE’
     Analogous to ‘--body-numbering’.

‘-i NUMBER’
‘--line-increment=NUMBER’
     Increment line numbers by NUMBER (default 1).

‘-l NUMBER’
‘--join-blank-lines=NUMBER’
     Consider NUMBER (default 1) consecutive empty lines to be one
     logical line for numbering, and only number the last one.  Where
     fewer than NUMBER consecutive empty lines occur, do not number
     them.  An empty line is one that contains no characters, not even
     spaces or tabs.

‘-n FORMAT’
‘--number-format=FORMAT’
     Select the line numbering format (default is ‘rn’):

     ‘ln’
          left justified, no leading zeros;
     ‘rn’
          right justified, no leading zeros;
     ‘rz’
          right justified, leading zeros.

‘-p’
‘--no-renumber’
     Do not reset the line number at the start of a logical page.

‘-s STRING’
‘--number-separator=STRING’
     Separate the line number from the text line in the output with
     STRING (default is the TAB character).

‘-v NUMBER’
‘--starting-line-number=NUMBER’
     Set the initial line number on each logical page to NUMBER (default
     1).

‘-w NUMBER’
‘--number-width=NUMBER’
     Use NUMBER characters for line numbers (default 6).

   An exit status of zero indicates success, and a nonzero value
indicates failure.

コマンドの互換性

これまで見てきたとおり、主要な実装においてnlは11個のオプションをサポートします。そしてオプションの文字も実装によらず同じものが利用されています。これはPOSIXというIEEEの標準規格によって、コマンドのインターフェースがある程度決められ互換性が維持されているからです。標準化されているおかげで、私たちはどの環境にあるコマンドでもほとんど同じ操作で使用することができるのです。
しかし実際には実装による差も少なからず存在します。それらについても以降の記事で触れていく予定です。


  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

様々なnlコマンドの実装

一口に「nlコマンド」と言っても様々な実装があります。機能に大きな差はありませんが、この記事ではnlの種類とその調べ方について説明していきます。

nlコマンドの種類

最初のnlコマンド

最初にnlが実装されたシステムは、1984年に発売されたAT&Tの「System V Release 2(SVR2)」のようです。FreeBSDのドキュメントにはこのような記載がありました。

HISTORY
The nl utility first appeared in AT&T System V Release 2 UNIX.

出典:https://www.freebsd.org/cgi/man.cgi?query=nl

さらには1987年、X/Open Portability Guide(issue 2)で標準化され、POSIXやSingle Unix Specificationといった後の主要な標準ドキュメントにも記載されていきます。30年以上の歴史あるコマンドですから、今回紹介する実装以外にも様々なnlが存在することでしょう。

GNU coreutils

GNU coreutilsは多くのLinuxディストリビューションで採用されているnlを含む主要なコマンドユーティリティです。他の実装に比べて、GNUによる独自の機能拡張や性能改善がされています。この拡張が互換性や移植性の問題を引き起こすこともありますが、個人的な利用において過度に気にする必要は無いでしょう。

執筆時点の最新版はv8.32で2020年3月にリリースされたものです。最近のLinuxディストリビューションでは、RHEL8やCentOS8、Ubuntu 20.04LTSではv8.30が、Ubuntu 20.10ではv8.32が採用されているようです。

BSD系(macOS、FreeBSD等)

BSD系のnlは単一の提供元が存在するわけではなく、*BSDの実装を元にAppleなどの各OSベンダーが必要に応じた改変を加え提供しているnlの総称的なものになります。もちろん細かな挙動は各々の実装で異なる可能性がありますし、プロプライエタリな実装もあります。

busybox

ルーターなどのLinux組み込み機器では、コマンドユーティリティにbusyboxが採用されていることがあります。busyboxは単一の実行ファイルで、呼び出されたときのコマンド名に応じて様々なコマンドの動作が可能な特殊なソフトウェアです。もちろんnlの機能も内包されています。実行ファイルのサイズがとても小さいので、組み込み機器など記憶領域に制約がある環境で採用されています。

種類やバージョンの調べ方

--versionオプション

--versionオプションでコマンドのバージョンを見ることができます。このとき著作権に関する情報も出力されるので、どんなnlなのかを知ることができます。しかしcoreutils以外のnlの実装では、--versionオプションに対応しておらずエラーと簡単な使い方だけが表示されてバージョンが判明しないこともあります。

Ubuntu 20.04 LTS
$ nl --version
nl (GNU coreutils) 8.30
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Scott Bartram and David MacKenzie.

Ubuntuのnlでは、--versionオプションを使うことで、GNU coreutilsであることがわかりました。

macOS Catalina
% nl --version
nl: illegal option -- -
usage: nl [-p] [-b type] [-d delim] [-f type] [-h type] [-i incr] [-l num]
          [-n format] [-s sep] [-v startnum] [-w width] [file]

一方macOSのnlでは、--versionオプションをサポートしていないので、一意に識別することはできません。

Manpage

Manpageの記述を見ることでも、nlの種類を判断することができます。Manpageが存在しない環境では表示されませんが、ほとんどのLinuxやmacOSで表示できるはずです。man nlと実行すればnlのManpageを読むことができます。著作権やバージョンの記述は下の方に記載されていますので、tailを用いて最後の10行を表示してみましょう。

Ubuntu 20.04 LTS
$ man nl | tail -n 10
       Copyright © 2018 Free Software Foundation, Inc.   License  GPLv3+:  GNU
       GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
       This  is  free  software:  you  are free to change and redistribute it.
       There is NO WARRANTY, to the extent permitted by law.

SEE ALSO
       Full documentation at: <https://www.gnu.org/software/coreutils/nl>
       or available locally via: info '(coreutils) nl invocation'

GNU coreutils 8.30              September 2019                           NL(1)

こちらを見てもUbuntuのnlはcoreutilsであることが確認できました。

macOS Catalina
% man nl | tail -n 10
STANDARDS
     The nl utility conforms to IEEE Std 1003.1-2001 (``POSIX.1'').

HISTORY
     The nl utility first appeared in AT&T System V Release 2 UNIX.

BUGS
     Input lines are limited to LINE_MAX (2048) bytes in length.

BSD                            January 26, 2005                            BSD

macOSはManpageのフッターを見ることで、BSD系のnlであることが確認できました。

コマンドの識別

コマンドは絶対パスではなくコマンド名だけで呼び出すことがほとんどです。しかし一つの環境で複数のnlがインストールされている場合など、どのコマンドが呼び出されているのかわからなくなることがあります。このような場合にはwhichを利用することで、デフォルトでどのコマンドが実行されているのかを調べることができます。

$ which nl
/usr/bin/nl

これで/usr/bin/nlが実行されることがわかります。さらに詳細を知りたい場合は、先ほどの例にならい/usr/bin/nl --versionを実行してバージョンなどを調べてみると良いでしょう。

実行されるコマンドはシェルの環境変数である$PATHに基づいて選ばれています。詳しくは説明しませんが、この環境変数を変更することで、実行するデフォルトのコマンドを変更することができます。


補足

この記事シリーズでは特に断りのない限り、GNU coreutilsのnlを使用します。

macOSでcoreutilsのnlを利用したい場合は、brewなどを利用してインストールできます。デフォルトではgnlという名前のコマンドとしてインストールされ、もとのBSD系のnlと使い分けることができます。他のcoreutilsのコマンドも頭にgをつければ使うことができます。

% brew install coreutils
(略)
% gnl --version
(略)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

teeでリアルタイムでログ出力をする

  • 普通に呼ぶと、コマンド終了後にteeに渡させるので、リアルタイムでみることはできない
  • scriptコマンドから呼ぶといいみたい
script -c "./apply.sh aaa /dev/null" | tee out.log
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DNS over TLS(unbound)

IIJ Public DNSサービス(ベータ版)
IIJさんが、DoT,DoHを試験サービスとして提供してくれています。
2022年3月31日までの予定だそうです。
DoT,DoHの普及へ向けた、大事なテストですね。
Androidでも利用させていただいています。

今回はLaptopでWifiのみの接続での利用です。
ルーター経由でインターネットに接続しています。
Linux Mint 20 "Ulyana" - MATE (64-bit) をインストールしたところから始まります。
インストール直後の起動では、grubのメニューが立ち上がらず、

set root=(hd0,gpt6)
set prefix=(hd0,gpt6)/boot/grub
insmod normal
normal

これでgrubメニューが表示され、無事に立ち上がりました。
次回からも無事立ち上がるように、grubを再インストールします。
UEFIなので、下記のような感じになりました。

sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Mint --recheck
sudo update-grub

シャットダウンして、電源入れ直し。LaptopでLinux Mintが無事、立ち上がりました。

さて本題。
DNS over TLSをクライアントとして利用するために、unboundを用いました。

sudo apt install unbound

インストールされたunboundには2つの設定ファイルが用意されていました。

qname-minimisation.conf
root-auto-trust-anchor-file.conf

そこに設定ファイルを1つ追加します。

dns-over-tls.conf
server:
        tls-cert-bundle: /etc/ssl/certs/ca-certificates.crt

forward-zone:
        name: "."
        forward-tls-upstream: yes  #DoT

        #IIJ DoT 
        forward-addr: 2001:300::5@853#public.dns.iij.jp
        forward-addr: 2001:300::6@853#public.dns.iij.jp
        forward-addr: 103.2.57.5@853#public.dns.iij.jp
        forward-addr: 103.2.57.6@853#public.dns.iij.jp

tls-cert-bundleに、ca-certificatesパッケージのca-certificates.crtを指定します。(memo: dpkg -L ca-certificates)
@でdomain-sのポート853を指定しています。
#public.dns.iij.jpでtlsで認証証明書のチェックをするドメイン名を指定しています。
※設定しているIPアドレスは、2020/12/01時点でのpublic.dns.iij.jpのアドレスです。

sudo cp dns-over-tls.conf /etc/unbound/unbound.d/
service unbound restart

設定ファイルを追加後、unboundを再起動。
これで名前解決にDNS over TLSを利用できる状態になりました。
ただWifi接続のみのため、DHCPで付与されたルーターのDNSがおそらくそのまま使われます。
そこでwifi接続の設定でDNSにローカルアドレスを追加します。

Mintのメニューだと
[コントロールセンター]
[インターネットとネットワーク]
[高度なネットワーク設定]
から設定できます。

ipv4設定、ipv6設定の「追加のDNS」にローカルリンクアドレスを追加します。

ipv4 ipv6
127.0.0.1 ::1

これでwifi接続のみのlaptopから、IIJさんへDNS over TLSで名前解決リクエストを送って、tls handshakeを経て、名前解決がされている、と思います。
syslogにはtls handshakeのエラーもなく、無効なドメインの場合には、NXDOMAINが通知されています。

もし、おかしな点、間違っているところなどありましたら、ご指摘いただけると助かります。

参考サイト。
https://www.ctrl.blog/entry/unbound-tls-forwarding.html
https://nlnetlabs.nl/documentation/unbound/unbound.conf/

その2
knot-resolverへ移行しました。
パッケージは公式サイトのものを使いました。
公式サイトの最新ドキュメントと参考サイトの情報を合わせて、必要な機能だけをオンにしました。
今の所、問題なく動作してくれています。

https://www.ctrl.blog/entry/knot-dns-resolver-tutorial.html

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linux, Mac (BSD系), Macにcoreutilsを入れた場合に対応するlsの色付け設定

やりたいこと

LinuxでもMac(coreutils有り無し)でも同じ.zshrcを使ってlsの色付け設定をする.

LS_COLORS

  • LinuxのGNU版lsコマンドの色設定は環境変数LS_COLORSで指定.
  • MacのBSD版lsコマンドの色設定は環境変数LSCOLORSで指定できるが,設定方法が特殊で扱いづらい.
  • LinuxとMacで同じ色設定にするにはcoreutilsをインストールしてGNU版lsコマンドを使えるようにするのが楽.

Linuxではdircolorsというコマンドを実行すればいい感じにLS_COLORSを設定できる.Macでcoreutilsを使う場合はgdircolorsというコマンド.

場合分けして.zshrcを書く.

.zshrc
# ---------- ファイル,ディレクトリの色設定
if type dircolors > /dev/null 2>&1; then
    eval "$(dircolors)"
elif type gdircolors > /dev/null 2>&1; then
    eval "$(gdircolors)"
fi

lsのエイリアス

  • LinuxのGNU版lsで色をつけるオプションはls --color=auto
  • MacのBSD版lsで色をつけるオプションはls -G
  • BSD版lsを使う場合はデフォルトの色設定をとりあえず使う.
  • coreutilsを入れた場合はglsを使う.

.zshrcに場合分けして記述.darwin*はMacOS.

.zshrc
case ${OSTYPE} in
  darwin*)
    alias ls='ls -G'
    ;;
  linux*)
    alias ls='ls --color=auto'
    ;;
esac
# ------ if coreutils
if type gls > /dev/null 2>&1; then
    alias ls='gls --color=auto'
fi

参考

Yonchu @yuyuchu3333: LS_COLORSを設定しよう

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Linux Gnome]ubuntu でキーボードの設定がもどってキーッってなっているあなたへ?

はじめに

Advent Calendar 12/8の記事になります

私はハンズラボ株式会社にて、トータルオプティマイゼーショングループのマネジャーをやっております。
普段はあまり開発をやっていませんが、プログラミング大好きです!

寒い季節になりましたね〜。 サンタさんは今年は何をプレゼントしてくれるのでしょう?
最近最愛の娘がサンタの正体を気づいており、時の早さを痛感しております。

自称PC好きで2台の自作PC(Windows10,Ubuntu)を持ち、2台のノートPC(Windows10,MacbookPro(会社支給))と
iPad, ラズパイ(3B)を保有しています。(何台もってるんや・・・)

本題です

リモートワークが進み、会社PCではMac Book Pro 、個人PCではubuntu(20.04)を使用していますが

どちらも同じキーボード使いたいし(私はメカニカルキーボードを利用)、webカメラ、マイクとかを使うPCのたびに
切り替えるのってすごくめんどくさいですよね!!!!

ちなみにHTML端子も交換器を使っています

USBの切替時にキーボード(Mozc)の設定もどりませんか?

私はusb切替機をつかっているんですが、
USBの端子を指すたびに、ubuntu側のMozcのキーボード設定が戻るんです。

通常の設定(Macに合わせてCAPS LOCKを左Controlに変えているひとは多いのでは?)

スクリーンショット 2020-11-24 09-16-09.png

USBを差し替えると、tmuxのkeyバインドとかでctrlをつかうので
CapsLockが初期設定に戻るのが超絶に不便なのです!

スクリーンショット 2020-11-24 09-17-08.png

打開策 厳選3種

いろいろ調べた結果、いろいろの打開策を考えました。

1.ログアウト

ぐぐるとまず出てくるのがこれ、はじめはこれでやっていましたが切り替えるたびにログアウトは正直めんどくさい。
ブラウザとかアプリが一度落ちてしまうし。。。

2.alt + F2 → r

gnome shellをリスタートさせる方法。
これで解決しますが、2アクションは嫌だ。(いや、我慢できる人はこれでOK)
あと、alt + F2 って忘れる。。。
これをコマンドにしたのが下になります!

3.カスタムファンクションを作る

そこで考えついたのは案3!現在はこれ一択です。

ubuntu → システム設定 → キーボード
でショートカット(自分の場合はF11)に下の実行権限のついたshellをフルパスで記載します。

スクリーンショット 2020-11-24 09-28-39.png

$ cat gnome_refresh.sh
#!/bin/bash

killall -3 gnome-shell & > /dev/null 2>&1

exit 0
$

key設定がおかしくなぁ、、、と思ったら、F11で終わり、解決!!!
わすれないし、ブラウザとかも落ちずに戻ります。
困ったら真似してみてください。
(ちなみにF12はとかはよく使うので、あまりつかわないF11にしています。)

それでは良いLinuxライフを!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

daemontoolsの設定を自動で設定するシェルスクリプト(備忘録)

前提条件

  • daemontoolsが使えるようになっていること

以上(笑)

シェルスクリプト作成

以下のシェルスクリプトをPATHが通っているところに置いて、実行のパーミッションを付けます。
この記事では「daemonctl」という名前で作成したとして説明します。

daemonctl
#!/bin/sh

# Current working directory
CWD=`pwd -P`

SERVICE=`pwd | awk -F"/" '{print $NF}'`

# Options
OPT=$1
SCRIPT=$2

# Display help
if [ -z $OPT ]; then
  echo "Usage: "`echo $0 | awk -F"/" '{print $NF}'`" [option]"
  echo "  start: start service."
  echo "   stop: stop service."
  echo "restart: restart service."
  exit
fi

# When in stop mode, if there was no service directory.
if [ "$OPT" != "stop" ]; then
  if [ ! -f "$SCRIPT" ]; then
    START="$CWD/start.sh"
  else
    START=$SCRIPT
  fi

  if [ ! -f "$START" ]; then
    echo "require start.sh script."
    exit
  fi
fi

if [ ! -d "$CWD/service/$SERVICE" ]; then
  mkdir -p $CWD/service/$SERVICE
  cat << EOF > $CWD/service/$SERVICE/run
#!/bin/sh

PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"

cd $CWD
exec $START
EOF
  chmod 755 $CWD/service/$SERVICE/run
fi

#=============================================================================
# Start daemon
#=============================================================================
if [ "${OPT}" = "start" ]; then
  if [ ! -L /etc/service/$SERVICE ]; then
    ln -s $CWD/service/$SERVICE /etc/service/
  fi
        svc -u /etc/service/$SERVICE > /dev/null 2>&1
  echo "Start daemon service [$SERVICE]."

#=============================================================================
# Stop daemon
#=============================================================================
elif [ "${OPT}" = "stop" ] && [ -L /etc/service/$SERVICE ]; then
  svc -d /etc/service/$SERVICE > /dev/null 2>&1
  rm -rf /etc/service/$SERVICE
  PID=`ps ax | grep "supervise $SERVICE" | grep -v 'grep' | awk '{print$1}'`
        kill -9 $PID
  echo "Stop daemon service [$SERVICE]."

#=============================================================================
# Restart daemon
#=============================================================================
elif [ "${OPT}" = "restart" ]; then
  svc -d /etc/service/$SERVICE > /dev/null 2>&1 && svc -u /etc/service/$SERVICE > /dev/null 2>&1
  echo "Restart daemon service [$SERVICE]."
fi

パーミッションは、

$ chmod 755 daemonctl

みたいな感じで付けてください。

スクリプト解説

とりあえずはdaemontoolsで監視したいツールのディレクトリに入ります。
ディレクトリが無い場合は、適当な場所にディレクトリを作って入ります。
そこに「start.sh」という名前で、ツールの起動スクリプトを書きます。
exec」で起動するようにしないと上手くdaemontoolsで監視してくれないっぽい。

起動スクリプトが作成出来たら、以下のような感じで実行します。

$ daemonctl start

すると、カレントディレクトリにある「start.sh」を起動スクリプトとしてdaemontoolsがツールを起動し、プロセス監視を開始します。
実行すると「[カレントディレクトリ]/service/[カレントディレクトリ名]」というディレクトリが作成されているはず。
例)
カレントディレクトリが「minecraft」だった場合、「./service/minecraft」というディレクトリが作成されているはず。
これが、daemontoolsが監視するために使用するディレクトリ。
通常はエディタなどで中にある「run」というファイルを記述して「/etc/service」配下にシンボリックリンクを貼ったりしないといけなかったが、それをシェルスクリプトで実行するようにしてあります。
実行してエラーなどが出なかった場合に、

$ ps ax | grep minecraft

などとプロセスを確認してみると、superviseと、起動されたツールの2つが出てくると思います。
ここで、

$ daemonctl stop

と実行すると、ツールが停止し、daemontoolsの監視が止まります。
プロセスで確認すると、先程の2つのプロセスがなくなっているのが確認出来るはず。

$ daemonctl start [起動スクリプトのPATH]

とやると、「start.sh」以外の起動スクリプトを指定することも出来ます。

daemontoolsってなに?

という人はググってください。
Windows用のツールで同名の、光学メディアマウントツールがありますので、上手くググってください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ランレベルのことを今更調べてみた

勉強前イメージ

シングルユーザモードでの起動とか、GUIの起動とか表すやつ
よく見るけど、正直あんま理解してない

調査

ランレベルとは?

linuxの動作モードのこと。
0から6までモードがあって、ランレベル毎にどのサービスが起動する・しないを決定しています
/etc/rc.d/rc*.d にあるファイルによって、各ランレベルで起動するプログラムを指定しています。

  • Redhat,CentOS等

systemd target に記載した内容が結構わかりやすいのではないかなと思います。

ランレベル systemd target 内容
0 runlevel0.target, poweroff.target 停止
1 runlevel1.target, rescue.target シングルユーザーモード、ネットワーク無し。rootでのログインが出来ないときに使用します
2 runlevel2.target, multi-user.target マルチユーザーモード(NFSマウントなし)
3 runlevel3.target, multi-user.target マルチユーザーモード(コンソール)、ネットワーク有り。通常の操作で使用されます。
4 runlevel4.target, multi-user.target 未使用
5 runlevel5.target, graphical.target マルチユーザーモード(X Windows)、ネットワーク有り。GUIでのログインの際に使用されます。
6 runlevel6.target, reboot.target システム再起動

実際にランレベルを見てみよう

  • runlevelコマンド

現在のランレベルがわかります。
1つ前のランレベル 現在のランレベル という順で表示されます。
1つ前のランレベルが N : システム起動後に一度も変更されてないときに使われる
現在のランレベルが 3 : 上記の表でいうと、ネットワークが接続されておりコンソールでのログインの際に表示されるランレベル ということがわかります。

[root@localhost ~]# runlevel
N 3
  • systemctlコマンド

こちらでも、同じように現在のランレベルが見れます。
multi-user.target なので、ランレベル3で確認出来ました

[root@localhost ~]# systemctl get-default
multi-user.target
  • chkconfigコマンド

httpdとか起動してるのに見えないな...
実はsystemdの配下にしたみたいです。

[root@localhost ~]# chkconfig --list

注記: この出力に含まれるのは SysV サービスのみです。ネイティブな 
      systemd サービスは含まれません。SysV の設定データはネイティブな
        systemd 設定で上書きされる場合があります。
      systemd サービスを一覧表示する場合は 'systemctl list-unit-files' を使用します。
      特定のターゲットで有効になっているサービスを確認する場合は
      'systemctl list-dependencies [target]'を使用します。

netconsole      0:off   1:off   2:off   3:off   4:off   5:off   6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
  • systemctl list-unit-files コマンド

ここには httpd とか含まれてた。
めっちゃ出てくる

[root@localhost ~]# systemctl list-unit-files
UNIT FILE                                     STATE   
proc-sys-fs-binfmt_misc.automount             static  
dev-hugepages.mount                           static  
dev-mqueue.mount                              static  
proc-sys-fs-binfmt_misc.mount                 static  
sys-fs-fuse-connections.mount                 stati
....

[root@localhost ~]# systemctl list-unit-files | grep httpd
httpd.service                                 disabled

勉強後イメージ

実際にちゃんと気にしたことはなかったかも。。。
シングルユーザーモードで入ったりはしたことあったけど。。
3と5ってコマンドかGUIって感じだけど、2と3って難しいよね。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

shellの引数で処理を分ける方法

業務で覚えた知識を備忘録として記載していきます。

対象者

  • shellに興味のある人
  • 実行時の引数で処理を分けたい場合

先日業務でshellを書くことがあったのですが、調べてみると中々自分がやりたい内容が見つからなかったので、そんな人の一助になればと思ったのと単純に覚えた内容を忘れないために記事にしたいと思いました。

やりたいこと

  • shell実行時の引数で処理を分ける
  • 外部ファイルを読み込み情報を取得する
  • 取得した情報を変数として持ち活用する

使用コマンド if / while read LINE / AWK

if [ 条件 ] then [ 実行処理 ] fi
while read LINE (変数名)
do
  実行されるコマンド
done < [ ファイル名 ]
awk [ オプション ]  [ コマンド ]

環境

Linux

ディレクトリ構成

シンプルに実行するshellと読み取るファイルが同じ階層のケース。
shellを実行するとlist.csvを読み取り、引数に対応した値を取得する。
階層が複雑な場合はフルパス指定したり、プロパティファイルを作ったり変数にしたりして可読性とメンテナンス性を上げる。
下記はサンプルなので.confファイルも中身2行で用意。

home/
  ├ country.sh
  └ list.conf

ファイルの中身

list.conf
JPN,日本,東京,3
USA,アメリカ合衆国,ワシントンDC,1
CHN,中華人民共和国,北京,2
DEU,ドイツ連邦共和国,ベルリン,4
IND,インド,ニューデリー,5
・・・

shellの中身

country.sh
#!/bin/bush
#シェル名:country.sh
#処理概要:引数に与えた国の和名と首都、GDP何位かを表示します。
#引数:$1 国コード(アルファベット3桁)

#設定ファイル
CONF_FILE="/home/list.conf"

#1.開始メッセージ
echo "処理を開始します。"

#2.パラメータチェック
if [ $# -ne 1 ]
then
 #パラメータ数不正
 $echo "引数の国コードは1つ(3文字)にしてください。"
exit
fi
PARAM_IF_ID=$1

#3.定義ファイル取得
while read LINE
do
TOP_STR=`echo ${LINE:0:1}`
if [ ${TOP_STR} == "#" ]
  then
  # コメント行
  countinue
fi

#引数取得
IF_ID=`echo ${LINE} | awk -F, '{print $1}'`
  #引数判定
  if [ "${IF_ID}" = "${PARAM_IF_ID}" ]
    then
    #国名(和名)
    NAME=`echo ${LINE} | awk -F, '{print $2}'`
    #首都
    CAP=`echo ${LINE} | awk -F, '{print $3}'`
    #国内総生産ランキング
    GDP=`echo ${LINE} | awk -F, '{print $4}'`
    break
fi
done < ${CONF_FILE}

echo "選択した"${NAME}"の首都は"${CAP}"です。近年のGDPは世界"${GDP}"位でした。"
exit

shell実行引数をキーにlist.confファイルから情報を抽出する。
処理を実行するとメッセージが表示され、引数が1つ以外の場合はエラーを発して終了します。
決められた引数を受け取ると、list.confの2カラム目、3カラム目の値を$2/$3...に受け取っていく。
あとは内部の処理で受け取った引数を使うだけ。

引数が"JPN"の実行結果

$ bash country.sh JPN
処理を開始します
選択した日本の首都は東京です近年のGDPは世界3位でした

引数が"USA"の実行結果

$ bash country.sh USA
処理を開始します
選択したアメリカの首都はワシントンDCです近年のGDPは世界1位でした

引数なしの場合

$ bash country.sh
処理を開始します
引数の国コードは1つ(3文字)にしてください

解説という名の復習

引数をキーに.confファイルの中身を抽出する方法でした。
ポイントはwhile read LINEと awk を|を使って繋げた所です。
.confファイルの中身を一行ずつ取り出して変数に格納していて,(カンマ)区切りで記入されたファイルの中身を読み取っています。
この処理があるので.confファイル内に複数のパターンの定義が存在していても、引数をキーに使い分けることが出来ます。
今はA/Bパターンだけでも、今後C/D/E...と増えた際に.confファイルのみメンテすればshellの処理を変えずに対応が可能となりメンテナンス性が向上します。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む