20210314のLinuxに関する記事は12件です。

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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 アカウントを作成する 必要である。登録時にクレジット/デビットカード番号が求められるが、サポートプランでベーシックプランを選択すれば無料でも使用できる。

image.png

AWS をはじめてみよう

AWS は、マネージメントコンソールを用いることで Web ブラウザの GUI で利用・操作することができる。マネージメントコンソールを開くと、利用可能なサービスの一覧を確認できる。

スクリーンショット 2021-03-14 15.28.02.png

今回は、サーバーに必要なもの(OS やソフトウェアなど)を一式でレンタルすることができる Amazon Elastic Compute Cloud (Amazon EC2) を上記の一覧から選択して、仮想サーバーを構築してみよう。

EC2 を用いた仮想サーバー構築

マネージメントコンソールからEC2 を選択すると、EC2 ダッシュボードが表示される。EC2 では、AWS クラウドに作る仮想サーバーをインスタンスという。インスタンスには「設計図をもとに作成されたもの」という意味があり、EC2 にも仮想サーバーの設計図(仮想イメージ)が用意されている。ここでは仮想イメージからインスタンスを作成する手順を紹介する。

スクリーンショット 2021-03-14 15.36.17.png

STEP1: Amazon マシンイメージ(AMI)を選択する

EC2 ダッシュボードで「インスタンスを起動」を選択すると、仮想イメージの一覧を確認できる。

スクリーンショット 2021-03-14 15.45.44.png

EC2 では仮想イメージのことを Amazon マシンイメージ(AMI) という。同じ AMI から作成されたインスタンスは、設定が全て同じの仮想サーバーである。今回は linux 仮想サーバーを構築するために Amazon Linux 2 AMI (HVM), SSD Volume Type を選択してみよう。

STEP2: インスタンスタイプを選択する

次の画面ではインスタンスの性能が一覧で表示される。ここではインスタンスの CPU やメモリなどを選択できる。性能によって料金体系も異なるが、今回は無料で使用できる t2.micro を選択して、「確認と作成」ボタンをクリックしよう。

スクリーンショット 2021-03-14 16.06.34.png

STEP7: インスタンスタイプを作成する

次の画面で「起動」ボタンを押すとインスタンスが作成される。なお STEP3~STEP6 の各種設定は、インスタンス作成後でも可能である。

スクリーンショット 2021-03-14 16.05.15.png

キーペアの作成

インスタンス作成時にキーペアに関するポップアップが表示される。キーペアはインスタンス接続時の認証に必要な鍵である。ローカルサーバーからの接続にも必要なため、ここで新しいキーペアを作成してくおくとよい。キーペアに適当な名前をつけてダウンロードしておこう。

スクリーンショット 2021-03-14 16.29.14.png

キーペアとはログイン認証時の公開鍵と秘密鍵のペアであり、ここでダウンロードされるのは秘密鍵である。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-----

インスタンス作成中

インスタンス作成中は次の画面が表示される。右下の「インスタンスの表示」ボタンを押すとインスタンスの状態を確認できる。
スクリーンショット 2021-03-14 16.30.43.png
次の画面で、ステータスチェックが「初期化しています」から「2/2 のチェックに合格しました」に変わるとインスタンスが作成される。
スクリーンショット 2021-03-14 16.33.40.png

SSH 接続

SSH(Secure Shell) とは、ネットワークに接続された機器(今回はインスタンス)を遠隔操作し、管理するための手段をさす。ここでは MacBook から Amazon EC2 に SSH 接続する方法を紹介する。
まずは、接続先の EC2 インスタンスにチェックを入れて接続ボタンを押してみよう。
スクリーンショット 2021-03-14 17.57.04.png

次の画面で「SSH クライアント」タブを開くと、SSH 接続手順が説明されている。

STEP1: SSH クライアントを開く

Mac に標準搭載されているターミナルを SSH クライアントソフトとして使用する。Windows の場合はこちらの動画で詳しく解説されている。

スクリーンショット 2021-03-14 17.58.57.png

STEP2: プライベートキーファイルを見つける

プライベートキーファイルとはキーペアのうちの秘密鍵をさす。今回は先ほどダウンロードした Demo2021.pem を使用する。ユーザーのホームディレクトリに .ssh フォルダを作成し、新規フォルダに pem ファイルを移動してもよい。

ターミナル
mkdir ~/.ssh
mv Demo2021.pem ~/.ssh
cd ~/.ssh

STEP3: 必要に応じてキーが公開されていないことを確認する

chmod コマンドでキーファイルの権限を設定する。

ターミナル
chmod 400 Demo2021.pem

STEP4: プライベートキーファイルを見つける

次のコマンドを実行すると 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 update

Python 3 のダウンロード

次のコマンドで Python3 をダウンロードする。(参考

ターミナル
[ec2-user@ip-172-31-0-200 ~]$ sudo yum install python3 -y

Docker のダウンロード

次のコマンドで Docker をダウンロードする。(参考

ターミナル
[ec2-user@ip-172-31-0-200 ~]$ sudo amazon-linux-extras install docker

SSH 接続の終了

ターミナルで logout と実行する。

参考図書

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

【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 アカウントを作成する 必要である。登録時にクレジット/デビットカード番号が求められるが、サポートプランでベーシックプランを選択すれば無料でも使用できる。

image.png

AWS をはじめてみよう

AWS は、マネージメントコンソールを用いることで Web ブラウザの GUI で利用・操作することができる。マネージメントコンソールを開くと、利用可能なサービスの一覧を確認できる。

スクリーンショット 2021-03-14 15.28.02.png

今回は、サーバーに必要なもの(OS やソフトウェアなど)を一式でレンタルすることができる Amazon Elastic Compute Cloud (Amazon EC2) を上記の一覧から選択して、仮想サーバーを構築してみよう。

EC2 を用いた仮想サーバー構築

マネージメントコンソールからEC2 を選択すると、EC2 ダッシュボードが表示される。EC2 では、AWS クラウドに作る仮想サーバーをインスタンスという。インスタンスには「設計図をもとに作成されたもの」という意味があり、EC2 にも仮想サーバーの設計図(仮想イメージ)が用意されている。ここでは仮想イメージからインスタンスを作成する手順を紹介する。

スクリーンショット 2021-03-14 15.36.17.png

STEP1: Amazon マシンイメージ(AMI)を選択する

EC2 ダッシュボードで「インスタンスを起動」を選択すると、仮想イメージの一覧を確認できる。

スクリーンショット 2021-03-14 15.45.44.png

EC2 では仮想イメージのことを Amazon マシンイメージ(AMI) という。同じ AMI から作成されたインスタンスは、設定が全て同じの仮想サーバーである。今回は linux 仮想サーバーを構築するために Amazon Linux 2 AMI (HVM), SSD Volume Type を選択してみよう。

STEP2: インスタンスタイプを選択する

次の画面ではインスタンスの性能が一覧で表示される。ここではインスタンスの CPU やメモリなどを選択できる。性能によって料金体系も異なるが、今回は無料で使用できる t2.micro を選択して、「確認と作成」ボタンをクリックしよう。

スクリーンショット 2021-03-14 16.06.34.png

STEP7: インスタンスタイプを作成する

次の画面で「起動」ボタンを押すとインスタンスが作成される。なお STEP3~STEP6 の各種設定は、インスタンス作成後でも可能である。

スクリーンショット 2021-03-14 16.05.15.png

キーペアの作成

インスタンス作成時にキーペアに関するポップアップが表示される。キーペアはインスタンス接続時の認証に必要な鍵である。ローカルサーバーからの接続にも必要なため、ここで新しいキーペアを作成してくおくとよい。キーペアに適当な名前をつけてダウンロードしておこう。

スクリーンショット 2021-03-14 16.29.14.png

キーペアとはログイン認証時の公開鍵と秘密鍵のペアであり、ここでダウンロードされるのは秘密鍵である。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-----

インスタンス作成中

インスタンス作成中は次の画面が表示される。右下の「インスタンスの表示」ボタンを押すとインスタンスの状態を確認できる。
スクリーンショット 2021-03-14 16.30.43.png
次の画面で、ステータスチェックが「初期化しています」から「2/2 のチェックに合格しました」に変わるとインスタンスが作成される。
スクリーンショット 2021-03-14 16.33.40.png

SSH 接続

SSH(Secure Shell) とは、ネットワークに接続された機器(今回はインスタンス)を遠隔操作し、管理するための手段をさす。ここでは MacBook から Amazon EC2 に SSH 接続する方法を紹介する。
まずは、接続先の EC2 インスタンスにチェックを入れて接続ボタンを押してみよう。
スクリーンショット 2021-03-14 17.57.04.png

次の画面で「SSH クライアント」タブを開くと、SSH 接続手順が説明されている。

STEP1: SSH クライアントを開く

Mac に標準搭載されているターミナルを SSH クライアントソフトとして使用する。Windows の場合はこちらの動画で詳しく解説されている。

スクリーンショット 2021-03-14 17.58.57.png

STEP2: プライベートキーファイルを見つける

プライベートキーファイルとはキーペアのうちの秘密鍵をさす。今回は先ほどダウンロードした Demo2021.pem を使用する。ユーザーのホームディレクトリに .ssh フォルダを作成し、新規フォルダに pem ファイルを移動してもよい。

ターミナル
mkdir ~/.ssh
mv Demo2021.pem ~/.ssh
cd ~/.ssh

STEP3: 必要に応じてキーが公開されていないことを確認する

chmod コマンドでキーファイルの権限を設定する。

ターミナル
chmod 400 Demo2021.pem

STEP4: プライベートキーファイルを見つける

次のコマンドを実行すると 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 update

Python 3 のダウンロード

次のコマンドで Python3 をダウンロードする。(参考

ターミナル
[ec2-user@ip-172-31-0-200 ~]$ sudo yum install python3 -y

Docker のダウンロード

次のコマンドで Docker をダウンロードする。(参考

ターミナル
[ec2-user@ip-172-31-0-200 ~]$ sudo amazon-linux-extras install docker

SSH 接続の終了

ターミナルで logout と実行する。

参考図書

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

hostname 変更あれこれ

はじめに

変更方法はいろいろあるみたい

/etc/hostnameによる変更

$ hostname
ubuntu20
$ vim hostname

- ubuntu20
+ linux

$ sudo systemctl restart systemd-hostnamed
$ hostname
linux
$ sudo shutdown -r now
 .
 .
 .
$ hostname
linux

hostnameコマンドによる変更(再起動でもとに戻る)

$ hostname
ubuntu20
$ sudo hostname linux
$ hostname
linux
$ cat /etc/hostname
ubuntu20
$ sudo shutdown -r now
 .
 .
 .
$ hostname
ubuntu20

hostnamectlによる変更

$ hostname
ubuntu20
$ sudo hostnamectl set-hostname linux
$ hostname
linux
$ cat /etc/hostname
linux
$ sudo shutdown -r now
 .
 .
 .
$ hostname
linux

nmcliによる変更

$ hostname
ubuntu20
$ sudo nmcli gen hostname linux
$ hostname
linux
$ cat /etc/hostname
linux
$ sudo shutdown -r now
 .
 .
 .
$ hostname
linux

nmtuiによる設定

$ hostname
ubuntu20
$ sudo nmtui

"Set system hostname" を選択

image.png

host名を入力

image.png

OK

image.png

$ hostname
linux
$ cat /etc/hostname
linux
$ sudo shutdown -r now
 .
 .
 .
$ hostname
linux
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【シェルスクリプト】ファイルを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」と覚えると良いでしょう。

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

Linux覚え書きユーザ管理

概要

Linux学習で覚えたコマンドや知識をメモする記事です。
コマンドはLinux覚え書きコマンド集にまとめています

ユーザ管理

グループとユーザを適切に管理することで、ファイルやプログラムなどを必要なユーザのみ参照・編集する権限を与えることが出来ます。
グループやユーザの編集を行う場合は、管理者であるrootユーザで実行する必要があります。

# で始まる場合はroot権限
$ で始まる場合は一般ユーザ

ユーザ

ユーザは/etc/passwdに定義されている。基本はコマンドで編集する。

パスワードファイルの内容

/etc/passwd
account: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/group
group_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進数のモードのマスク値]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

サーバの負荷状況を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

以上です!

参照サイト

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

ユーザーアカウント(/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

シェルスクリプトというかコマンド練習ですね。

以上です!!

参照サイト

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

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

以上!!

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

ディレクトリの中身を全て他のディレクトリにコピーする

タイトルに関して、思い返したらやってみたことがなかったのでまとめておきます。

行ったこと

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○で終わるファイルを調べているので、当然そのようなファイルはありませんと表示されました。

参考

最後のサイトでも述べられていましたが、ワイルドカードを展開する際思わぬ事態を引き起こすことがあるそうなので、扱いは特に気をつけたいです。

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