- 投稿日:2021-03-14T23:23:41+09:00
Linux で AirPods (その他 Bluetooth ヘッドセット) の音量を調節する
Linux で AirPods を使うと音量を最大にしても音が小さすぎます。
これは本来 AirPods などの Bluetooth ヘッドセットの音量は AVRCP という仕組みを使って調節しなければならないのが、Linux 側のサウンドサーバーがそれに対応していないことによるものです。コマンドラインから AirPods の音量を調節するスクリプト
Python で AVRCP を使って AirPods の音量を調節する簡単なスクリプトを作りました。
AirPods 以外の Bluetooth ヘッドセットでも使用できます。vol.py#!/usr/bin/env python3 import dbus import sys DBUS_OM_IFACE = 'org.freedesktop.DBus.ObjectManager' DBUS_PROP_IFACE = 'org.freedesktop.DBus.Properties' BLUEZ_SERVICE_NAME = 'org.bluez' BLUEZ_MT_IFACE = 'org.bluez.MediaTransport1' VOL_STEP = 5 def usage(): print("""Usage: {0} Show volume {0} <value> Set volume to <value> (0-127) {0} inc Increase volume {0} dec Decrease volume""".format(sys.argv[0]), file=sys.stderr) sys.exit(1) def main(): if len(sys.argv) > 2: usage() bus = dbus.SystemBus() om = dbus.Interface(bus.get_object(BLUEZ_SERVICE_NAME, '/'), DBUS_OM_IFACE) objects = om.GetManagedObjects() path = None for obj, props in objects.items(): if BLUEZ_MT_IFACE in props.keys(): path = obj break if path is None: print('No device exists', file=sys.stderr) sys.exit(1) vol_now = props[BLUEZ_MT_IFACE]['Volume'] if len(sys.argv) == 2: if sys.argv[1] == 'inc': vol = vol_now + VOL_STEP elif sys.argv[1] == 'dec': vol = vol_now - VOL_STEP elif sys.argv[1].isdecimal(): vol = sys.argv[1] else: usage() print('{} -> {}'.format(vol_now, vol)) obj = bus.get_object(BLUEZ_SERVICE_NAME, path) props = dbus.Interface(obj, DBUS_PROP_IFACE) props.Set(BLUEZ_MT_IFACE, 'Volume', dbus.types.UInt16(vol)) else: print(vol_now) if __name__ == '__main__': main()使い方
現在の音量を表示する
$ ./vol.py 20音量を設定する
0 から 127 までの値を指定できます。
$ ./vol.py 30 20 -> 30音量を上げる
$ ./vol.py inc 30 -> 35音量を下げる
$ ./vol.py dec 35 -> 30
- 投稿日:2021-03-14T23:23:41+09:00
Linux で AirPods などの Bluetooth ヘッドセットの音量を調節する
Linux で AirPods を使うと音量を最大にしても音が小さすぎます。
これは AirPods などの比較的新しい Bluetooth ヘッドセットの音量は AVRCP のAbsolute Volume
という仕組みを使って調節しなければならないのが、Linux 側のサウンドサーバーがそれに対応していないことによるものです。コマンドラインから AVRCP で音量を調節するスクリプト
bluetoothd
のオプションに--noplugin=avrcp
を指定して AVRCP を無効にしてしまうという手 (bluetooth - Extremely low volume with AirPods (Ubuntu 19.10) - Ask Ubuntu) もありますが、 AirPods の場合バッテリーが減ってきた際の通知音がめちゃくちゃでかい音で鳴ったり、ダブルタップが効かなくなったりして不便です。
そこで AVRCP を使って AirPods の音量を調節する簡単な Python スクリプトを作りました。
AirPods 以外の Bluetooth ヘッドセットでも使用できます。vol.py#!/usr/bin/env python3 import dbus import sys DBUS_OM_IFACE = 'org.freedesktop.DBus.ObjectManager' DBUS_PROP_IFACE = 'org.freedesktop.DBus.Properties' BLUEZ_SERVICE_NAME = 'org.bluez' BLUEZ_MT_IFACE = 'org.bluez.MediaTransport1' VOL_STEP = 5 def usage(): print("""Usage: {0} Show volume {0} <value> Set volume to <value> (0-127) {0} inc Increase volume {0} dec Decrease volume""".format(sys.argv[0]), file=sys.stderr) sys.exit(1) def main(): if len(sys.argv) > 2: usage() bus = dbus.SystemBus() om = dbus.Interface(bus.get_object(BLUEZ_SERVICE_NAME, '/'), DBUS_OM_IFACE) objects = om.GetManagedObjects() path = None for obj, props in objects.items(): if BLUEZ_MT_IFACE in props.keys(): path = obj break if path is None: print('No device exists', file=sys.stderr) sys.exit(1) vol_now = props[BLUEZ_MT_IFACE]['Volume'] if len(sys.argv) == 2: if sys.argv[1] == 'inc': vol = vol_now + VOL_STEP elif sys.argv[1] == 'dec': vol = vol_now - VOL_STEP elif sys.argv[1].isdecimal(): vol = sys.argv[1] else: usage() print('{} -> {}'.format(vol_now, vol)) obj = bus.get_object(BLUEZ_SERVICE_NAME, path) props = dbus.Interface(obj, DBUS_PROP_IFACE) props.Set(BLUEZ_MT_IFACE, 'Volume', dbus.types.UInt16(vol)) else: print(vol_now) if __name__ == '__main__': main()使い方
Bluetooth ヘッドセットを繋いだあと、予めシステムの音量を最大にしておきます。
現在の音量を表示する
$ ./vol.py 20音量を設定する
0 から 127 までの値を指定できます。
$ ./vol.py 30 20 -> 30音量を上げる
$ ./vol.py inc 30 -> 35音量を下げる
$ ./vol.py dec 35 -> 30
- 投稿日:2021-03-14T23:23:41+09:00
Linux で AirPods (その他 Bluetooth イヤホン) の音量を調節する
Linux で AirPods を使うと音量を最大にしても音が小さすぎます。
これは本来 AirPods などのワイヤレスイヤホンの音量は AVRCP という仕組みを使って調節しなければならないのが、Linux 側のサウンドサーバーがそれに対応していないことによるものです。コマンドラインから AirPods の音量を調節するスクリプト
Python で AVRCP を使って AirPods の音量を調節する簡単なスクリプトを作りました。
AirPods 以外の Bluetooth イヤホンでも使用できます。vol.py#!/usr/bin/env python3 import dbus import sys DBUS_OM_IFACE = 'org.freedesktop.DBus.ObjectManager' DBUS_PROP_IFACE = 'org.freedesktop.DBus.Properties' BLUEZ_SERVICE_NAME = 'org.bluez' BLUEZ_MT_IFACE = 'org.bluez.MediaTransport1' VOL_STEP = 5 def usage(): print("""Usage: {0} Show volume {0} <value> Set volume to <value> (0-127) {0} inc Increase volume {0} dec Decrease volume""".format(sys.argv[0]), file=sys.stderr) sys.exit(1) def main(): if len(sys.argv) > 2: usage() bus = dbus.SystemBus() om = dbus.Interface(bus.get_object(BLUEZ_SERVICE_NAME, '/'), DBUS_OM_IFACE) objects = om.GetManagedObjects() path = None for obj, props in objects.items(): if BLUEZ_MT_IFACE in props.keys(): path = obj break if path is None: print('No device exists', file=sys.stderr) sys.exit(1) vol_now = props[BLUEZ_MT_IFACE]['Volume'] if len(sys.argv) == 2: if sys.argv[1] == 'inc': vol = vol_now + VOL_STEP elif sys.argv[1] == 'dec': vol = vol_now - VOL_STEP elif sys.argv[1].isdecimal(): vol = sys.argv[1] else: usage() print('{} -> {}'.format(vol_now, vol)) obj = bus.get_object(BLUEZ_SERVICE_NAME, path) props = dbus.Interface(obj, DBUS_PROP_IFACE) props.Set(BLUEZ_MT_IFACE, 'Volume', dbus.types.UInt16(vol)) elif len(sys.argv) == 1: print(vol_now) if __name__ == '__main__': main()使い方
現在の音量を表示する
$ ./vol.py 20音量を設定する
0 から 127 までの値を指定できます。
$ ./vol.py 30 20 -> 30音量を上げる
$ ./vol.py inc 30 -> 35音量を下げる
$ ./vol.py dec 35 -> 30
- 投稿日:2021-03-14T18:40:45+09:00
AWS 入門者が EC2 で Linux 仮想サーバーを構築してみた
概要
本項では、クラウドコンピューティングサービスである Amazon Web Service (AWS) を用いて Linux 仮想サーバーを構築する手順を紹介する。
環境
- MacBook Air (Retina, 13-inch, 2018)
- macOS Big Sur (Version 11.2.3)
- メモリ 16 GB
AWS とは
- クラウドコンピューティングサービスのひとつである
- 200 以上のサービスがあり、組み合わせによって様々なアプリケーションやインフラを構築できる
- 社内 LAN など、外部のシステムやネットワークと連結することができる
- 料金体系がサービスの使用量に従う
- 学生は AWS Educate でクラウドスキルを無料で学習できる
AWS アカウントの作成
AWS を利用するには AWS アカウントを作成する 必要である。登録時にクレジット/デビットカード番号が求められるが、サポートプランでベーシックプランを選択すれば無料でも使用できる。
AWS をはじめてみよう
AWS は、マネージメントコンソールを用いることで Web ブラウザの GUI で利用・操作することができる。マネージメントコンソールを開くと、利用可能なサービスの一覧を確認できる。
今回は、サーバーに必要なもの(OS やソフトウェアなど)を一式でレンタルすることができる Amazon Elastic Compute Cloud (Amazon EC2) を上記の一覧から選択して、仮想サーバーを構築してみよう。
EC2 を用いた仮想サーバー構築
マネージメントコンソールからEC2 を選択すると、EC2 ダッシュボードが表示される。EC2 では、AWS クラウドに作る仮想サーバーをインスタンスという。インスタンスには「設計図をもとに作成されたもの」という意味があり、EC2 にも仮想サーバーの設計図(仮想イメージ)が用意されている。ここでは仮想イメージからインスタンスを作成する手順を紹介する。
STEP1: Amazon マシンイメージ(AMI)を選択する
EC2 ダッシュボードで「インスタンスを起動」を選択すると、仮想イメージの一覧を確認できる。
EC2 では仮想イメージのことを Amazon マシンイメージ(AMI) という。同じ AMI から作成されたインスタンスは、設定が全て同じの仮想サーバーである。今回は linux 仮想サーバーを構築するために Amazon Linux 2 AMI (HVM), SSD Volume Type を選択してみよう。
STEP2: インスタンスタイプを選択する
次の画面ではインスタンスの性能が一覧で表示される。ここではインスタンスの CPU やメモリなどを選択できる。性能によって料金体系も異なるが、今回は無料で使用できる t2.micro を選択して、「確認と作成」ボタンをクリックしよう。
STEP7: インスタンスタイプを作成する
次の画面で「起動」ボタンを押すとインスタンスが作成される。なお STEP3~STEP6 の各種設定は、インスタンス作成後でも可能である。
キーペアの作成
インスタンス作成時にキーペアに関するポップアップが表示される。キーペアはインスタンス接続時の認証に必要な鍵である。ローカルサーバーからの接続にも必要なため、ここで新しいキーペアを作成してくおくとよい。キーペアに適当な名前をつけてダウンロードしておこう。
キーペアとはログイン認証時の公開鍵と秘密鍵のペアであり、ここでダウンロードされるのは秘密鍵である。RSA によって暗号化されており、拡張子は
pem
である。Demo2021.pem-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAhiJeziiC9SC6TiWQfjOjp6vouPD7QwCdHzOLB/+FMD2/8U52 +F8JDcXHYulMTjyXhADy1WF+TKCgohh07GRPNrGU6LxnWLrTKnLkIPzFV/jnU6k1 GILmXI7yvtfWSC5tA5OUSWNUCeFYq8bh2RXKHVmrJxLYaIO/LoeFUFJou2qOgEA6 (中略) Y+I9qQKBgBUsxReCPgvdRJ2Ba88muNgxWZnr437m9nESo0MMlDH6lNtd5UVOsNbJ VDqg55p0Gy3Jepk8XZbpAybLmglyJY0cYU1GaCFQdw/NFtCnX8e7oYUGB20uMe40 Muyp+udJCx0MHP+y5hm80FabKziYF/5dQl2LMSZLgGMLO1gt/1YE -----END RSA PRIVATE KEY-----インスタンス作成中
インスタンス作成中は次の画面が表示される。右下の「インスタンスの表示」ボタンを押すとインスタンスの状態を確認できる。
次の画面で、ステータスチェックが「初期化しています」から「2/2 のチェックに合格しました」に変わるとインスタンスが作成される。
SSH 接続
SSH(Secure Shell) とは、ネットワークに接続された機器(今回はインスタンス)を遠隔操作し、管理するための手段をさす。ここでは MacBook から Amazon EC2 に SSH 接続する方法を紹介する。
まずは、接続先の EC2 インスタンスにチェックを入れて接続ボタンを押してみよう。
次の画面で「SSH クライアント」タブを開くと、SSH 接続手順が説明されている。
STEP1: SSH クライアントを開く
Mac に標準搭載されているターミナルを SSH クライアントソフトとして使用する。Windows の場合はこちらの動画で詳しく解説されている。
STEP2: プライベートキーファイルを見つける
プライベートキーファイルとはキーペアのうちの秘密鍵をさす。今回は先ほどダウンロードした
Demo2021.pem
を使用する。ユーザーのホームディレクトリに.ssh
フォルダを作成し、新規フォルダにpem
ファイルを移動してもよい。ターミナルmkdir ~/.ssh mv Demo2021.pem ~/.ssh cd ~/.sshSTEP3: 必要に応じてキーが公開されていないことを確認する
chmod コマンドでキーファイルの権限を設定する。
ターミナルchmod 400 Demo2021.pemSTEP4: プライベートキーファイルを見つける
次のコマンドを実行すると SSH 接続が完了する。
ターミナルssh -i "Demo2021.pem" ec2-user@ec2-18-183-11-87.ap-northeast-1.compute.amazonaws.com次のように表示されれば SSH 接続は成功している。
ターミナルThe authenticity of host 'ec2-18-183-11-87.ap-northeast-1.compute.amazonaws.com (18.183.11.87)' can't be established. ECDSA key fingerprint is SHA256:gyQ0V6rZ8KDgET/yROzqJvUy59Elo9wvkuWoNcqniWI. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'ec2-18-183-11-87.ap-northeast-1.compute.amazonaws.com,18.183.11.87' (ECDSA) to the list of known hosts. __| __|_ ) _| ( / Amazon Linux 2 AMI ___|\___|___| https://aws.amazon.com/amazon-linux-2/ [ec2-user@ip-172-31-0-200 ~]$パッケージのアップデート
デフォルトでインストールされているパッケージが最新でない場合があるため、次のコマンドでアップデートしておくとよい。(すべて最新版の場合は
No packages marked for update
と表示される。)
AWS 利用者は一般ユーザーであるためyum
を実行できないが、sudo
コマンドによってルートユーザーの権限をもつことで実行できる。
yum
は Red Hat 系の Linux ディストリビューションで使われているパッケージ管理ソフトである。ターミナル[ec2-user@ip-172-31-0-200 ~]$ sudo yum updatePython 3 のダウンロード
次のコマンドで Python3 をダウンロードする。(参考)
ターミナル[ec2-user@ip-172-31-0-200 ~]$ sudo yum install python3 -yDocker のダウンロード
次のコマンドで Docker をダウンロードする。(参考)
ターミナル[ec2-user@ip-172-31-0-200 ~]$ sudo amazon-linux-extras install dockerSSH 接続の終了
ターミナルで
logout
と実行する。参考図書
- 投稿日:2021-03-14T18:40:45+09:00
【AWS】EC2 による Linux 仮想サーバーの構築
概要
本項では、クラウドコンピューティングサービスである Amazon Web Service (AWS) を用いて Linux 仮想サーバーを構築する手順を紹介する。
環境
- MacBook Air (Retina, 13-inch, 2018)
- macOS Big Sur (Version 11.2.3)
- メモリ 16 GB
AWS とは
- クラウドコンピューティングサービスのひとつである
- 200 以上のサービスがあり、組み合わせによって様々なアプリケーションやインフラを構築できる
- 社内 LAN など、外部のシステムやネットワークと連結することができる
- 料金体系がサービスの使用量に従う
- 学生は AWS Educate でクラウドスキルを無料で学習できる
AWS アカウントの作成
AWS を利用するには AWS アカウントを作成する 必要である。登録時にクレジット/デビットカード番号が求められるが、サポートプランでベーシックプランを選択すれば無料でも使用できる。
AWS をはじめてみよう
AWS は、マネージメントコンソールを用いることで Web ブラウザの GUI で利用・操作することができる。マネージメントコンソールを開くと、利用可能なサービスの一覧を確認できる。
今回は、サーバーに必要なもの(OS やソフトウェアなど)を一式でレンタルすることができる Amazon Elastic Compute Cloud (Amazon EC2) を上記の一覧から選択して、仮想サーバーを構築してみよう。
EC2 を用いた仮想サーバー構築
マネージメントコンソールからEC2 を選択すると、EC2 ダッシュボードが表示される。EC2 では、AWS クラウドに作る仮想サーバーをインスタンスという。インスタンスには「設計図をもとに作成されたもの」という意味があり、EC2 にも仮想サーバーの設計図(仮想イメージ)が用意されている。ここでは仮想イメージからインスタンスを作成する手順を紹介する。
STEP1: Amazon マシンイメージ(AMI)を選択する
EC2 ダッシュボードで「インスタンスを起動」を選択すると、仮想イメージの一覧を確認できる。
EC2 では仮想イメージのことを Amazon マシンイメージ(AMI) という。同じ AMI から作成されたインスタンスは、設定が全て同じの仮想サーバーである。今回は linux 仮想サーバーを構築するために Amazon Linux 2 AMI (HVM), SSD Volume Type を選択してみよう。
STEP2: インスタンスタイプを選択する
次の画面ではインスタンスの性能が一覧で表示される。ここではインスタンスの CPU やメモリなどを選択できる。性能によって料金体系も異なるが、今回は無料で使用できる t2.micro を選択して、「確認と作成」ボタンをクリックしよう。
STEP7: インスタンスタイプを作成する
次の画面で「起動」ボタンを押すとインスタンスが作成される。なお STEP3~STEP6 の各種設定は、インスタンス作成後でも可能である。
キーペアの作成
インスタンス作成時にキーペアに関するポップアップが表示される。キーペアはインスタンス接続時の認証に必要な鍵である。ローカルサーバーからの接続にも必要なため、ここで新しいキーペアを作成してくおくとよい。キーペアに適当な名前をつけてダウンロードしておこう。
キーペアとはログイン認証時の公開鍵と秘密鍵のペアであり、ここでダウンロードされるのは秘密鍵である。RSA によって暗号化されており、拡張子は
pem
である。Demo2021.pem-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAhiJeziiC9SC6TiWQfjOjp6vouPD7QwCdHzOLB/+FMD2/8U52 +F8JDcXHYulMTjyXhADy1WF+TKCgohh07GRPNrGU6LxnWLrTKnLkIPzFV/jnU6k1 GILmXI7yvtfWSC5tA5OUSWNUCeFYq8bh2RXKHVmrJxLYaIO/LoeFUFJou2qOgEA6 (中略) Y+I9qQKBgBUsxReCPgvdRJ2Ba88muNgxWZnr437m9nESo0MMlDH6lNtd5UVOsNbJ VDqg55p0Gy3Jepk8XZbpAybLmglyJY0cYU1GaCFQdw/NFtCnX8e7oYUGB20uMe40 Muyp+udJCx0MHP+y5hm80FabKziYF/5dQl2LMSZLgGMLO1gt/1YE -----END RSA PRIVATE KEY-----インスタンス作成中
インスタンス作成中は次の画面が表示される。右下の「インスタンスの表示」ボタンを押すとインスタンスの状態を確認できる。
次の画面で、ステータスチェックが「初期化しています」から「2/2 のチェックに合格しました」に変わるとインスタンスが作成される。
SSH 接続
SSH(Secure Shell) とは、ネットワークに接続された機器(今回はインスタンス)を遠隔操作し、管理するための手段をさす。ここでは MacBook から Amazon EC2 に SSH 接続する方法を紹介する。
まずは、接続先の EC2 インスタンスにチェックを入れて接続ボタンを押してみよう。
次の画面で「SSH クライアント」タブを開くと、SSH 接続手順が説明されている。
STEP1: SSH クライアントを開く
Mac に標準搭載されているターミナルを SSH クライアントソフトとして使用する。Windows の場合はこちらの動画で詳しく解説されている。
STEP2: プライベートキーファイルを見つける
プライベートキーファイルとはキーペアのうちの秘密鍵をさす。今回は先ほどダウンロードした
Demo2021.pem
を使用する。ユーザーのホームディレクトリに.ssh
フォルダを作成し、新規フォルダにpem
ファイルを移動してもよい。ターミナルmkdir ~/.ssh mv Demo2021.pem ~/.ssh cd ~/.sshSTEP3: 必要に応じてキーが公開されていないことを確認する
chmod コマンドでキーファイルの権限を設定する。
ターミナルchmod 400 Demo2021.pemSTEP4: プライベートキーファイルを見つける
次のコマンドを実行すると SSH 接続が完了する。
ターミナルssh -i "Demo2021.pem" ec2-user@ec2-18-183-11-87.ap-northeast-1.compute.amazonaws.com次のように表示されれば SSH 接続は成功している。
ターミナルThe authenticity of host 'ec2-18-183-11-87.ap-northeast-1.compute.amazonaws.com (18.183.11.87)' can't be established. ECDSA key fingerprint is SHA256:gyQ0V6rZ8KDgET/yROzqJvUy59Elo9wvkuWoNcqniWI. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'ec2-18-183-11-87.ap-northeast-1.compute.amazonaws.com,18.183.11.87' (ECDSA) to the list of known hosts. __| __|_ ) _| ( / Amazon Linux 2 AMI ___|\___|___| https://aws.amazon.com/amazon-linux-2/ [ec2-user@ip-172-31-0-200 ~]$パッケージのアップデート
デフォルトでインストールされているパッケージが最新でない場合があるため、次のコマンドでアップデートしておくとよい。(すべて最新版の場合は
No packages marked for update
と表示される。)
AWS 利用者は一般ユーザーであるためyum
を実行できないが、sudo
コマンドによってルートユーザーの権限をもつことで実行できる。
yum
は Red Hat 系の Linux ディストリビューションで使われているパッケージ管理ソフトである。ターミナル[ec2-user@ip-172-31-0-200 ~]$ sudo yum updatePython 3 のダウンロード
次のコマンドで Python3 をダウンロードする。(参考)
ターミナル[ec2-user@ip-172-31-0-200 ~]$ sudo yum install python3 -yDocker のダウンロード
次のコマンドで Docker をダウンロードする。(参考)
ターミナル[ec2-user@ip-172-31-0-200 ~]$ sudo amazon-linux-extras install dockerSSH 接続の終了
ターミナルで
logout
と実行する。参考図書
- 投稿日:2021-03-14T16:30:42+09:00
hostname 変更あれこれ
はじめに
変更方法はいろいろあるみたい
/etc/hostnameによる変更
$ hostname ubuntu20 $ vim hostname - ubuntu20 + linux $ sudo systemctl restart systemd-hostnamed $ hostname linux $ sudo shutdown -r now . . . $ hostname linuxhostnameコマンドによる変更(再起動でもとに戻る)
$ hostname ubuntu20 $ sudo hostname linux $ hostname linux $ cat /etc/hostname ubuntu20 $ sudo shutdown -r now . . . $ hostname ubuntu20hostnamectlによる変更
$ hostname ubuntu20 $ sudo hostnamectl set-hostname linux $ hostname linux $ cat /etc/hostname linux $ sudo shutdown -r now . . . $ hostname linuxnmcliによる変更
$ hostname ubuntu20 $ sudo nmcli gen hostname linux $ hostname linux $ cat /etc/hostname linux $ sudo shutdown -r now . . . $ hostname linuxnmtuiによる設定
$ hostname ubuntu20 $ sudo nmtui"Set system hostname" を選択
host名を入力
OK
$ hostname linux $ cat /etc/hostname linux $ sudo shutdown -r now . . . $ hostname linux
- 投稿日:2021-03-14T15:39:02+09:00
【シェルスクリプト】ファイルを1行ずつ読み込んで処理する方法
while read文を使って次のようにするとテキストファイルを1行ずつ読み込んでなんやかんやすることができます。(Solarisではこの書き方はできないようですが、あまり使われていないOSですので考慮しなくても良いと思います。)
#!/bin/bash FILE_NAME=/fuga/hoge/fizz.txt while read LINE do # コマンド done < ${FILE_NAME}while文に\${FILE_NAME}をリダイレクトするとreadコマンドで\${FILE_NAME}の中身を1行ずつ読み込んでLINEという変数に格納します。(変数名はLINEでなくても問題ありません。)
このようなコードを使うと「3カラム目の値がfizzである行を判別してうんたらかんたらする」みたいなことができます。
注意点と回避策
while文の末尾でリダイレクトする都合上「どのファイルを読み込んでいるのか」ということが上からシェルスクリプトを読んでいくと分かりづらいので、while文の上にコメントで「このファイルを読み込みます」ということを書き添えておくと良いと思います。
FILE=/hoge/fuga.txt # FILEを読み込んで処理 while read LINE # コマンド done < "${FILE}"for文ではファイルを1行ずつ読み込めない
私は当初for文で上記の処理を実現しようとして次のようなコードを書いていました。
FILE=/hoge/fuga.txt # これは動かない for LINE in "${FILE}" do # コマンド done結果から言うとこのコードは動きませんでした。
ディレクトリを読み込んでファイルを1つずつ処理することができたので、その延長線上で考えてファイルを1行ずつ処理することもできるやろ、程度に考えてしまいました。# ディレクトリ内にあるファイルを1つずつ読み込む # これは動く for FILE in /usr/local/hoge/* do echo $FILE doneファイルを1行ずつ読み込む場合は 「while read line」と覚えると良いでしょう。
- 投稿日:2021-03-14T14:42:10+09:00
Linux覚え書きユーザ管理
概要
Linux学習で覚えたコマンドや知識をメモする記事です。
コマンドはLinux覚え書きコマンド集にまとめていますユーザ管理
グループとユーザを適切に管理することで、ファイルやプログラムなどを必要なユーザのみ参照・編集する権限を与えることが出来ます。
グループやユーザの編集を行う場合は、管理者であるrootユーザで実行する必要があります。# で始まる場合はroot権限 $ で始まる場合は一般ユーザユーザ
ユーザは/etc/passwdに定義されている。基本はコマンドで編集する。
パスワードファイルの内容
/etc/passwdaccount:password:UID:GID:GECOS:directory:shell
項目 内容 account ユーザ名(大文字は含めない) password パスワード('x'で表示される) UID ユーザID番号 GID プライマリグループID GECOS ユーザ名またはコメント directory ホームディレクトリ shell ログイン時に起動されるコマンドインタプリタ ユーザを追加
useradd ユーザ名<オプション>
オプション 説明 -c [コメント] コメント追加 -g [グループ名] プライマリグループを指定 -G [グループ名] 補助グループを指定 -d ホームディレクトリを指定 -s シェルを指定(デフォルト /bin/bash) -u ユーザID ユーザの変更
usermod ユーザ名<オプション>
オプション 説明 -c [コメント] コメント追加 -g [グループ名] プライマリグループを指定 -G [グループ名] 補助グループを指定 -l [ユーザ名] ユーザ名を変更する -u [ユーザID] ユーザIDを変更 ユーザの削除
userdel ユーザ名<オプション>
| オプション | 説明 |
| -r | ホームディレクトリを削除グループ
グループファイルの内容
/etc/groupgroup_name:password:GID:user_list
項目 内容 group_name グループの名前 password パスワードが不要なら空欄 GID グループID GECOS ユーザ名またはコメント user_list グループに所属するユーザ ユーザは/etc/groupに定義されている。基本はコマンドで編集する。
グループの作成
groupadd グループ名<オプション>
オプション 説明 -g [グループID] グループIDを指定 グループ情報の変更
groupmod [-g gid] [-n new-group-name] 変更対象のグループ<オプション>
オプション 説明 -n 既存グループ名の変更をする場合に指定 -g 既存グループIDを変更 グループ情報の削除
groupdel グループ名パスワード
ユーザを利用するにはパスワードが必要。パスワードは/etc/shadowに暗号化されて記録される。
passwd [ユーザ名]シャドウファイル
account:password:last_changed:may_be_changed:must_be_changed:warned:expires:disabled:reserved
項目 内容 account ユーザ名 password 暗号化されたパスワード last_changed 1970/1/1から最後にパスワードが変更された日までの日数 may_be_changed パスワードが変更可能になる日数 must_be_changed パスワードの変更しなくてはいけない日までの日数 warned 警告を受ける日数 expires パスワード有効期限が過ぎ、使用不能になるまでの日数 disabled 1970/1/1からアカウントが使用不能になる日までの日数 reserved 予約フィールド 特殊なユーザ
一般ユーザ
アカウントを作成すると、ユーザ名と同じのグループが作られ、ユーザはそのユーザグループに所属します。
グループを利用することで以下のようなことが行えます。
+ ある特定のディレクトリにアクセスできるグループの作成
+ 特定グループに所属しているユーザのみrootユーザになることができる運用rootユーザ
rootユーザはシステムの変更やプログラムのインストール、ユーザ作成などが行える(利用制限のないユーザ)です。
su コマンド
別ユーザでログインしているユーザが、一時的に他のユーザになる為のコマンド。
ユーザを指定しない場合はrootユーザでシェルを起動する。オプションなしで実行した場合、カレントディレクトリを変更しないでログインします。
rootの帆無ディレクトリに変更したい場合は、以下のように実行する
+su -
+su -root
su コマンドを利用することでrootユーザで作業を開始した時間などが履歴に残るため、管理面を考える
sudoコマンド
sudoコマンドを利用することで、rootユーザでコマンドを実行することができる。
su コマンドはユーザを切り替えるが、sudoコマンドは切り替えることなく実行が可能。sudo コマンド
オプション 説明 -u [ユーザ名] 指定したユーザでコマンドを実行 用途別
一般ユーザにsudo権限を付与
以下の方法で、特定のユーザをwheelグループに追加し、sudoコマンドを実行時にPWの入力を不要とする。
su # rootに変更 usermod -G wheel <username> # wheelグループに<username>を追加 vigr # wheelグループにユーザが追加されているか確認 visudo # wheelグループを有効に変更(%wheel ALL=(ALL) NOPASSWD: ALL)アクセス権
ユーザとグループを変更する場合は、rootユーザで実行する必要がある。
ファイルは以下の3つの権限レベルが存在する
- ファイルを所有するユーザ
- ファイル所有グループからファイル所有者を除いたユーザ
- その他のユーザ
権限レベルごとに 読み・書き・実行の権限が存在する
それぞれの権限を確認するには以下のコマンドを実行する
ls -l #d rwxrwxrwx <所有者><所有グループ><バイトサイズ><更新日><ファイル名> # ユーザ , グループ, その他
項目 説明 r 読み込み w 書き込み x 実行またはディレクトリの移動 8進数表記は、付与したい権限を合計する
項目 数値 r 4 w 2 x 1 chmod :アクセス権の変更
chmod モード[, モード]... ディレクトリ/ファイル chmod 8進数表記のモード ディレクトリ/ファイルchown :所有者の変更
chown ユーザ[. グループ] ディレクトリorファイル
オプション 説明 -R ディレクトリの中のファイルも再帰的に変更する chgrp :所有グループの変更
chgrp グループ ディレクトリ
オプション 説明 -R ディレクトリの中のファイルも再帰的に変更する 特殊な属性(setuid, setgid, sticky)
setuid/setgid 付与されていると所有者/所有グループの権限で実行される
例) 一般ユーザがrootユーザ所有のsetuidがセットされたプログラムを実行
→ rootユーザが実行した場合と同じ動作になるstickyが付与されたディレクトリ内のファイルは所有者以外削除できなくなる
一般的には/tempディレクトリに付与される作成時のデフォルト
CentS7は/etc/login.defsに記載されている
umaskを利用することで、デフォルトのモードから変更してファイルを作成出来る
umask [8進数のモードのマスク値]
- 投稿日:2021-03-14T13:40:12+09:00
サーバの負荷状況をuptimeで確認しログファイルに出力する 〜Linux シェルスクリプト〜
初めましてshoです。
シェルスクリプトの学習、練習メモです。
内容「サーバの負荷状況をuptimeで確認しログファイルに出力する」
ー詳細
uptimeの出力結果をログファイルに5秒おき3回出力する
実行毎に前回の実行結果を削除して最新の実行結果を出力する(※学習記録やメモ書き目的で始めました。ほぼ初学者レベルなので理解が浅いところや誤りがあるかと思いますがよろしくお願いします。またアドバイス等コメントいただけるとすっごく嬉しいです。)
uptimeコマンド
uptimeは稼働時間を調べるコマンド
スクリプト
ログファイル uptime.log を作成してその中へ出力
#!/bin/sh : > /var/log/uptime.log # :(ヌルコマンド)で前回の出力を空にしてます for i in 0 5 5;do (sleep ${i}; uptime >> /var/log/uptime.log ) done実行結果
uptime.logファイル確認
(※コマンド実行時の表示はなし)1 00:06:17 up 10:18, 4 users, load average: 0.00, 0.01, 0.05 2 00:06:22 up 10:18, 4 users, load average: 0.00, 0.01, 0.05 3 00:06:27 up 10:18, 4 users, load average: 0.00, 0.01, 0.05以上です!
参照サイト
- 投稿日:2021-03-14T12:14:13+09:00
ユーザーアカウント(/etc/paswd)のカラム1を取得する 〜Linux シェルスクリプト〜
初めましてshoです。
シェルスクリプトの学習、練習メモです。内容「ユーザーアカウント(/etc/paswd)のカラム1を取得する」
カラムの1だけ表示させます。(※学習記録やメモ書き目的で始めました。ほぼ初学者レベルなので理解が浅いところや誤りがあるかと思いますがよろしくお願いします。またアドバイス等コメントいただけるとすっごく嬉しいです。)
cutコマンド
cutはテキストファイルを横方向に分割して、必要な項目を抜き出せるコマンド。
使用オプション
-d → 区切り文字を指定
-f → 必要な項目を項目数で指定スクリプト
#!/bin/sh cut -d: -f1 /etc/passwd実行結果
root bin daemon adm lp sync shutdown halt mail operator games ftp nobody systemd-network dbus polkitd sshd postfix chrony penguin1 guest1 guest2 apache mysqlシェルスクリプトというかコマンド練習ですね。
以上です!!
参照サイト
- 投稿日:2021-03-14T11:36:04+09:00
1〜100の和を表示させる 〜Linux シェルスクリプト〜
初めましてshoです。
シェルスクリプトの学習メモです。
内容「1〜100の和を表示させる」
基礎中な基礎ですね。
(※学習記録やメモ書き目的で始めました。ほぼ初学者レベルなので理解が浅いところや誤りがあるかと思いますがよろしくお願いします。またアドバイス等コメントいただけるとすっごく嬉しいです。早く先輩方のお力になれるよう精進します。)
スクリプト
#!/bin/sh result=0 for (( i = 1; i <= 100; i++ )){ (( result += i )) } echo "$result"実行結果
5050ちなみに
echo "$result"の位置を{ }内に入れると(( result += i )) の処理結果がその都度表示される
#!/bin/sh result=0 for (( i = 1; i <= 100; i++ )){ (( result += i )) echo "$result" }実行結果
1 3 6 10 ・ ・ ・ (省略) ・ ・ ・ 4753 4950 5050以上!!
- 投稿日:2021-03-14T01:22:58+09:00
ディレクトリの中身を全て他のディレクトリにコピーする
タイトルに関して、思い返したらやってみたことがなかったのでまとめておきます。
行ったこと
cp
コマンドでワイルドカード*
を使って$ cp コピー元ディレクトリ/* コピー先ディレクトリ
で、コピー元にあるファイルすべてをコピーしました。$ ls test_get.php $ cp /var/www/html/workspace/* . $ ls func_nl2br.php hello.php phpinfo.php test_action.php test_form.php test_get.phpここでは
/var/www/html/workspace/
以下のfunc_nl2br.php hello.php phpinfo.php test_action.php test_form.php
をカレントディレクトリにコピーしました。実験
ワイルドカードとして
*
が存在することは知っていましたが、?
を使うことで任意の1文字を表すとのことです(*
は任意の0文字)。ということで、実際に使ってみました。
$ ls * func_nl2br.php hello.php phpinfo.php test_action.php test_form.php test_get.php $ ls *.php func_nl2br.php hello.php phpinfo.php test_action.php test_form.php test_get.php $ ls *f?.php phpinfo.php $ ls *f? ls: *f? にアクセスできません: そのようなファイルやディレクトリはありません2番目の
*.php
にマッチするのはカレントディレクトリ内すべてのファイルなのでls *
と同結果となりました。
ls *f?.php
では、〇〇(0文字以上)f○(1文字).php
に該当するファイルを調べるため、phpinfo.php
が表示されました。
ls *f?
では、〇〇...〇〇f○
で終わるファイルを調べているので、当然そのようなファイルはありませんと表示されました。参考
最後のサイトでも述べられていましたが、ワイルドカードを展開する際思わぬ事態を引き起こすことがあるそうなので、扱いは特に気をつけたいです。